DevOps - CI/CD - Jenkins


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

作者:王克鋒 
出處:https://kefeng.wang/2017/01/06/jenkins/ 
版權:自由轉載-非商用-非衍生-保持署名,轉載請標明作者和出處。

1 安裝 Jenkins

官網: https://jenkins.io/

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

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
  • 3
  • 4

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
  • 4

1.2.3 基於 Tomcat 安裝

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
  • 2
  • 3

1.3 調整配置文件

## sudo vim /etc/sysconfig/jenkins JENKINS_USER="root" ## 原值 "jenkins" 必須修改,否則權限不足 JENKINS_PORT="8080" ## 原值 "8080" 可以不修改 ## 還有開啟 HTTPS 相關參數,此處不打算開啟,故不作說明
  • 1
  • 2
  • 3
  • 4

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

1.4 啟動

sudo systemctl enable jenkins sudo systemctl restart jenkins
  • 1
  • 2

查看日志文件: 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
  • 2
  • 3

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*"`
  • 1
  • 2
  • 3
  • 4
  • 5

2 基本配置

2.1 登錄

瀏覽器進入 http://centos:8080/ 
首次進入需要輸入初始密碼來解鎖,初始密碼查看方法: sudo cat /var/lib/jenkins/secrets/initialAdminPassword 
jenkins unlock
進入 Jenkins 定制界面,讓選擇 Install suggested plugins 或 Select plugins to install 時,兩者都不要選,直接關閉,下一個界面點擊“Start using Jenkins”; 
jenkins customize
修改登錄密碼:主界面右上角“注銷”鏈接的左邊的用戶名下拉菜單中點“設置”。

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 插件即生效。如遇失敗可重試或離線安裝。 
jenkins plugins

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 
jenkins tools

3 Maven(SVN) 項目接入

3.1 准備 SVN 源碼

使用 alibaba 的 fastjson 來演示: 
下載: https://github.com/alibaba/fastjson/archive/master.zip 
SVN地址: svn://centos/repo1/fastjson

3.2 安裝相關插件

3.3 新建構建項目

3.3.1 開始創建

主頁:點擊“新建”; 
項目類型:輸入項目名稱 fastjson,類型選擇“構建一個Maven項目”(如果沒有此項可選,請檢查插件“Maven Integration plugin”是否已安裝); 
jenkins create

3.3.2 源碼管理

選擇“Subversion”(如果沒有此項可選,請檢查插件“Subversion Plug-in”是否已安裝), 
倉庫URL可以指定 svn/http/https 之一,這里指定 svn://centos/repo1/fastjson 
Credentials: 添加 SVN 用戶名密碼,並從下拉列表中選擇它。 
jenkins source

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為間隔 ## “日程表”修改后,下方會給出下次執行時間點的預告。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

jenkins trigger

3.3.4 版本提交觸發構建

構建觸發器: 只選中 Poll SCM,可指定檢查 SVN 代碼是否有提交的時間:

## 格式與 "Build periodically" 相同 H/10 * * * * ## 任何時候,每隔 30 分鍾就檢測一次 SVN,如果有提交就啟動構建
  • 1
  • 2

jenkins trigger

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
  • 1
  • 2
  • 3
  • 4
  • 5

jenkins poststep

3.4 手工觸發構建

進入 My Views, 右側看到各個項目; 
點擊進入關注的項目,點擊左側的“立即構建”; 
jenkins build
開始構建或構建完畢后,左下方列出每次構建的鏈接,點擊進入某次構建; 
點擊左側的“Console Output”,可查看構建日志,如有報錯可以看到; 
jenkins console
糾正錯誤后,返回到工程,再次點擊“立即構建”,直至構建成功; 
如有網絡相關報錯,重試幾次也會成功。

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

4.3 修改 Jenkins 構建配置

jenkins findbugs config

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 
jenkins findbugs report

5 開啟郵件報告

Jenkins 的郵件發送,原理與郵件客戶端一樣:把發件人的郵箱帳號、密碼、SMTP服務器告訴 Jenkins,Jenkins 需要時使用該帳號向指定的收件人發送郵件報告。

5.1 安裝相關插件

Jenkins 自帶郵件插件(Mailer Plugin)的功能很弱且無法自定制, 
需要安裝擴展郵件插件: Email Extension Plugin

5.2 全局統一設置

以 admin@company.com 為例,如下圖設置: 
jenkins email-global

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: 構建通知:PROJECTNAME#PROJECTNAME−#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/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

也可以自定義 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
  • 1
  • 2
  • 3
  • 4

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”中的人員發送郵件;

jenkins email-project

5.4 驗證構建報告郵件

分別按以下三種情形觸發構建,都能看到構建報告郵件: 
- 手工觸發:進入工程后,點擊“立即構建”; 
- 定時觸發構建:“構建觸發器”只選中 Build periodically; 
- 版本提交觸發構建:“構建觸發器”只選中 Poll SCM。 
jenkins email-report

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6.2 修改 Jenkins 構建配置

“Build”標簽頁,Goals and options:確保去掉-Dmaven.test.skip=true即可。

6.3 構建后查看單元測試報告

jenkins findbugs report

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

7.3 調整項目的構建設置

項目的構建設置 Post Build Action 中,增加 “Record JaCoCo coverage report”,並設置期望的覆蓋率閾值。 
jenkins jacoco-config

7.4 構建並查看報告

構建完成后,點擊本次構建頁的“Coverage Report”查看報告: 
jenkins jacoco-report

8 更多有用插件

  • Folders Plugin:可嵌套地定義文件夾來級別 views / jobs;
  • build timeout plugin:允許用戶中止耗時太久的構建;
  • Dingding[釘釘] Plugin:允許向阿里釘釘發送構建通知;
  • TestNG Results Plugin: 用 TestNG 代替 JUnit;
  • Publish Over SSH: 通過SSH發布文件或執行命令(使用SFTP的SCP)。
版權聲明:【自由轉載-非商用-非衍生-保持署名】-轉載請標明作者和出處。 https://blog.csdn.net/kefengwang/article/details/54233584

 

構建Docker鏡像

主要過程是:

調用 Jenkins 命令從代碼倉庫拉取代碼,並打包代碼。

Jenkins通過webhook自動觸發構建任務

調用 Docker /build 和 /images/push 命令構建鏡像,並將鏡像推送到私有鏡像倉庫中

寫好配置文件,dockerfile,有新代碼上傳,拉取代碼,觸發docker build根據dockerfile自動構建鏡像,並上傳到倉庫

調用 Docker /containers/create 和 /containers/start 命令創建並啟動容器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM