持续集成的探索之 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 countapk 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 的配置图和项目的配置图

job

config

Tips

  • 修改 jenkins 端口
    1. 修改脚本 /etc/init.d/jenkins 文件里的端口号
    2. 修改 /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