翟志軍 著
適讀人群 :希望通過Jenkins實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、DevOps,以提升團(tuán)隊(duì)生產(chǎn)力的技術(shù)人員和管理人員。
實(shí)戰(zhàn)Jenkins 2.x核心特性:pipeline as code|持續(xù)集成|持續(xù)交付|ChatOps|自動(dòng)化運(yùn)維
《Jenkins 2.x 實(shí)踐指南》首先介紹筆者對軟件工程生產(chǎn)力的獨(dú)到見解,然后通過一個(gè)Hello world 示例帶領(lǐng)初學(xué)者入門Jenkins pipeline,接下來詳細(xì)介紹Jenkins pipeline 的語法,在Jenkins pipeline 中如何實(shí)現(xiàn)持續(xù)集成、持續(xù)交付的各個(gè)階段,包括構(gòu)建、測試、制品管理、部署等,以及當(dāng)現(xiàn)有pipeline 的步驟不能滿足需求時(shí),擴(kuò)展Jenkins pipeline 的多種方式。最后介紹Jenkins 如何整合多個(gè)第三方系統(tǒng),以實(shí)現(xiàn)ChatOps 及自動(dòng)化運(yùn)維;為避免讀者出現(xiàn)“不知從哪里下手”的情況,本書通過一個(gè)簡單的案例介紹如何設(shè)計(jì)pipeline。
《Jenkins 2.x 實(shí)踐指南》的讀者對象包括:希望通過Jenkins 實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、DevOps,以提升團(tuán)隊(duì)生產(chǎn)力的技術(shù)人員和管理人員。
1 關(guān)于軟件工程生產(chǎn)力1
1.1 從另一個(gè)角度看“提高軟件工程生產(chǎn)力” 1
1.1.1 從勞動(dòng)力要素考慮提高軟件工程生產(chǎn)力 2
1.1.2 從勞動(dòng)對象要素考慮提高軟件工程生產(chǎn)力 2
1.1.3 從生產(chǎn)工具要素考慮提高軟件工程生產(chǎn)力 3
1.1.4 生產(chǎn)力三要素的意義3
1.2 Jenkins 介紹 4
1.3 Jenkins 與DevOps 4
1.4 本章小結(jié) 5
2 pipeline 入門6
2.1 pipeline 是什么 6
2.2 Jenkinsfile 又是什么 7
2.3 pipeline 語法的選擇 7
2.4 創(chuàng)建第一個(gè)pipeline 9
2.5 從版本控制庫拉取pipeline 11
2.6 使用Maven 構(gòu)建Java 應(yīng)用 12
2.7 本章小結(jié) 15
3 pipeline 語法講解16
3.1 必要的Groovy 知識 16
3.2 pipeline 的組成 18
3.2.1 pipeline 最簡結(jié)構(gòu) 18
3.2.2 步驟 19
3.3 post 部分 20
3.4 pipeline 支持的指令 21
3.5 配置pipeline 本身 22
3.6 在聲明式pipeline 中使用腳本 24
3.7 pipeline 內(nèi)置基礎(chǔ)步驟 25
3.7.1 文件目錄相關(guān)步驟 25
3.7.2 制品相關(guān)步驟 27
3.7.3 命令相關(guān)步驟 28
3.7.4 其他步驟 29
3.7.5 小貼士 31
3.8 本章小結(jié) 36
4 環(huán)境變量與構(gòu)建工具37
4.1 環(huán)境變量 37
4.1.1 Jenkins 內(nèi)置變量 37
4.1.2 自定義pipeline 環(huán)境變量 38
4.1.3 自定義全局環(huán)境變量 39
4.2 構(gòu)建工具 40
4.2.1 構(gòu)建工具的選擇 40
4.2.2 tools 指令介紹 41
4.2.3 JDK 環(huán)境搭建 41
4.2.4 Maven 42
4.2.5 Go 語言環(huán)境搭建 45
4.2.6 Python 環(huán)境搭建 46
4.3 利用環(huán)境變量支持更多的構(gòu)建工具 47
4.4 利用tools 作用域?qū)崿F(xiàn)多版本編譯 48
4.5 本章小結(jié) 49
5 代碼質(zhì)量50
5.1 靜態(tài)代碼分析 50
5.1.1 代碼規(guī)范檢查 50
5.1.2 使用PMD 進(jìn)行代碼規(guī)范檢查 51
5.1.3 各靜態(tài)代碼分析器之間的區(qū)別 53
5.2 單元測試 53
5.2.1 JUnit 單元測試報(bào)告 53
5.2.2 JaCoCo 實(shí)現(xiàn)代碼覆蓋率 55
5.2.3 代碼覆蓋率越高,軟件的質(zhì)量就越高嗎 58
5.3 性能測試 59
5.3.1 準(zhǔn)備性能測試環(huán)境 59
5.3.2 運(yùn)行JMeter 測試 59
5.4 SonarQube:持續(xù)代碼質(zhì)量檢查 61
5.4.1 Maven 與SonarQube 集成 62
5.4.2 Jenkins 與SonarQube 集成 64
5.4.3 使用SonarQube Scanner 實(shí)現(xiàn)代碼掃描 67
5.4.4 SonarQube 集成p3c 68
5.4.5 將分析報(bào)告推送到GitLab 70
5.5 Allure 測試報(bào)告:更美觀的測試報(bào)告 72
5.5.1 Allure 測試報(bào)告介紹 72
5.5.2 集成Allure、Maven、Jenkins 73
5.6 當(dāng)我們談質(zhì)量時(shí),談的是什么 76
5.7 本章小結(jié) 76
6 觸發(fā)pipeline 執(zhí)行77
6.1 什么是觸發(fā)條件 77
6.2 時(shí)間觸發(fā) 77
6.2.1 定時(shí)執(zhí)行:cron 77
6.2.2 輪詢代碼倉庫:pollSCM 79
6.3 事件觸發(fā) 79
6.3.1 由上游任務(wù)觸發(fā):upstream 79
6.3.2 GitLab 通知觸發(fā) 80
6.3.3 在pipeline 中實(shí)現(xiàn)GitLab trigger 84
6.4 將構(gòu)建狀態(tài)信息推送到GitLab 85
6.5 使用Generic Webhook Trigger 插件實(shí)現(xiàn)觸發(fā) 87
6.5.1 從Webhook 請求中提取參數(shù)值 89
6.5.2 觸發(fā)具體某個(gè)Jenkins 項(xiàng)目 90
6.5.3 根據(jù)請求參數(shù)值判斷是否觸發(fā)Jenkins 項(xiàng)目執(zhí)行 91
6.5.4 控制打印內(nèi)容 91
6.5.5 控制響應(yīng) 92
6.6 本章小結(jié) 92
7 多分支構(gòu)建93
7.1 創(chuàng)建多分支pipeline 93
7.2 根據(jù)分支部署到不同的環(huán)境 96
7.3 when 指令的用法 97
7.4 GitLab trigger 對多分支pipeline 的支持 99
7.5 Generic Webhook Trigger 插件在多分支pipeline 場景下的應(yīng)用 99
7.6 本章小結(jié) 100
8 參數(shù)化pipeline 101
8.1 什么是參數(shù)化pipeline 101
8.2 使用parameters 指令 101
8.2.1 parameters 指令支持的參數(shù)類型 102
8.2.2 多參數(shù) 104
8.3 由另一個(gè)pipeline 傳參并觸發(fā) 104
8.4 使用Conditional BuildStep 插件處理復(fù)雜的判斷邏輯 106
8.5 使用input 步驟 107
8.5.1 input 步驟的簡單用法 108
8.5.2 input 步驟的復(fù)雜用法 109
8.6 小貼士 111
8.6.1 獲取上游pipeline 的信息 111
8.6.2 設(shè)置手動(dòng)輸入步驟超時(shí)后,pipeline 自動(dòng)中止 111
8.7 本章小結(jié) 111
9 憑證管理112
9.1 為什么要管理憑證 112
9.2 憑證是什么 112
9.3 創(chuàng)建憑證 113
9.4 常用憑證 114
9.4.1 Secret text 114
9.4.2 Username with password 115
9.4.3 Secret file 115
9.4.4 SSH Username with private key 116
9.5 優(yōu)雅地使用憑證 117
9.6 使用HashiCorp Vault 118
9.6.1 HashiCorp Vault 介紹 118
9.6.2 集成HashiCorp Vault 118
9.7 在Jenkins 日志中隱藏敏感信息 120
9.8 本章小結(jié) 122
10 制品管理123
10.1 制品是什么 123
10.2 制品管理倉庫 123
10.3 過渡到制品庫 124
10.4 管理Java 棧制品 125
10.4.1 使用Maven 發(fā)布制品到Nexus 中 125
10.4.2 使用Nexus 插件發(fā)布制品 127
10.5 使用Nexus 管理Docker 鏡像 128
10.5.1 Nexus:創(chuàng)建Docker 私有倉庫 129
10.5.2 創(chuàng)建Docker 私有倉庫憑證 130
10.5.3 構(gòu)建并發(fā)布Docker 鏡像 130
10.5.4 小貼士 131
10.6 管理原始制品 131
10.6.1 創(chuàng)建raw 倉庫 131
10.6.2 上傳制品,獲取制品 132
10.7 從其他pipeline 中拷貝制品 134
10.8 版本號管理 135
10.8.1 語義化版本 135
10.8.2 版本號的作用 136
10.8.3 方便生成版本號的Version Number 插件 137
10.9 小貼士 138
10.9.1 Nexus 匿名用戶權(quán)限問題 138
10.9.2 制品庫的容量要大 139
10.10 本章小結(jié) 139
11 可視化構(gòu)建及視圖140
11.1 Green Balls 插件 140
11.2 Build Monitor View 插件 141
11.3 使用視圖 143
11.3.1 使用項(xiàng)目的維度建立視圖 143
11.3.2 設(shè)置默認(rèn)視圖 145
11.4 本章小結(jié) 146
12 自動(dòng)化部署147
12.1 關(guān)于部署有什么好說的 147
12.1.1 部署不等于發(fā)布 147
12.1.2 什么是自動(dòng)化部署 148
12.1.3 自動(dòng)化運(yùn)維工具解決的問題 148
12.2 Jenkins 集成Ansible 實(shí)現(xiàn)自動(dòng)化部署 149
12.2.1 Ansible 介紹 149
12.2.2 Jenkins 與Ansible 集成 150
12.2.3 Ansible 插件詳解 153
12.3 手動(dòng)部署比自動(dòng)化部署更可靠嗎 156
12.4 如何開始自動(dòng)化部署 157
12.5 小貼士 158
12.6 本章小結(jié) 159
13 通知160
13.1 郵件通知 160
13.1.1 使用Jenkins 內(nèi)置郵件通知功能 160
13.1.2 使用Email Extension 插件發(fā)送通知 162
13.2 釘釘通知 164
13.3 HTTP 請求通知 166
13.4 本章小結(jié) 168
14 分布式構(gòu)建與并行構(gòu)建 169
14.1 Jenkins 架構(gòu) 169
14.2 增加agent 170
14.2.1 對agent 打標(biāo)簽 170
14.2.2 通過JNLP 協(xié)議增加agent 171
14.2.3 通過JNLP 協(xié)議增加Windows agent 175
14.2.4 通過Swarm 插件增加agent 175
14.2.5 agent 部分詳解 176
14.2.6 小結(jié) 180
14.3 將構(gòu)建任務(wù)交給Docker 180
14.3.1 在Jenkins agent 上安裝Docker 180
14.3.2 使用Docker 180
14.3.3 配置Docker 私有倉庫 181
14.4 并行構(gòu)建 182
14.4.1 在不同的分支上應(yīng)用并行構(gòu)建 183
14.4.2 并行步驟 184
14.4.3 并行階段與并行步驟之間的區(qū)別 185
14.5 本章小結(jié) 185
15 擴(kuò)展pipeline 186
15.1 為什么要擴(kuò)展pipeline 186
15.2 在pipeline 中定義函數(shù) 186
15.3 使用共享庫擴(kuò)展 187
15.3.1 創(chuàng)建共享庫 187
15.3.2 使用共享庫 189
15.3.3 @Library 的更多用法 189
15.3.4 共享庫結(jié)構(gòu)詳細(xì)介紹 190
15.3.5 使用共享庫實(shí)現(xiàn)pipeline 模板 192
15.4 通過Jenkins 插件實(shí)現(xiàn)pipeline 步驟 193
15.4.1 生成Jenkins 插件代碼骨架 193
15.4.2 啟動(dòng)Jenkins 測試:mvn hpi:run 196
15.4.3 在Jenkinsfile 中使用greet 步驟 196
15.4.4 全局配置插件 197
15.5 本章小結(jié) 199
16 Jenkins 運(yùn)維200
16.1 認(rèn)證管理 200
16.1.1 使用Jenkins 自帶的用戶數(shù)據(jù)庫 200
16.1.2 使用LDAP 認(rèn)證 202
16.2 授權(quán)管理 204
16.2.1 使用Role-based Authorization Strategy 插件授權(quán) 205
16.2.2 管理角色 206
16.2.3 權(quán)限大全 207
16.2.4 角色分配 208
16.2.5 小結(jié) 210
16.3 Jenkins 監(jiān)控 210
16.3.1 使用Monitoring 插件監(jiān)控 210
16.3.2 使用Prometheus 監(jiān)控 211
16.4 Jenkins 備份 213
16.4.1 JENKINS_HOME 介紹 213
16.4.2 使用Periodic Backup 插件進(jìn)行備份 214
16.5 漢化 216
16.6 Jenkins 配置即代碼 216
16.7 使用init.groovy 配置Jenkins 217
16.8 本章小結(jié) 219
17 自動(dòng)化運(yùn)維經(jīng)驗(yàn) 220
17.1 小團(tuán)隊(duì)自動(dòng)化運(yùn)維實(shí)踐經(jīng)驗(yàn) 220
17.1.1 先做監(jiān)控和告警 220
17.1.2 一開始就應(yīng)該做配置版本化 223
17.1.3 Jenkins 化:將打包工作交給Jenkins 223
17.1.4 將制品交給Nexus 管理 224
17.1.5 讓Jenkins 幫助我們執(zhí)行Ansible 225
17.1.6 小結(jié) 225
17.2 ChatOps 實(shí)踐 226
17.2.1 Rocket.Chat 226
17.2.2 Hubot 227
17.2.3 Hubot 與Jenkins 集成 229
17.2.4 Jenkins 推送消息到Rocket.Chat 231
17.3 本章小結(jié) 231
18 如何設(shè)計(jì)pipeline 232
18.1 設(shè)計(jì)pipeline 的步驟 232
18.2 以X 網(wǎng)站為例,設(shè)計(jì)pipeline 233
18.3 X 網(wǎng)站pipeline 詳解 236
18.3.1 盡可能將所有的具體操作都隱藏到共享庫中 236
18.3.2 只生成一次制品 236
18.3.3 對不同環(huán)境采用同一種部署方式 237
18.3.4 配置版本化 238
18.3.5 系統(tǒng)集成測試 238
18.3.6 如何實(shí)現(xiàn)指定版本部署 238
18.3.7 主干開發(fā),分支發(fā)布 239
18.4 本章小結(jié)239
2016年4月Jenkins發(fā)布了2.0 版本(https://jenkins.io/blog/2016/04/26/jenkins-20-is-here/),開始支持pipeline as code。同年11 月,pipeline as code作為“采用”項(xiàng)出現(xiàn)在ThoughtWorks 技術(shù)雷達(dá)(https://www.infoq.cn/article/2016%2F11%2Fthoughtworks-radar-forecast)的采用環(huán)中。
2019 年1 月,筆者見同行在微信群里吐槽Jenkins的老舊,比如Jenkins不支持手動(dòng)stage。經(jīng)過了解,筆者大概猜到這位朋友還在使用Jenkins 1.x,或者知識還停留在Jenkins 1.x上。因?yàn)樗f的問題,在Jenkins 2.x中已經(jīng)不存在了。
這里并不是想說這位朋友不了解Jenkins 2.x,而是想說Jenkins 1.x 已經(jīng)成為過去式。長期以來,在中文網(wǎng)站上能搜到的關(guān)于Jenkins 的文章大多停留在Jenkins 1.x 時(shí)代。這樣想來,也就能理解為什么這位朋友會(huì)有這樣的誤解了。
自Jenkins 2.0 發(fā)布已有三個(gè)年頭,據(jù)筆者所知,目前市面上還沒有pipeline as code 實(shí)踐方面的書籍。中文的Jenkins書籍,只有《Jenkins 權(quán)威指南》一本,其中也并沒有pipeline as code 方面的介紹。本書彌補(bǔ)了這一空白,系統(tǒng)地介紹了Jenkins 2.x的pipeline as code。
本書第1章介紹筆者對軟件工程生產(chǎn)力的獨(dú)到見解;第2章通過一個(gè)Hello world 示例帶領(lǐng)初學(xué)者入門Jenkins pipeline;第3章詳細(xì)介紹Jenkins pipeline 的語法;第4-14章介紹在Jenkins pipeline 中如何實(shí)現(xiàn)持續(xù)集成、持續(xù)交付的各個(gè)階段,包括構(gòu)建、測試、制品管理、部署等;第15章介紹擴(kuò)展Jenkins pipeline的多種方式,本章對希望通過Jenkins實(shí)現(xiàn)持續(xù)集成、持續(xù)交付平臺的讀者非常有幫助;第16章介紹Jenkins 運(yùn)維相關(guān)知識;第17章介紹筆者整合Jenkins與多個(gè)第三方系統(tǒng),實(shí)現(xiàn)ChatOps及自動(dòng)化運(yùn)維的經(jīng)驗(yàn);為避免讀者出現(xiàn)“不知從哪里下手”的情況,第18章通過一個(gè)簡單的案例介紹如何設(shè)計(jì)pipeline。
筆者建議所有讀者都要閱讀第1章和第3章,它們是本書的核心;已經(jīng)入門了Jenkins pipeline的讀者可以跳過第2章;而第4-14章可以作為參考手冊使用。
本書適合對Jenkins有初步認(rèn)識,希望通過Jenkins實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、DevOps的技術(shù)人員,以及希望了解pipeline as code技術(shù)在實(shí)際工作中如何應(yīng)用的讀者。
最后,感謝策劃編輯鄭柳潔女士為本書付出的努力;感謝劉杜康和黃獻(xiàn)華在百忙之中對部分章節(jié)的審校;感謝黃峰達(dá)在出版方面的幫助;感謝王曉峰在部署目錄命名方面的建議;感謝志平幫助處理我的個(gè)人照片;感謝妻子的理解與支持。
更多建議: