持续集成的探索之 Jenkins
2017年2月14日 · 2142 字 · 5 分钟 · CI Jenkins
Jenkins 是一个用 Java 编写的开源的持续集成工具。
注:文中提到的例子地址是 https://github.com/CarlisleChan/CIPractice,一些配置也是以 Android 自动化测试的探索 为基础的。 另外,建议平时的项目打包和自动化测试结果分析是分开的两个 Jenkins 项目,自动化测试结果分析每天定时执行。
安装及运行
保存下面内容到本地 docker-compose.yaml
,也可直接将我的文件下载下来 地址
version: "2"
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts
ports:
- "8181:8080"
restart: always
volumes:
- ./data/var/jenkins:/var/jenkins_home
- ./data/var/android:/var/android
执行 docker-compose up -d
即可
初始设置
# download command tools
curl -O https://dl.google.com/android/repository/commanndlinetools-linux-6609375_latest.zip
# tar
tar zxvf commanndlinetools-linux-6609375_latest.zip -C data/var/android/sdk/
# install platforms build-tools and extras
./sdk/tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --list
./sdk/tools/bin/sdkmanager --sdk_root=$ANDROID_HOME "platforms;android-23"
./sdk/tools/bin/sdkmanager --sdk_root=$ANDROID_HOME "build-tools;23.0.2"
./sdk/tools/bin/sdkmanager --sdk_root=$ANDROID_HOME "extras;android;m2repository"
新建 job 及基本配置
New item → Freestyle project → 点击 ok 进入一般配置
1. 配置版本管理工具
点击 Source Code Management,选择 git 进行版本控制,在 Repository URL 中输入 git 仓库的地址,点击 Credentials 右边的 Add,添加认证方式。
2. 配置构建触发器
点击 Build Triggers,勾选 Poll SCM,输入 H 7 * * *
这意味着 每周二的上午10:00
Jenkins 会自动获取服务器上最新的代码,并进行打包验证。
3. 配置添加构成完成后的任务
邮件通知:
点击 Add post-build setup,设置构建完成后自动执行的任务。
这里选择 E-mail Notification,即构建完成之后自动发送邮寄通知。
输出文件:
点击 Add post-build action 中 Archive the artifacts,添加文件输出路径即可。
例:app/build/outputs/
4. 构建
点击 Build Now 即可开始构建
其他配置
1. Gitlab
如果你也是使用的 Gitlab 的话,拉去代码的时候需要配置账号密码。
2. 配置邮箱通知
首先配置 Jenkins 所需的邮箱
Manage Jenkins → Configure System → System Admin e-mail address,输入 Jenkins 需要的邮箱地址,格式为 name <xxx@xxx.com>
然后配置邮箱账号和密码以便登录
Manage Jenkins → Configure System → E-mail Notification → Advanced,一般只需要配置 SMTP server、Default user e-mail sufix、User Name、Password 即可。
最后可以测试邮箱配置是否成功,勾选 Test configuration by sending test e-mail 进行相应操作测试。
如果你群发的收件人列表比较多,或者每次通知的人不一样,比如每次只想通知导致构建失败的那个人(即最后一次上传代码的人),那么简单的 E-mail Notification 肯定不能满足你的要求,Email extension plugin 可以满足你的需求,这里不再详细介绍了。
3. 配置 Slack
首先需要安装 Slack Notification Plugin
,然后登录 slack,在 team 的 setting 中选择 App&integrations。
在搜索框中输入 Jenkins,新添加一个 Jenkins 的 config,选择要通知的 channel,选择 add Jenkins CI integration 后,有详细的 Jenkins 接入指引,跟着指引操作就可以了。
如果需要上传文件到 Slack,需要安装 Slack File Uploader Plugin
4. 配置专项指标测试
以下测试默认你已经在 android 项目中配置并可成功执行。
Checkstyle
下载安装 Checkstyle Plug-in
在项目配置里添加构建后动作,选择 Publish Checkstyle analysis results
设置文件地址,例:app/build/outputs/checkstyle/checkstyle.xml
FindBugs
下载安装 FindBugs Plug-in
在项目配置里添加构建后动作,选择 Publish FindBugs analysis results
设置文件地址,例:app/build/outputs/findbugs/findbugs.xml
Lint
在项目配置里添加构建后动作,选择 Publish Android Lint results
设置文件地址,例:app/build/outputs/lint/lint.xml
PMD
下载安装 PMD
在项目配置里添加构建后动作,选择 Publish pmd analysis results
设置文件地址,例:app/build/outputs/pmd/pmd.xml
JUnit Test
在项目配置里添加构建后动作,选择 Publish JUnit Test result report
设置文件地址,例:app/build/test-results/release/*.xml
Apk Info
apk info 主要包括 dex count
和 apk size
下载安装 Plot plugin
配置 dexcount:
在项目配置里添加构建后动作,选择 Plot build data,然后在 Plot group 填写 Apk Info,在 Plot title 一栏中填写 dex count,在 Number of builds to include 一栏中填写 500
在 Data series file 一栏填写文件地址,例:app/build/outputs/dexcount/dexcount.csv
最后勾选 Load data from csv file 就可以了
配置 apk size:
添加 plot,然后在 Plot group 填写 Apk Info 以便与 dexcount 同组,在 Plot title 一栏中填写 apk size,在 Number of builds to include 一栏中填写 500
在 Data series file 一栏填写文件地址,例:app/build/outputs/apksize/debug.csv
最后勾选 Load data from csv file 就可以了
Infer
添加 plot,然后在 Plot group 填写 Infer Report,在 Plot title 一栏中填写 bugs count,在 Number of builds to include 一栏中填写 500
在 Data series file 一栏填写文件地址,例:app/build/outputs/infer/report.csv
最后勾选 Load data from csv file 就可以了
5. 将输出文件生成二维码
安装 description setter plugin
安装完成后,在 Post-build Actions 栏目中会多出 Set build description 功能,然后在 Description 填入地址就可以了
例:<img src ="https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=${JENKINS_URL}job/YtxAegis/YtxAegis/${BUILD_NUMBER}/artifact/app/build/outputs/apk/" />
Jenkins 出于安全的考虑,所有描述信息的 Markup Formatter 默认都是采用 Plain text 模式,在这种模式下是不会对 build 描述信息中的 HTML 编码进行解析的,所以我们需要修改一下 Manage Jenkins → Configure Global Security,将 Markup Formatter 的设置更改为 Safe HTML 即可.
最后附上两张图,Jenkins 的配置图和项目的配置图
Tips
- 修改 jenkins 端口
- 修改脚本
/etc/init.d/jenkins
文件里的端口号 - 修改
/etc/default/jenkins
文件里的端口号
- 修改脚本
问题
Q: unable to auto-install jdk until the license is accepted
A: 进入 Manager Jenkins → Global Tool Configuration → JDK → check License Agreement
Q: build step ‘invoke gradle script’ change build result to failure A: 进入 Manager Jenkins → Global Tool Configuration → 配置 Gradle 名字 → 回到项目中 Gradle 设置为上一步中的配置
Q: sdk location not found. define location with sdk.dir in the local.properties A: use Execute shell echo “<path to the sdk on jenkins” » local.properties
Q: Test reports were found but none of them are new. Did tests run? A: touch path/to/test/reports/*.xml
Q: Failed to connect to repository : Command “git ls-remote -h ssh://git@example.com/my/repo.git HEAD” returned status code 128: stdout: stderr: Host key verification failed. fatal: The remote end hung up unexpectedly A: git ls-remote -h ssh://git@example.com/my/repo.git HEAD
参考
http://wangkuiwu.github.io/2015/08/07/jenkins-02/
https://github.com/jenkinsci/gitlab-plugin/wiki/Setup-Example