一、现状
在目前的软件开发和发布中,已经形成了一套标准的流程。即持续集成、持续交付和持续部署。
这也称为CICD的过程,目前要解决的问题是如何在CICD中使用容器来完成。
1.持续集成
持续集成指的是频繁的将代码集成到主干,这有两个好处:1是保持主干的不断更新,防止后期大规模集成的难度。2是可以快速发现错误,定位错误。
2.持续交付
持续交付是持续集成的下一步,即不管怎么更新,项目是随时随地可以交付的。
3.持续部署
在持续交付之后,通过持续部署可以将代码自动的部署到生产环境。
持续部署的目标是代码在任何时刻都是可部署的,可以进入生产阶段。
4.容器化
在Devops和大规模集群管理方面,容器化是必须要介入的。
docker、docker compose、Kubernetes等将会作为容器化工具。
二、容器化CI实现方案
1.容器化CI方案
2.关键步骤
1) 基于Docker安装Gitlab-runner
2)为gitlab的组或是项目注册Runner
docker exec -it gitlab-runner gitlab-runner register
# 在gitlab的组或项目中的设置-cicd-runner或获取:GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.17.200/
# 输入 GitLab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh
# 输入 Runner 的说明
Please enter the gitlab-ci description for this runner:
可以为空
# 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
# 这里选择 true ,可以用于代码上传后直接执行
Whether to run untagged builds [true/false]:
true
# 这里选择 false,可以直接回车,默认为 false
Whether to lock Runner to current project [true/false]:
false
# 选择 runner 执行器,选择的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
3)在项目工程中编写.gitlab-ci.yml文件
stages:
- build
- push
- run
- clean
build:
stage: build
only:
- develop
- master
script:
- /usr/local/maven/apache-maven-3.6.3/bin/mvn clean package
- cp target/my-cicd-demo-1.0.0-SNAPSHOT.jar docker
- cd docker
- docker build -t my-cicd-demo:v1.0.0 .
- docker tag my-cicd-demo:v1.0.0 192.168.17.200:5000/my-cicd-demo:v1.0.0
push:
stage: push
only:
- develop
- master
script:
- docker push 192.168.17.200:5000/my-cicd-demo:v1.0.0
run:
stage: run
only:
- develop
- master
script:
- cd docker
- docker-compose down
- docker-compose up -d
clean:
stage: clean
only:
- develop
- master
script:
- docker image prune -f
上面的配置把一次流水线分成了四个作业:
a. build: 构建,用gitlab runner中安装的maven 打包项目,进入项目的docker文件夹,使用Dockerfile构建镜像。并为镜像打标。
Dockerfile文件如下:
FROM openjdk:8-jre
RUN mkdir /app
COPY my-cicd-demo-1.0.0-SNAPSHOT.jar /app/app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
EXPOSE 8080
b. push: 将镜像推送到镜像私服中。
c. run: 用docker运行镜像,实际运行的是项目中的docker-compose.yml
docker-compose.yml:
version: '3.1'
services:
my-cicd-demo:
image: 192.168.17.200:5000/my-cicd-demo:v1.0.0
container_name: my-cicd-demo
ports:
- 9009:8080
d. clean: 清除虚悬镜像
注意: 设置 Job.only 后,只有当 develop 分支和 master 分支有提交的时候才会触发相关的 Jobs。
3.测试集成效果
所有操作完成后push代码到gitlab,查看流水线中的各项作业是否成功。
成功后查看镜像私服,镜像是否已上传;查看开发服务器,容器已正常运行。
三、容器化CD实现方案
1.容器化CD方案
2.关键步骤
1)jenkins所需插件:
· publish over ssh
· choice parameters
· Maven Integration
2)配置jenkins到gitlab的免密登陆
3)在jenkins中配置publish over ssh
这一步的目的是jenkins能将文件推送到目标服务器的/usr/local/jenkins路径下。
4)在jenkins中创建maven任务
5)第一次构建只做代码拉取
6)正式构建时添加参数化构建
使用groovy脚本拉取gitlab上最新tag
groovy脚本:
def ver_keys = [ 'bash', '-c', 'cd /var/lib/jenkins/workspace/my-cicd-demo;git pull>/dev/null; git remote prune origin >/dev/null; git tag -l|sort -r |head -10 ' ]
ver_keys.execute().text.tokenize('\n')
7)添加构建步骤
拉取最新脚本代码,并用maven打包
shell:
echo $RELEASE_VERSION
cd /var/lib/jenkins/workspace/my-cicd-demo
git checkout $RELEASE_VERSION
git pull origin $RELEASE_VERSION
mvn clean package
8)添加ssh publisher执行脚本
该步骤将jenkins中打包出的jar包及项目中的docker文件夹传输到目标服务器,并在目标服务器上构建镜像、打标镜像、上传镜像到镜像私服、生成容器。
exec command:
cd /usr/local/jenkins/my-cicd-demo
cp target/my-cicd-demo-$RELEASE_VERSION.jar docker
cd docker
docker build -t my-cicd-demo:$RELEASE_VERSION .
docker tag my-cicd-demo:$RELEASE_VERSION 192.168.17.200:5000/my-cicd-demo:$RELEASE_VERSION
docker push 192.168.17.200:5000/my-cicd-demo:$RELEASE_VERSION
docker-compose down
docker-compose up -d
docker image prune -f
至此,容器化CD得以实现。