Jenkins+Gitlab持续集成实践概要分享
引言
本文主要分享搭建持续集成环境的思路,及其过程中的要点、难点与解决方式,不详细介绍每个阶段的操作步骤(在百度上都可以找到)。我目前的持续集成实践仍在初步阶段,见知浅陋,文章在之后的实践与优化过程中会慢慢更新。希望帮助正在尝试进行Jenkins实践的朋友们整理思路,克服困难,找到合适的持续集成解决方案。
Jenkins环境介绍
搭建目标
- 对接Gitlab,当其操作触发构建时,自动进行编译打包、部署、功能基线测试;
- 每日定时构建,进行代码扫描,以及单元、功能、接口、性能、稳定性等测试;
- 构建环境覆盖Windows、Linux、Mac平台,测试环境覆盖Windows、Linux、Mac、Android、IOS平台;
网络结构图
主控机: 触发构建的入口,用于执行编译打包,选择测试任务,生成CI报告及邮件。通过< Parameterized Remote Trigger >插件,调用执行机的Job进行测试。可添加子节点达到负载均衡。
执行机: 运行测试任务,上传结果用于生成CI报告。覆盖目标测试策略和系统平台。通过合理配置达到负载均衡。
Jenkins环境搭建
对接Gitlab
- Gitlab上添加Jenkins所在机器的SSH公钥(SSH公钥生成方法自行百度);
- Jenkins上安装< GitLab >插件,完成配置后,进入构建Job配置页面,在构建触发器中,勾选< Build when a change is pushed to Gitlab >,并复制其Webhook URL;
- 在GitLab的相应项目上,添加复制的Webhook地址,并选中可以触发构建的操作;
- 配置Jenkins的构建Job,在构建后操作中添加< Publish build status to GitLab >;
- 在Gitlab触发Jenkins构建,查看运行过程及结果;
- 进阶:自定义Gitlab返回结果,通过点击GitLab上的构建结果查看CI报告(待补充);
- 进阶:Gitlab对接Jenkins时,Pipeline的流程化(待补充);
运行及实施过程
构建参数
当构建被触发后,Jenkins根据构建参数开始进行构建(从GitLab触发则使用默认值,参考下图)。
源码管理
安装< Git >插件,通过Git进行源码管理。
触发构建
在构建触发器中,勾选< Build when a change is pushed to Gitlab >,使用webhook自动触发构建。
构建前的预处理
- 构建动作中,应当先对本次构建做一些预处理,参考下图;
- 预处理过程中变量生成的变量,可使用< Environment Injector >插件转换为本次构建的全局变量;
代码的编译与打包
根据项目决定编译打包方式即可,此处不做描述。
代码静态扫描与单元测试
- 搭建SonarQube系统,将代码静态扫描、单元测试进行统一管理,具体使用方式根据项目决定,方法自行百度;
- 搭建SonarQube时,安装Mysql可能遇到麻烦,通过Mysql卸载命令清理环境(Ubuntu参考:apt-get remove --purge mysql-*);
- Jenkins安装< SonarQube Scanner for Jenkins >插件,并进行配置后添加构建步骤,参考下图;
- 在插件执行前,应当执行代码静态扫描、单元测试命令,并生成Sonar Scanner可识别的结果文件;
测试环境自动部署
如需进行环境部署,应在单独构建步骤中进行。
功能、接口、性能、稳定性测试
- Jenkins安装< Parameterized Remote Trigger >插件,调用远程Jenkins Job进行测试,参考下图;
- 测试代码应做为单独项目,分别在Gitlab中规范管理,测试任务被调用时,从GitLab上拉取该测试项目Release分支的代码;
- 应确定测试框架,并将用例按基线、全量、本迭代等分为多个测试套件,在Jenkins中按需使用;
- 应输出测试报告,上传到指定HTTP服务器目录(一般由主控机构建Job根据其BuildID创建),以供查看及备份,并方便生成CI报告;
生成持续集成报告
- 主控机构建Job执行时,应在指定HTTP服务器下,根据BuildID创建报告存放目录,用于存放各阶段报告;
- 持续集成报告应由主控机构建Job,在< 构建后 >步骤生成,可使用< PostBuildScript >插件来帮助实现;
- 通过读取各阶段生成的结果报告内容,来生成持续集成的报告(Python推荐使用jinja及lxml包,lxml可能在某些情况下运行异常,可使用Pipenv创建Python指定版本的虚拟环境来运行);
- 代码静态扫描、单元测试结果,可从SonarQube上直接获取。(SonarQube结果页面由JavaScript临时生成,不方便抓取,建议通过接口获取相应结果数据。接口及参数可抓包获取,调用接口需要登陆获取cookies,代码不贴出,建议自行分析便于理解参数);
发送邮件报告
- Jenkins上安装< Email Extension >插件,发送美观的HTML格式邮件(模版自行百度);
- 主控机构建Job运行前,应将邮件中用到的变量初始化,以免出现异常时变量不存在而导致邮件中直接显示变量名;
- GitLab触发Jenkins构建Job时,会将构建信息传递给Jenkins并声明为变量(如触发人、构建分支、构建原因等),在构建记录的Environment variables中可以查看这些信息;
Jenkins插件分享
局部变量转为全局变量
< Environment Injector >
Jenkins构建过程中,由某个步骤临时生成的变量,一般仅对本步骤有效,无法提供给后面的步骤使用。通过< Environment Injector >插件,将变量写入缓存文件,再读取文件并将其中的变量声明为全局变量。缓存文件内容格式为:name=value。
调用远程构建任务
< Parameterized Remote Trigger >
安装< Parameterized Remote Trigger >插件,可以在构建中调用远程Jenkins的构建Job,并且在构建日志中显示远程构建的日志。远程构建结果将影响本次构建结果。
根据构建结果执行更多操作
< PostBuildScript >
安装< PostBuildScript >插件,可以根据构建结果,在构建完成后执行构建阶段支持的所有操作,如执行shell命令等,让使用者更自由的定义Jenkins构建过程。
其它插件
< Run Condition Plugin > 在执行步骤前添加判断
< user build vars plugin >
< MultiJob plugin >