Jenkins使用教程

Jenkins使用教程

Jenkins 是一款流行的開源持續集成(Continuous Integration)工具,廣泛用於項目開發,具有自動化構建、測試和部署等功能。本文以 CentOS7 環境爲例,總結了 Jenkins 的安裝與配置、郵件功能使用,並接入阿里巴巴的著名開源項目 fastjson,以此演示 Java 項目(SVN+Maven)中 FindBugs/CheckStyle/PMD 等常用插件的使用、單元測試及其覆蓋率報告等,力求實戰性強。

1 安裝 Jenkins


官網: https://jenkins.io/

1.1 安裝 JDK/Maven

Jenkins 自身採用 Java 開發,所以要必須安裝 JDK;
本文集成的項目基於 Maven 構架,所以 Maven 也必須安裝;

[root@node1 ~]# vim /etc/profile.d/java.sh
# java
export JAVA_HOME=/opt/java
export PATH=${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin
export CLESSPATH=.:${JAVA_HOME}/lib:${JAVA_HOME}/jre/lib
[root@node1 ~]#

# maven
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$MAVEN_HOME/bin

1.2 安裝 Jenkins

以下四種方法任選一種,推薦第一種。

1.2.1 在線安裝

# 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 install jenkins -y

1.2.2 離線安裝

# http://pkg.jenkins-ci.org/redhat/
wget http://pkg.jenkins-ci.org/redhat/jenkins-2.150.3-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.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

啓動時如果報如下錯誤,請添加java命令的軟連接;

[root@node1 ~]# systemctl restart  jenkins
Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.
[root@node1 ~]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since 一 2019-02-25 11:38:23 CST; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 17280 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=1/FAILURE)

2月 25 11:38:22 node1 systemd[1]: Starting LSB: Jenkins Automation Server...
2月 25 11:38:23 node1 runuser[17285]: pam_unix(runuser:session): session opened for user root by (uid=0)
2月 25 11:38:23 node1 jenkins[17280]: Starting Jenkins bash: /usr/bin/java: 沒有那個文件或目錄
2月 25 11:38:23 node1 runuser[17285]: pam_unix(runuser:session): session closed for user root
2月 25 11:38:23 node1 jenkins[17280]: [失敗]
2月 25 11:38:23 node1 systemd[1]: jenkins.service: control process exited, code=exited status=1
2月 25 11:38:23 node1 systemd[1]: Failed to start LSB: Jenkins Automation Server.
2月 25 11:38:23 node1 systemd[1]: Unit jenkins.service entered failed state.
2月 25 11:38:23 node1 systemd[1]: jenkins.service failed.
[root@node1 ~]#

建立軟連接

ln -s /opt/java/bin/java /usr/bin/java

查看日誌文件: 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.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使用教程
如果有如下提示,請返回重新進入,

Offline
This Jenkins instance appears to be offline.

For information about installing Jenkins without an internet connection, see the Offline Jenkins Installation Documentation. 

You may choose to continue by configuring a proxy or skipping plugin installation.

進入 Jenkins 定製界面,讓選擇 Install suggested pluginsSelect plugins to install 時,兩者都不要選,直接關閉;
Jenkins使用教程

下一個界面點擊Start using Jenkins
Jenkins使用教程
修改登錄密碼:主界面右上角“註銷”鏈接的左邊的用戶名下拉菜單中點“設置”。

2.2 安全設置

默認情況下,任何用戶都可以使用 Jenkins 進行發佈。
可以進入相關設置:系統管理 / Configure Global Security,
選擇 Jenkins專有用戶數據庫,不要選中 允許用戶註冊
選擇 登錄用戶可以做任何事,選中 Allow anonymous read access
Jenkins使用教程
Jenkins使用教程

2.3 插件安裝方法

如果安裝插件失敗率很高,可以下載下來離線安裝;

2.3.1 離線安裝

手工下載(*.hpi): http://updates.jenkins-ci.org/download/plugins/
進入:系統管理 / 管理插件 / 高級,然後上傳插件進行安裝。
無需重啓 Jenkins 插件即生效。

2.3.2 在線安裝

進入:系統管理 / 管理插件 / 可選插件
查找並勾選所需插件,點擊“直接安裝”;
無需重啓 Jenkins 插件即生效。如遇失敗可重試或離線安裝。
Jenkins使用教程
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 安裝相關插件

如果是離線安裝,需要先依次安裝被依賴的插件:

再安裝直接被使用的插件:

插件官方資料:
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)。

9 參考


https://blog.csdn.net/shuizhihun07/article/details/80168076

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章