Jenkins使用教程

Jenkins使用教程html

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

1 安裝 Jenkins


官網: https://jenkins.io/
官方中文教程:https://jenkins.io/zh/doc/node

1.1 安裝 JDK/Maven

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

[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

如下四種方法任選一種,推薦在線安裝長期穩定支持版。github

1.2.1 在線安裝(redhat)

  • 長期穩定支持版-LTSweb

    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    yum install jenkins -y
  • 最新版
    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
    rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
    yum install jenkins -y

1.2.2 離線安裝

wget http://pkg.jenkins-ci.org/redhat/jenkins-2.150.3-1.1.noarch.rpm  # 下載(也能夠Windows下載再轉過來)
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins.io.key ## 公鑰
yum -y install jenkins-*.noarch.rpm

1.2.3 基於Tomcat安裝

安裝並啓動 Tomcat;
從官網下載 jenkins.war 至 $CATALINA_BASE/webapps,Tomcat 會自動部署;
瀏覽器訪問:http://centos:8080/jenkins/shell

1.2.4 免安裝方式

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
java -jar jenkens.war ## 啓動服務,直至看到日誌 `Jenkins is fully up and running`
curl http://localhost:8080/ ## Jenkins 已就緒

1.3 調整配置文件

[root@node1 ~]# vim /etc/sysconfig/jenkins
JENKINS_HOME="/var/lib/jenkins"       # 配置和工做的目錄,能夠改成本身的工做目錄;
JENKINS_JAVA_CMD=""                      # java命令的路徑,能夠不修改;
JENKINS_USER="root"                        # 原值 "jenkins" 必須修改,不然權限不足,推薦改成平常使用的普通帳戶;
JENKINS_PORT="8080"                      # web訪問端口;
## 還有開啓 HTTPS 相關參數,此處不打算開啓,故不做說明

安裝目錄: /usr/lib/jenkins
工做目錄: /var/lib/jenkins(對應於環境變量 JENKINS_HOME)數據庫

1.4 啓動

systemctl enable jenkins
systemctl restart jenkins

啓動時若是報以下錯誤,請添加java命令的軟鏈接;apache

[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 ~]#

創建軟鏈接json

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

查看日誌文件: tail -f /var/log/jenkins/jenkins.log

1.5 防火牆放行

### vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
### 重啓生效: systemctl restart iptables

1.6 卸載

若是要重裝,或者本機不須要 Jenkins,可卸載:

systemctl stop jenkins
systemctl disable jenkins
yum -y remove jenkins
rm -rf /var/{lib,log,cache}/jenkins /usr/lib/jenkins /root/.jenkins
rm -rf `find /{etc,var,run} -name "jenkins*"`

2 基本配置


2.1 登陸

瀏覽器進入 http://centos:8080/
首次進入須要輸入初始密碼來解鎖,初始密碼查看方法:
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 plugins;或者二者都不要選,直接關閉;
Jenkins使用教程

而後開始設置管理員帳戶密碼;

2.2 安全設置

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

2.3 插件安裝方法

jenkins --> 系統管理 --> 插件管理 --> 可安裝[Avaiable]

推薦安裝的插件:

Ansible

# 版本管理 GIT 的插件
Git plugin

# gitlab:
Violation Comments to GitLab
GitLab Logo
Gitlab Merge Request Builder
GitLab
Gitlab Hook

# 項目構建 Gradle 的插件 
Gradle Plugin

# 設置語言及中文包:
Locale
Localization: Chinese (Simplified)

# 項目構建 Maven 的插件
Maven Integration

SSH

# 版本管理 SVN 的插件
Subversion Plug-in

無需重啓 Jenkins 插件即生效。如遇失敗可重試或離線安裝。

2.3.1 離線安裝

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

2.3.2 在線安裝

進入:系統管理 / 管理插件 / 可選插件
查找並勾選所需插件,點擊「直接安裝」;
Jenkins使用教程

例如安裝SVN:
Jenkins使用教程

2.4 工具設置

進入:系統管理 / 全局工具配置[Global Tool Configuration]
Maven 下不勾選「自動安裝」,指定別名=Maven-3.5.4, MAVEN_HOME=/opt/apache-maven-3.5.4
Git 指定別名=git, Path to Git executable/usr/bin/git
點擊 Save 按鈕。
Jenkins使用教程
重啓 Jenkins 後生效:

systemctl restart jenkins

2.5 修改默認語言

jenkins --> 系統管理 --> 系統設置 --> Locale --> Default Languagezh_CN
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
systemctl stop tomcat
cp -f target/*.war /opt/apache-tomcat-8.5.9/webapps/
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 全局統一設置

以 admin@company.com 爲例,以下圖設置:

5.2.1 設置管理員郵箱

進入:系統管理 / 系統設置 / Jenkins Location
系統管理員郵件地址 設爲 admin@company.com

5.2.2 設置發件人賬號

進入:系統管理 / 系統設置 / Extended E-mail Notification
「SMTP server」 設爲 smtp.company.com
「Default user E-mail suffix」 設爲 @company.com
「Use SMTP Authentication」 選中
「User Name」 = admin@company.com(必須與管理員郵箱相同)
「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"}:

mkdir -p /var/lib/jenkins/email-templates
cd /var/lib/jenkins/email-templates
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://kefeng.wang/2017/01/06/jenkins/

END

相關文章
相關標籤/搜索