1. 背景
团队开发项目遇到的问题:
- 版本更新较为频繁的问题。
- 测试覆盖不到位的问题。
2. Jenkins和Gitlab CI的简单比较
Jenkins是老牌持续集成开源平台:
- 优点:现在已经发展到2.0,各种功能插件非常丰富,支持groovy编写脚本,尤其支持LDAP等与企业集成的功能,基本上是CI的不二之选。
- 缺点:界面丑陋,配置相对复杂,一般需要专门的IT运维人员维护,与代码管理平台结合度相对较低,对Docker支持需要安装额外的插件。
Gitlab CI,新锐CI平台:
- 优点:界面美观,原生支持docker及多种机制,与代码管理工具结合度非常高,配置简单,使用YAML语言,程序员即可编写自动编译脚本。
- 缺点:控制性不够好,生态还不够齐全,YAML有一定的局限性,复杂任务需要些shell完成。
Jenkins适合复杂集成任务,而Gitlab CI适合相对简单的持续集成。
企业中一般会2个同时使用,而两者的分工可以为:
- develop环境,直接使用Gitlab CI做持续的编译、测试、开发环境部署、API测试、客户端打包等工作
- staging和production环境,使用Gitlab CI+Jenkins辅助配合的方式,或者直接由jenkins全包,因为上线会涉及到不同版本的资源更改、根据参数调整编译和打包等相对复杂的任务,这时Gitlab CI就会相形见肘了,虽然可以自己写Shell来支持,但控制性(如鸡肋的trigger)差强人意
3. 项目中的使用
项目中会使用J2EE, 大致阶段分为:代码检视、编译、测试、打包、部署。
dev环境,均使用Gitlab CI,比较简单,可以直接查询Gitlab CI文档,如果用过Travis CI,对于Gitlab CI就更不会有问题了。
staging和production环境,选用Gitlab CI+Jenkins混合的模式,具体阶段分工为:
- Gitlab CI负责:代码检视、编译、打包、测试
- Jenkins负责:打包(主要是资源替换)、部署
在gitlab中完成持续集成CI包括两个操作:
- 配置一个Runner(用来编译、测试、打包的服务器节点)。
- 在项目根目录增加YAML格式的CI脚本文件
.gitlab-ci.yml
。
3.1 install configue gitlab-ci-multi-runner
GitLab 部署 CI 的第一步就是安装 gitlab-ci-multi-runner,你可以把它理解为:跑 CI 的服务。
将一台mac计算机配置成我们的一个Runner,基本原理就是在Mac上安装一个代理程序gitlab-ci-multi-runner,然后将mac注册到gitlab服务器端,然后这台mac机器就能接收到gitlab服务器下发的CI任务,完成相应的编译、测试、打包等工作,然后将结果反馈给gitlab服务器。
在一台Mac机器上执行如下命令安装gitlab-ci-multi-runner:
|
|
- 进入项目的Runner配置页面,如下图所示:
- 在Mac机器上执行如下命令,将这台Mac注册到gitlab并绑定到我们示例项目。
|
|
现在我们的Mac机器就注册为一个Runner了,查看项目的Runner页面,如下图所示:
我们的Runner就成功注册上了。接下来就可以编写CI的脚本了。
- 增加CI脚本文件
.gitlab-ci.yml
在项目根目录创建.gitlab-ci.yml
文件,内容如下:
|
|
before_script
部分将在每一个job前被执行。每个job包含的参数,例如script
(shell script)、tags
(只有运行这个tag/tags才允许选择这个构建),以及only
或except
参数来定义允许运行构建的分支名称。only
部分优先于 “except”。参见:Configuration of your builds with .gitlab-ci.yml