最近有时间搞cicd,查阅各种文档,基于我所在公司的代码管理和发布流程,总结出一套CICD最佳实践。
我们的项目有三个分支:
master:生产分支,生产环境使用的分支
uat:测试分支,测试环境使用的分支
dev:开发分支,人少的话开发人员可直接在此分支上开发,也可基于此分支创建各自的分支,功能开发完合并再到dev分支
我们的工作流:
假如当前版本是1.0.0,即将发布一个新版本1.0.1。
1、开发人员在deb分支上开发,开发完1.0.1的功能后上传各自代码。
2、由负责人确认大家都提交了最新代码,提交MR,将dev分支合并到uat分支。
3、代码review,确认没问题处理MR,合并分支。
4、打tag,基于uat分支打tag,自动触发CICD,将1.0.1版本功能自动部署到测试环境。
5、测试人员测试。
6、有bug,重复1、2、3步骤,删除老tag(runner所在服务器也要删除),重新打1.0.1tag(对版本号要求不是很高的话,可以递增方式增加版本号而不需要删除操作),触发CICD。
7、bug修复,测试也没问题。提交MR,将uat分支合并到master分支。
8、代码review,确认没问题处理MR,合并分支。
9、打tag,基于master分支打tag,自动触发CICD,此时需要手工介入,启动Job。
gitlab-ci.yml
stages:
- pull(uat)
- build(uat)
- restart(uat)
- pull(prod)
- restart(prod)
pull(uat):
stage: pull(uat)
tags:
- '192.168.10.21/dev'
rules: # 仅uat分支打tag时触发,runner会自动识别在哪个分支打的tag,然后拉取对应分支代码
- if: '$CI_COMMIT_TAG =~ /^uat-[0-9]+\.[0-9]+\.[0-9]+(-build)?$/'
script:
- cd /data/itom-project
- git checkout uat
- git pull
- git checkout $CI_COMMIT_TAG
allow_failure: false
build(uat): #步骤前面加.可以跳过此步骤
stage: build(uat)
tags:
- '192.168.10.21/dev'
rules:
- if: '$CI_COMMIT_TAG =~ /^uat-[0-9]+\.[0-9]+\.[0-9]+-build$/'
script:
- cd /data/itom-project/docker_files
- sh ./build.sh
allow_failure: false
restart(uat):
stage: restart(uat)
tags:
- '192.168.10.21/dev'
rules:
- if: '$CI_COMMIT_TAG =~ /^uat-[0-9]+\.[0-9]+\.[0-9]+(-build)?$/'
script:
- cd /data/itom-project
- docker-compose up -d --force-recreate
allow_failure: false
pull(prod):
stage: pull(prod)
tags:
- '114.115.152.172/prod'
rules:
- if: '$CI_COMMIT_TAG =~ /^prod-[0-9]+\.[0-9]+\.[0-9]+$/'
when: manual #人工介入部署
script:
- cd /data/itom-project
- git checkout master
- git pull
- git checkout $CI_COMMIT_TAG
allow_failure: false
restart(prod):
stage: restart(prod)
tags:
- '114.115.152.172/prod'
rules:
- if: '$CI_COMMIT_TAG =~ /^prod-[0-9]+\.[0-9]+\.[0-9]+$/'
when: manual #人工介入部署
script:
- cd /data/itom-project
- docker-compose up -d --force-recreate
allow_failure: false
关键步骤截图:
uat分支打tag:
打完tag自动触发CICD
合并uat分支到master并打tag
打完tag自动触发CICD,因为生产环境设置了人工介入执行Job,这里需要手动触发
手动触发Job:
查看结果:
应急回退方案:
在Piplines中手动开启一个Pipline,Run for选择上一个版本tag即可。
题外话:
gitlab免密克隆,完事就可以无需密码pull、push了:
git clone https://oauth2:glpat-ea17B4_1Fp3dbKh4y-wd@code.tuyoo.com/ops/itom/itom-cmdb.git
glpat-ea17B4_1Fp3dbKh4y-wd为具体项目的token(Project Access Token)
CI_PROJECT_DIR变量: runner默认会将仓库clone到CI_PROJECT_DIR目录 variables: TF_ROOT: ${CI_PROJECT_DIR}/huaweicloud/all/environments/dev