Author:Thor
一、现状
在目前的软件开发和发布中,已经形成了一套标准的流程。即持续集成、持续交付和持续部署。
这也称为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得以实现。