0
点赞
收藏
分享

微信扫一扫

06 docker-gitlab-runner CD

爱读书的歌者 2022-03-11 阅读 76
docker容器

持续部署

上一章我们弄好打了一个持续集成,和持续交付,这一章主要做持续发布,
当我们开发完成之后,提交代码,就要发布的内网进行一个测试,
接着重.gitlab-ci.yml 开始,新增一个job, 用了sshpass sshpass 用于非交互的ssh密码验证,允许使用-p参数指定明文密码 可能应为本人的开发环境经常变动,所以没有考虑使用 ssh免密的方式。

dev-job: #启动开发环境job
  stage: dev_start
  image: ictu/sshpass #需要一个上传ssh 的镜像
  tags:
    - docker #哪个执行器
  script:
    - echo dev run
    - sshpass -p $DEV1_PASSWORD ssh -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" root@192.168.100.53 "
      docker pull 192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version
      && docker stop ttbgz_test ; docker rm ttbgz_test
      ; docker run -d -p 9001:9001 --name ttbgz_test  192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version"
      # &&表示前面执行成功后执行后面的命令,||表示执行失败了执行后面的命令;“;”表示依次执行两条命令

ps:DEV1_PASSWORD 是在gitlab CI/CD-变量里面配置的服务器密码,
其他没什么,注释都写的很清楚
docker run -d -p 9001:9001 --name ttbgz_test 192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version

docker run 后面的
-d 是后台运行
-p 前面是宿主机端口,后面是容器端口,即你spring boot 启动访问那个端口,Dockerfile 里面也应该暴露这个端口
--name 是给启动容器取了一个名字,我们可以根据名字来停止,删除容器,
镜像名字,和版版本号,都可以用 gitlab-ci.yml 上面定义的 变量 当然,你写死也是没有问题的,只不过遇到需要修改的时候,就要细心一点了

接上篇文章,看下.gitlab-ci.yml 全部内容


# 定义一些变量, 下面各阶段会使用
variables:
  jar_name: ttbgz_test.jar
  jdk_image: openjdk:8-jre-slim
  app_images_name: ttbgz_test
  app_images_version: v1.0.0
#定义执行顺讯
stages:
  - build  #编译
  - package #打包 image
  - deploy #推送 harbor
  - dev_start #启动


job1:
  image: maven:3.8.4-openjdk-8 #openjdk:8u322-slim-bullseye
  stage: build
  script:
    - mvn clean package -Dmaven.test.skip=true
  tags:
    - maven #哪个执行器
  artifacts:
    paths:
      - target/$jar_name
job2:
  stage: package
  image: docker:latest #依赖基础镜像 docker:git 是包含了 git 命令的 docker:latest,方便 CI 时使用 Git。
  tags:
    - docker #哪个执行器
  script:
    - echo package image
    - docker build -t $app_images_name:$app_images_version . #  构建镜像
    - docker login -u $HARBOR_USERNAME -p $HARBOR_PWD $HARBOR_URL # 登录镜像仓库
    # docker tag SOURCE_IMAGE[:TAG] 192.168.100.51:8080/ttbgz/REPOSITORY[:TAG]
    - docker tag $app_images_name:$app_images_version 192.168.100.51:8080/ttbgz/$app_images_name:$app_images_version
    - docker push 192.168.100.51:8080/ttbgz/$app_images_name:$app_images_version # 推送镜像
    - docker rmi $app_images_name:$app_images_version # 删除本地镜像
    - docker rmi 192.168.100.51:8080/ttbgz/$app_images_name:$app_images_version # 删除本地tag镜像

dev-job: #启动开发环境job
  stage: dev_start
  image: ictu/sshpass #需要一个上传ssh 的镜像
  tags:
    - docker #哪个执行器
  script:
    - echo dev run
    - sshpass -p $DEV1_PASSWORD ssh -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" root@192.168.100.53 "
      docker pull 192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version
      && docker stop ttbgz_test ; docker rm ttbgz_test
      ; docker run -d -p 9001:9001 --name ttbgz_test  192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version"
      # &&表示前面执行成功后执行后面的命令,||表示执行失败了执行后面的命令;“;”表示依次执行两条命令

配置好好启动测试一下,ruuner是在我内网 52的服务器上,需要部署到53服务器上,直接访问53的没有问题,
在这里插入图片描述
修改hell 方法,新增内容,再次启动,看到内容刷新,也没有问题。
在这里插入图片描述
在内网环境下个,可以直接拉取harbor 镜像仓库,部署很方便,如果是在生产环境,有集群或者有镜像仓库,是最好的了,当然也可能没有镜像仓库,我们又想用docker 来部署,就得我们可以使用 docker save 与 docker load 命令来完成镜像的分发。以我腾讯云服务器举列,我只有一个云服务器,代码管理,镜像,都是在本地计算机上,服务器只用来发布我的应用程序,
首先,服务器上,的安装 docker
增加生产的job stage可以指定和 dev-job 的一样的流程 产生的效果如下
在这里插入图片描述master-job 设置的手动执行,这样就可以控制决定发哪个版本,

