持续部署
上一章我们弄好打了一个持续集成,和持续交付,这一章主要做持续发布,
当我们开发完成之后,提交代码,就要发布的内网进行一个测试,
接着重.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 版本可见