火展柜团队目前使用 Jenkins 做持续集成,在提测 / 预发阶段,开发人员需要频繁地在 Jenkins 平台上进行如下操作以构建测试包:
- 在团队的 View 下创建 Job ,一般以某个已存在 Job 为模版,这个模版已经设置好打包仓库 url 和常用配置
- 更改需要打包的代码分支
- 更改钉钉 token,构建结束后,需要将结果发送至测试钉钉群组
- 点击构建项目
在创建 Job 后,后续构建则只需要以下两步:
- 更新 Podfile.lock 并提交至远程仓库
- 点击构建项目
效率提升
虽然只有两步,但切至网页操作还是挺烦的,于是就催生了 fire-jenkins-builder 。
有了 fire-jenkins-builder 并结合简单的配置,开发者提交如下 commit 便会触发 Jenkins 打包:
1 | git commit -m "[jb] XXXXXX" |
当然,特殊情况下也可以使用命令触发 Job :
1 | jb -p PATH -b BRANCH -l LOG_LEVEL |
- PATH 为配置文件路径,关于配置文件,下文会进行说明
- BRANCH 为分支名称,也可在配置文件中设置
- LOG_LEVEL 为日志等级,默认输出等级为 Info
配置详情
添加 .fire-jenkins.yml
配置文件至目标工程根目录下:
1 | # jenkins job 配置文件 |
然后针对自己所在业务线进行定制,同业务线开发人员后续只需要更改 job_name
和 parameters
即可,比如根据项目群组设置钉钉 token。
配置 .gitlab-ci.yml
:
1 | stages: |
配置之后,只要 commit 信息满足 /^\[jb\]/
正则,就会触发 GitLab CI ,GitLab Runner 就会执行 jb -p .fire-jenkins.yml -b $CI_COMMIT_REF_NAME
触发 Jenkins 构建 Job ,其中 CI_COMMIT_REF_NAME 为分支名称。
实现细节
commit 触发 GitLab CI 部分如上节所示 ,这里主要讲下 fire-jenkins-builder 的内部实现。
fire-jenkins-builder 实现代码很少,主要依赖了两个 gem:
- jenkins_api_client , 提供 Jenkins Api 封装
- nokogiri ,提供 XML 解析更改
先来看下 build
代码:
1 | def build |
首先 build
方法会根据 job_name
去查询 Jenkins 上是否已存在同名 Job ,不存在就去创建并且添加到业务线配置的 job_view
,否则就以 parameters
为参数去构建 Job ,这里的参数对应 Jenkins 配置页面中的 参数化构建过程 。
其中 create_or_update
方法第二个入参为 XML 配置数据, target_xml
方法如下:
1 | def target_xml |
target_xml
先获取 template_job_name
模版 Job 的配置 XML ,然后根据开发者传入的 parameters
修改 XML 中对应节点的数据 (分支和仓库地址配置功能都由插件提供),生成一份新的 XML 供 create_or_update
创建 Job。
以上代码再结合 GitLab CI ,就可以愉快地构建 Jenkins Job 了。