master-job 写法

master-job: #启动开发环境打包
  stage: start
  image: ictu/sshpass #需要一个上传ssh 的镜像
  tags:
    - docker #哪个执行器
  script:
    - echo master package run
    - sshpass -p $MASTER1_PASSWORD scp -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" $mater_img_tar_name root@$SERVER_IP:/root/spring_boot
    - sshpass -p $MASTER1_PASSWORD ssh -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" root@$SERVER_IP "
     docker rmi $app_images_name:app_images_version ;
     gzip -dc /root/spring_boot/$mater_img_tar_name | docker load &&
     docker stop ttbgz_test ; docker rm ttbgz_test ;
     docker run -d -p 9001:9001 --name ttbgz_test $app_images_name:$app_images_version
      "
  when: manual  #手动执行
  only:
    - master # master  版本可见

下面是整个.gitlab-ci.yml 的样子 提供参考
ps :job2 :增加了一个 #打包压缩一个镜像 并且把 镜像传递给下一个节点了。

#before_script:
#  - rm -rf /root/.m2/settings.xml
#  - echo -e "<?xml version=\""1.0\"" encoding=\""UTF-8\""?><settings xmlns=\""http://maven.apache.org/SETTINGS/1.0.0\"" xmlns:xsi=\""http://www.w3.org/2001/XMLSchema-instance\"" xsi:schemaLocation=\""http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd\""><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors></settings>" > /root/.m2/settings.xml

# 定义一些变量, 下面各阶段会使用
variables:
  jar_name: ttbgz_test.jar
  jdk_image: openjdk:8-jre-slim
  app_images_name: ttbgz_test
  app_images_version: v1.0.0
  mater_img_tar_name: img_ttbgz_test.tar.gz #分发到生产上的tar名字
#定义执行顺讯
stages:
  - build  #编译
  - package #打包 image
  - deploy #推送 harbor
  - start #启动

job1:
  image: maven:3.8.4-openjdk-8 #openjdk:8u322-slim-bullseye
  stage: build
  script:
    - mvn clean package -Dmaven.test.skip=true
  tags:
    - maven #哪个执行器
  artifacts:
    paths:
      - target/$jar_name
job2:
  stage: package
  image: docker:latest #依赖基础镜像 docker:git 是包含了 git 命令的 docker:latest,方便 CI 时使用 Git。
  tags:
    - docker #哪个执行器
  script:
    - echo package image
    - docker build -t $app_images_name:$app_images_version . #  构建镜像
    - docker save $app_images_name:$app_images_version | gzip > $mater_img_tar_name #打包压缩一个镜像
    - docker login -u $HARBOR_USERNAME -p $HARBOR_PWD $HARBOR_URL # 登录镜像仓库
    # docker tag SOURCE_IMAGE[:TAG] 192.168.100.51:8080/ttbgz/REPOSITORY[:TAG]
    - docker tag $app_images_name:$app_images_version 192.168.100.51:8080/ttbgz/$app_images_name:$app_images_version
    - docker push 192.168.100.51:8080/ttbgz/$app_images_name:$app_images_version # 推送镜像
    - docker rmi $app_images_name:$app_images_version # 删除本地镜像
    - docker rmi 192.168.100.51:8080/ttbgz/$app_images_name:$app_images_version # 删除本地tag镜像
  artifacts:
    paths:
      - $mater_img_tar_name
dev-job: #启动开发环境job
  stage: start
  image: ictu/sshpass #需要一个上传ssh 的镜像
  tags:
    - docker #哪个执行器
  script:
    - echo dev run
    - sshpass -p $DEV1_PASSWORD ssh -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" root@192.168.100.53 "
      docker pull 192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version
      && docker stop ttbgz_test ; docker rm ttbgz_test
      ; docker run -d -p 9001:9001 --name ttbgz_test  192.168.100.51:8080/ttbgz/ttbgz_test:$app_images_version"
      # &&表示前面执行成功后执行后面的命令,||表示执行失败了执行后面的命令;“;”表示依次执行两条命令

master-job: #启动开发环境打包
  stage: start
  image: ictu/sshpass #需要一个上传ssh 的镜像
  tags:
    - docker #哪个执行器
  script:
    - echo master package run
    - sshpass -p $MASTER1_PASSWORD scp -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" $mater_img_tar_name root@$SERVER_IP:/root/spring_boot
    - sshpass -p $MASTER1_PASSWORD ssh -o UserKnownHostsFile=/dev/null -o "StrictHostKeyChecking no" root@$SERVER_IP "
     docker rmi $app_images_name:app_images_version ;
     gzip -dc /root/spring_boot/$mater_img_tar_name | docker load &&
     docker stop ttbgz_test ; docker rm ttbgz_test ;
     docker run -d -p 9001:9001 --name ttbgz_test $app_images_name:$app_images_version
      "
  when: manual  #手动执行
  only:
    - master # master  版本可见
举报

相关推荐

0 条评论