前言
CI/CD (持续集成、持续部署、持续交付) 的概念就不必多说了,来说说公司CI/CD 构建的架构吧。
我司在项目上线前,需要经过 QA 环境、Mirror(生产镜像环境)的测试,最后再部署到线上的正式环境。
开发人员需要不停的提交代码到QA环境上,经由测试人员测试,最后再部署到生产镜像环境,这一系列测试流程我司是使用 GitLab-runner 实现的。
最后部署到生产环境使用的是 Jenkins。
要说起来GitLab-runner到底是个什么,其实也无外乎和Jenkins是一类构建工具,只不过为什么生产环境使用 Jenkins 而测试环境使用 GitLab-runner 构建呢?我司技术主管回答是因为测试环境不用配置的特别复杂,而GitLab-runner就是特别的轻量而已,因此也便使用了它罢了。
简要架构图如下所示

我们每个项目都会拥有这样一个配置文件用于触发构建执行命令
文件: .gitlab-ci.yml
stages:
- build
- deploy
- on_success
- on_failer
before_script:
- git version
- go version
- go env -w GO111MODULE=on
- go env -w GOPROXY="https://goproxy.io,direct"
## 定义项目全局变量
variables:
PROJECT_NAME: "xgo"
build:
before_script:
- echo "开始对 $PROJECT_NAME 持续集成 build"
- mailer -c /root/mailer.toml -bodyPath /root/build.html -template {{PROJECT_NAME}}=$PROJECT_NAME,{{STATUS}}=开始构建
after_script:
- echo "$PROJECT_NAME 持续集成 build 结束"
- mailer -c /root/mailer.toml -bodyPath /root/build.html -template {{PROJECT_NAME}}=$PROJECT_NAME,{{STATUS}}=构建结束
stage: build
script:
- go build -o $PROJECT_NAME
only:
- master
artifacts:
paths:
- xgo
tags:
- server-runner
deploy:
stage: deploy
script:
- echo "开始对 $PROJECT_NAME 进行部署 deploy"
# 将构建的文件拷贝至生产组
- ansible product -m copy -a "src=./$PROJECT_NAME dest=/$PROJECT_NAME owner=root group=root mode=755"
- ansible product -m shell -a "supervisorctl restart $PROJECT_NAME"
only:
- master
tags:
- server-runner
# 当且仅仅由于持续集成失败才触发
on_failer:
stage: on_failer
script:
- echo " $PROJECT_NAME 持续集成失败"
- mailer -c /root/mailer.toml -bodyPath /root/deploy.html -template {{PROJECT_NAME}}=$PROJECT_NAME,{{STATUS}}=部署失败
tags:
- server-runner
when: on_failure
# 当且仅当成功时会触发
on_success:
stage: on_success
script:
- echo "$PROJECT_NAME 持续集成 成功"
- mailer -c /root/mailer.toml -bodyPath /root/deploy.html -template {{PROJECT_NAME}}=$PROJECT_NAME,{{STATUS}}=部署成功
tags:
- server-runner
when: on_success
这里特别要介绍一下自动运维工具 ansible
当持续部署流程时,我们需要将构建好的二进制程序发布到多台服务器,, ansible 是一个多服务器同步执行命令的工具。他可以定义好几个服务器组,并通过格式
ansible 服务器组 -m shell -a "shell 命令"
例如下所示,对所有生产环境组的服务器进行重启服务:
ansible product -m shell -a "supervisorctl restart $PROJECT_NAME"
定义服务器组也非常方便,他只需要再一个配置文件中定义受控服务器的基本信息即可。
如下所示

总结
我司一套CI/CD使用工具如下
GitLab、GitLab-Runner、ansible、supervisor、Jenkins(没有可以)
相关使用请自行查阅资料
参考文献:
https://www.shuzhiduo.com/A/E35pxvGB5v/
https://www.jianshu.com/p/0b9054b33db3
http://www.topgoer.com/beego%E6%A1%86%E6%9E%B6/%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2/supervisor%E9%83%A8%E7%BD%B2.html
https://www.jianshu.com/p/82b4e9162590
https://ansible-tran.readthedocs.io/en/latest/docs/intro.html
https://ansible-tran.readthedocs.io/en/latest/docs/intro.html
文章评论(0)