Jenkins常用又基礎的使用教程
Jenkins 是一款流行的開源持續整合(Continuous Integration)工具,廣泛用於專案開發,具有自動化構建、測試和部署等功能。本文以 CentOS7 環境為例,總結了 Jenkins 的安裝與配置、郵件功能使用,並接入阿里巴巴的著名開源專案 fastjson,以此演示 Java 專案(SVN+Maven)中 FindBugs/CheckStyle/PMD 等常用外掛的使用、單元測試及其覆蓋率報告等,力求實戰性強。
作者:王克鋒
出處:https://kefeng.wang/2017/01/06/jenkins/
版權:自由轉載-非商用-非衍生-保持署名,轉載請標明作者和出處。
1 安裝 Jenkins
1.1 安裝 JDK/Maven
Jenkins 自身採用 Java 開發,所以要必須安裝 JDK;
本文整合的專案基於 Maven 構架,所以 Maven 也必須安裝;
兩者的安裝方法請參考我的另一篇文章:Tomcat 安裝及其單機多例項部署
-
export JAVA_HOME=/usr/java/jdk1.8.0_111
-
export MAVEN_HOME=/opt/apache-maven-3.3.9
1.2 安裝 Jenkins
以下四種方法任選一種,推薦第一種。
1.2.1 離線安裝
-
## http://pkg.jenkins-ci.org/redhat/
-
wget http://pkg.jenkins-ci.org/redhat/jenkins-2.39-1.1.noarch.rpm ## 下載(也可以Windows下載再轉過來)
-
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins.io.key ## 公鑰
-
sudo yum -y install jenkins-*.noarch.rpm
- 1.2.2 線上安裝
-
## http://pkg.jenkins-ci.org/redhat/
-
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
-
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
-
sudo yum -y install jenkins
1.2.3 基於 Tomcat 安裝
- 安裝並啟動 Tomcat;
- 從官網下載 jenkins.war 至 $CATALINA_BASE/webapps,Tomcat 會自動部署;
- 瀏覽器訪問:http://centos:8080/jenkins/
1.2.4 免安裝方式
-
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
-
sudo java -jar jenkens.war ## 啟動服務,直至看到日誌 `Jenkins is fully up and running`
-
curl http://localhost:8080/ ## Jenkins 已就緒
1.3 調整配置檔案
-
## sudo vim /etc/sysconfig/jenkins
-
JENKINS_USER="root" ## 原值 "jenkins" 必須修改,否則許可權不足
-
JENKINS_PORT="8080" ## 原值 "8080" 可以不修改
-
## 還有開啟 HTTPS 相關引數,此處不打算開啟,故不作說明
- 安裝目錄: /usr/lib/jenkins
工作目錄: /var/lib/jenkins(對應於環境變數 JENKINS_HOME)
1.4 啟動
-
sudo systemctl enable jenkins
-
sudo systemctl restart jenkins
-
檢視日誌檔案:
sudo tail -f /var/log/jenkins/jenkins.log
啟動後會生成檔案 hudson.model.UpdateCenter.xml,需要修改它,
否則瀏覽器首次進入時會卡在“Jenkins 正在啟動,請稍後…”
-
## 原值: http://updates.jenkins-ci.org/update-center.json
-
## 新值: http://mirror.xmission.com/jenkins/updates/update-center.json
-
## 或者: http://mirror.xmission.com/jenkins/updates/current/update-center.json
-
sudo cat /var/lib/jenkins/hudson.model.UpdateCenter.xml
-
sudo sed -i 's/updates.jenkins-ci.org/mirror.xmission.com\/jenkins\/updates/g' /var/lib/jenkins/hudson.model.UpdateCenter.xml
-
sudo cat /var/lib/jenkins/hudson.model.UpdateCenter.xml
-
sudo systemctl restart jenkins
- 1
- 2
- 3
- 4
- 5
- 6
- 7
1.5 防火牆放行
-
### sudo vim /etc/sysconfig/iptables
-
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-
### 重啟生效: sudo systemctl restart iptables
1.6 解除安裝
如果要重灌,或者本機不需要 Jenkins,可解除安裝:
-
sudo systemctl stop jenkins
-
sudo systemctl disable jenkins
-
sudo yum -y remove jenkins
-
sudo rm -rf /var/{lib,log,cache}/jenkins /usr/lib/jenkins /root/.jenkins
-
sudo rm -rf `sudo find /{etc,var,run} -name "jenkins*"`
2 基本配置
2.1 登入
瀏覽器進入 http://centos:8080/
首次進入需要輸入初始密碼來解鎖,初始密碼檢視方法: sudo cat /var/lib/jenkins/secrets/initialAdminPassword
進入 Jenkins 定製介面,讓選擇 Install suggested plugins
或 Select plugins to install
時,兩者都不要選,直接關閉,下一個介面點選“Start using Jenkins”;
修改登入密碼:主介面右上角“登出”連結的左邊的使用者名稱下拉選單中點“設定”。
2.2 安全設定
預設情況下,任何使用者都可以使用 Jenkins 進行釋出。
可以進入相關設定:系統管理 / Configure Global Security,
選擇 Jenkins專有使用者資料庫
,不要選中 允許使用者註冊
;
選擇 登入使用者可以做任何事
,選中 Allow anonymous read access
2.3 外掛安裝方法
如果安裝外掛失敗率很高,可設定翻牆,請參考我之前的文章:翻牆代理 Shadowsocks 使用詳解
2.3.1 離線安裝
手工下載(*.hpi): http://updates.jenkins-ci.org/download/plugins/
進入:系統管理 / 管理外掛 / 高階,然後上傳外掛進行安裝。
無需重啟 Jenkins 外掛即生效。
2.3.2 線上安裝
進入:系統管理 / 管理外掛 / 可選外掛
查詢並勾選所需外掛,點選“直接安裝”;
無需重啟 Jenkins 外掛即生效。如遇失敗可重試或離線安裝。
2.4 工具設定
進入:系統管理 / Global Tool Configuration
JDK 下不勾選“自動安裝”,指定別名=JDK-1.8.0.111
, JAVA_HOME=/usr/java/jdk1.8.0_111
Maven 下不勾選“自動安裝”,指定別名=Maven-3.3.9
, MAVEN_HOME=/opt/apache-maven-3.3.9
點選 Save
按鈕。
重啟 Jenkins 後生效:sudo systemctl restart jenkins
3 Maven(SVN) 專案接入
3.1 準備 SVN 原始碼
使用 alibaba 的 fastjson 來演示:
下載: https://github.com/alibaba/fastjson/archive/master.zip
SVN地址: svn://centos/repo1/fastjson
3.2 安裝相關外掛
- Subversion Plug-in ## 版本管理 SVN 的外掛
- Git plugin ## 版本管理 GIT 的外掛
- Maven Integration plugin ## 專案構建 Maven 的外掛
- Gradle Plugin ## 專案構建 Gradle 的外掛
無需重啟 Jenkins 外掛即生效。如遇失敗可重試或離線安裝。
3.3 新建構建專案
3.3.1 開始建立
主頁:點選“新建”;
專案型別:輸入專案名稱 fastjson
,型別選擇“構建一個Maven專案”(如果沒有此項可選,請檢查外掛“Maven Integration plugin”是否已安裝);
3.3.2 原始碼管理
選擇“Subversion”(如果沒有此項可選,請檢查外掛“Subversion Plug-in”是否已安裝),
倉庫URL可以指定 svn/http/https 之一,這裡指定 svn://centos/repo1/fastjson
Credentials: 新增 SVN 使用者名稱密碼,並從下拉列表中選擇它。
3.3.3 定時觸發構建
構建觸發器: 只選中 Build periodically
, “日程表”格式與 crontab 相似但有細微差別,示例如下:
-
## 每行由 5 個值組成(空格或TAB分隔),分別表示分(0-59)、時(0-23)、日(1-31)、月(1-12)、周(0-7, 0/7=週日)
-
## "M,N" 表示M和N;"M-N" 表示範圍[M,N];"M-N/X" 表示範圍[M,N]內每隔X;"*/X" 表示整個範圍內每隔X
-
## 前面提到的M/N/X的值都可以用H(意為Hash)代替,雜湊值起到隨機值的效果,且同一專案取值穩定,這對於專案多時分散壓力很有用。
-
H/10 H(0-8) * * 1-5 ## 觸發時間: 工作日、Hour為0~8按雜湊隨機、Minute以10為間隔
-
H/10 H * * 0,6,7 ## 觸發時間: 週末、Hour為全天按雜湊隨機、Minute以10為間隔
-
## “日程表”修改後,下方會給出下次執行時間點的預告。
3.3.4 版本提交觸發構建
構建觸發器: 只選中 Poll SCM
,可指定檢查 SVN 程式碼是否有提交的時間:
-
## 格式與 "Build periodically" 相同
-
H/10 * * * * ## 任何時候,每隔 30 分鐘就檢測一次 SVN,如果有提交就啟動構建
3.3.5 Build 設定
Root POM: 指定 pom.xml 相對路徑
Goals and options: 指定 mvn 執行目標或選項,設定為 package -Dmaven.test.skip=true
3.3.6 Post Steps 設定
定製構建後的操作,通常選擇“Run only if build succeeds”,支援 shell 等指令碼;
-
## 指令碼工作目錄為: /var/lib/jenkins/workspace/fastjson
-
# sudo systemctl stop tomcat
-
# sudo cp -f target/*.war /opt/apache-tomcat-8.5.9/webapps/
-
# sudo systemctl start tomcat
-
ls -l target/*.?ar
3.4 手工觸發構建
進入 My Views
, 右側看到各個專案;
點選進入關注的專案,點選左側的“立即構建”;
開始構建或構建完畢後,左下方列出每次構建的連結,點選進入某次構建;
點選左側的“Console Output”,可檢視構建日誌,如有報錯可以看到;
糾正錯誤後,返回到工程,再次點選“立即構建”,直至構建成功;
如有網路相關報錯,重試幾次也會成功。
4 開啟 Java 程式碼靜態檢查
4.1 安裝相關外掛
如果是離線安裝,需要先依次安裝被依賴的外掛:
- Script Security Plugin
- Matrix Project Plugin
- Static Analysis Utilities
再安裝直接被使用的外掛:
- FindBugs Plug-in
- Checkstyle Plug-in
- PMD Plug-in
外掛官方資料:
FindBugs: https://wiki.jenkins-ci.org/display/JENKINS/FindBugs+Plugin
Checkstyle: http://maven.apache.org/plugins/maven-checkstyle-plugin/usage.html
PMD: http://maven.apache.org/plugins/maven-pmd-plugin/usage.html
4.2 Maven 中設定外掛(pom.xml)
-
<project ...>
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-
</properties>
-
<!-- ...... -->
-
<reporting>
-
<plugins>
-
<plugin>
-
<groupId>org.codehaus.mojo</groupId>
-
<artifactId>findbugs-maven-plugin</artifactId>
-
<version>3.0.4</version>
-
<configuration>
-
<xmlOutput>true</xmlOutput>
-
<findbugsXmlOutput>true</findbugsXmlOutput>
-
<findbugsXmlWithMessages>true</findbugsXmlWithMessages>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-checkstyle-plugin</artifactId>
-
<version>2.17</version>
-
<configuration>
-
<linkXRef>false</linkXRef>
-
<failsOnError>true</failsOnError>
-
<consoleOutput>true</consoleOutput>
-
<configLocation>checkstyle.xml</configLocation>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-pmd-plugin</artifactId>
-
<version>3.7</version>
-
<configuration>
-
<linkXref>false</linkXref>
-
</configuration>
-
</plugin>
-
</plugins>
-
</reporting>
-
</project>
4.3 修改 Jenkins 構建配置
4.3.1 設定 Maven
“Build”標籤頁,Goals and options
設定為: package -Dmaven.test.skip=true findbugs:findbugs checkstyle:checkstyle pmd:pmd
4.3.2 開啟相關報告
“構建設定”標籤頁,開啟以下三個選項:
- Publish FindBugs analysis results
- Publish Checkstyle analysis results
- Publish PMD analysis results
4.4 構建後檢視報告
構建後進入構建頁面,從左邊點選檢視報告:
- FindBugs Warnings
- Checkstyle Warnings
- PMD Warnings
5 開啟郵件報告
Jenkins 的郵件傳送,原理與郵件客戶端一樣:把發件人的郵箱帳號、密碼、SMTP伺服器告訴 Jenkins,Jenkins 需要時使用該帳號向指定的收件人傳送郵件報告。
5.1 安裝相關外掛
Jenkins 自帶郵件外掛(Mailer Plugin)的功能很弱且無法自定製,
需要安裝擴充套件郵件外掛: Email Extension Plugin
5.2 全域性統一設定
以 [email protected] 為例,如下圖設定:
5.2.1 設定管理員郵箱
進入:系統管理 / 系統設定 / Jenkins Location 系統管理員郵件地址
設為 [email protected]
5.2.2 設定發件人帳號
進入:系統管理 / 系統設定 / Extended E-mail Notification
“SMTP server” 設為 smtp.company.com
“Default user E-mail suffix” 設為 @company.com
“Use SMTP Authentication” 選中
“User Name” = [email protected](必須與管理員郵箱相同)
“Password” = **
“Use SSL” = on
“SMTP port” = 465
“Charset” = UTF-8
“Default Content Type” = HTML (text/html)
5.2.3 設定郵箱模板
Default Subject
: 構建通知:BUILD_NUMBER - $BUILD_STATUS Default Content
:
-
本郵件由系統自動發出,請勿回覆!<br/>
-
<h2><font color="#CC0000">構建結果 - ${BUILD_STATUS}</font></h2>
-
<h4><font color="#0B610B">構建資訊</font></h4>
-
<hr size="2" width="100%" />
-
<ul>
-
<li>專案名稱:${PROJECT_NAME} - #${BUILD_NUMBER}</li>
-
<li>觸發原因:${CAUSE}</li>
-
<li>專案 URL:<a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
-
<li>構建 URL:<a href="${BUILD_URL}">${BUILD_URL}</a></li>
-
<li>構建日誌:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
-
<li>工作目錄:<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
-
</ul>
-
<h4><font color="#0B610B">失敗用例</font></h4>
-
<hr size="2" width="100%" />
-
$FAILED_TESTS<br/>
-
<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
-
<hr size="2" width="100%" />
-
<ul>
-
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
-
</ul>
-
詳細提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
-
<h4><font color="#0B610B">程式碼檢查</font></h4>
-
<hr size="2" width="100%" />
-
FindBugs:<a href="${BUILD_URL}findbugsResult">${BUILD_URL}findbugsResult</a><br/>
-
CheckStyle:<a href="${BUILD_URL}checkstyleResult">${BUILD_URL}checkstyleResult</a><br/>
-
PMD:<a href="${BUILD_URL}pmdResult">${BUILD_URL}pmdResult</a><br/>
也可以自定義 Jelly 模板,並在 Default Content
中引用 ${JELLY_SCRIPT, template="html_gmail"}
:
-
sudo mkdir -p /var/lib/jenkins/email-templates
-
sudo cd /var/lib/jenkins/email-templates
-
sudo wget https://github.com/jenkinsci/email-ext-plugin/raw/master/src/main/resources/hudson/plugins/emailext/templates/html_gmail.jelly
-
# 更多模板列表: https://github.com/jenkinsci/email-ext-plugin/tree/master/src/main/resources/hudson/plugins/emailext/templates
5.2.4 設定郵件觸發時機
點選 Default Triggers
,比較好的方案是選中兩項:
- Failure - Any ## 可定義“編譯失敗時”才向哪些人員發郵件(比如最近程式碼提交者)
- Success ## 可定義“構建成功時”才向哪些人員發郵件(比如所有產品關注者)
5.2.5 郵件可用變數
點選 Content Token Reference
右側的問號圖示,可以看到各郵件模板中可引用變數的含義。
5.2.6 郵件未傳送問題排查
構建設定裡指定的收件人只是 kevin,沒有後續,希望採用外掛 Email Extension Plugin
中的郵箱字尾,
卻發現構建日誌中報錯: Failed to send e-mail to kevin because no e-mail address is known, and no default e-mail domain is configured
原來,擴充套件郵件外掛有BUG,使用的是自帶郵件外掛的字尾設定,而後者之前沒有設定。
點選 儲存
,儲存郵件全域性設定。
5.3 專案設定中啟用郵件
構建後操作步驟: 增加 Editable Email Notification
(來自外掛 Email Extension Plugin
)。下圖設定的效果是:
- 構建失敗時,向上次成功構建之後導致構建失敗的 SVN 提交的人員傳送郵件;
- 構建成功時,向上次成功構建之後有 SVN 提交的人員、還有“Project Recipient List”中的人員傳送郵件;
5.4 驗證構建報告郵件
分別按以下三種情形觸發構建,都能看到構建報告郵件:
- 手工觸發:進入工程後,點選“立即構建”;
- 定時觸發構建:“構建觸發器”只選中 Build periodically
;
- 版本提交觸發構建:“構建觸發器”只選中 Poll SCM
。
6 Java/JUnit 單元測試
6.1 Maven 中設定外掛(pom.xml)
-
<project ...>
-
<reporting>
-
<plugins>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-surefire-plugin</artifactId>
-
<version>2.19.1</version>
-
</plugin>
-
</plugins>
-
</reporting>
-
</project>
6.2 修改 Jenkins 構建配置
“Build”標籤頁,Goals and options
:確保去掉-Dmaven.test.skip=true
即可。
6.3 構建後檢視單元測試報告
7 單元測試覆蓋率報告
7.1 安裝外掛
JaCoCo plugin:與外掛 Cobertura 一樣,用於生成覆蓋率報告,但比 Cobertura 更易用。
7.2 調整工程 pom.xml
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.jacoco</groupId>
-
<artifactId>jacoco-maven-plugin</artifactId>
-
<version>0.7.8</version>
-
<executions>
-
<execution>
-
<id>prepare</id>
-
<goals>
-
<goal>prepare-agent</goal>
-
</goals>
-
</execution>
-
<execution>
-
<id>report</id>
-
<phase>package</phase>
-
<goals>
-
<goal>report</goal>
-
</goals>
-
</execution>
-
</executions>
-
</plugin>
-
</plugins>
-
</build>
7.3 調整專案的構建設定
專案的構建設定 Post Build Action 中,增加 “Record JaCoCo coverage report”,並設定期望的覆蓋率閾值。
7.4 構建並檢視報告
構建完成後,點選本次構建頁的“Coverage Report”檢視報告:
8 更多有用外掛
- Folders Plugin:可巢狀地定義資料夾來級別 views / jobs;
- build timeout plugin:允許使用者中止耗時太久的構建;
- Dingding[釘釘] Plugin:允許向阿里釘釘傳送構建通知;
- TestNG Results Plugin: 用 TestNG 代替 JUnit;
- Publish Over SSH: 通過SSH釋出檔案或執行命令(使用SFTP的SCP)。