书海网短评:
适读人群:希望通过Jenkins实现持续集成、持续交付、DevOps,以提升团队生产力的技术人员和管理人员。实战Jenkins2.x核心特性:pipelineascode|持续集成|持续交付|ChatOps|自动化运
实战Jenkins2.x核心特性:pipelineascode|持续集成|持续交付|ChatOps|自动化运维
《Jenkins2.x实践指南》首先介绍笔者对软件工程生产力的独到见解,然后通过一个Helloworld示例带领初学者入门Jenkinspipeline,接下来详细介绍Jenkinspipeline的语法,在Jenkinspipeline中如何实现持续集成、持续交付的各个阶段,包括构建、测试、制品管理、部署等,以及当现有pipeline的步骤不能满足需求时,扩展Jenkinspipeline的多种方式。最后介绍Jenkins如何整合多个第三方系统,以实现ChatOps及自动化运维;为避免读者出现“不知从哪里下手”的情况,《Jenkins 2.x实践指南》通过一个简单的案例介绍如何设计pipeline。
《Jenkins2.x实践指南》的读者对象包括:希望通过Jenkins实现持续集成、持续交付、DevOps,以提升团队生产力的技术人员和管理人员。
1关于软件工程生产力1
1.1从另一个角度看“提高软件工程生产力”1
1.1.1从劳动力要素考虑提高软件工程生产力2
1.1.2从劳动对象要素考虑提高软件工程生产力2
1.1.3从生产工具要素考虑提高软件工程生产力3
1.1.4生产力三要素的意义3
1.2Jenkins介绍4
1.3Jenkins与DevOps4
1.4本章小结5
2pipeline入门6
2.1pipeline是什么6
2.2Jenkinsfile又是什么7
2.3pipeline语法的选择7
2.4创建第一个pipeline9
2.5从版本控制库拉取pipeline11
2.6使用Maven构建Java应用12
2.7本章小结15
3pipeline语法讲解16
3.1必要的Groovy知识16
3.2pipeline的组成18
3.2.1pipeline最简结构18
3.2.2步骤19
3.3post部分20
3.4pipeline支持的指令21
3.5配置pipeline本身22
3.6在声明式pipeline中使用脚本24
3.7pipeline内置基础步骤25
3.7.1文件目录相关步骤25
3.7.2制品相关步骤27
3.7.3命令相关步骤28
3.7.4其他步骤29
3.7.5小贴士31
3.8本章小结36
4环境变量与构建工具37
4.1环境变量37
4.1.1Jenkins内置变量37
4.1.2自定义pipeline环境变量38
4.1.3自定义全局环境变量39
4.2构建工具40
4.2.1构建工具的选择40
4.2.2tools指令介绍41
4.2.3JDK环境搭建41
4.2.4Maven42
4.2.5Go语言环境搭建45
4.2.6Python环境搭建46
4.3利用环境变量支持更多的构建工具47
4.4利用tools作用域实现多版本编译48
4.5本章小结49
5代码质量50
5.1静态代码分析50
5.1.1代码规范检查50
5.1.2使用PMD进行代码规范检查51
5.1.3各静态代码分析器之间的区别53
5.2单元测试53
5.2.1JUnit单元测试报告53
5.2.2JaCoCo实现代码覆盖率55
5.2.3代码覆盖率越高,软件的质量就越高吗58
5.3性能测试59
5.3.1准备性能测试环境59
5.3.2运行JMeter测试59
5.4SonarQube:持续代码质量检查61
5.4.1Maven与SonarQube集成62
5.4.2Jenkins与SonarQube集成64
5.4.3使用SonarQubeScanner实现代码扫描67
5.4.4SonarQube集成p3c68
5.4.5将分析报告推送到GitLab70
5.5Allure测试报告:更美观的测试报告72
5.5.1Allure测试报告介绍72
5.5.2集成Allure、Maven、Jenkins73
5.6当我们谈质量时,谈的是什么76
5.7本章小结76
6触发pipeline执行77
6.1什么是触发条件77
6.2时间触发77
6.2.1定时执行:cron77
6.2.2轮询代码仓库:pollSCM79
6.3事件触发79
6.3.1由上游任务触发:upstream79
6.3.2GitLab通知触发80
6.3.3在pipeline中实现GitLabtrigger84
6.4将构建状态信息推送到GitLab85
6.5使用GenericWebhookTrigger插件实现触发87
6.5.1从Webhook请求中提取参数值89
6.5.2触发具体某个Jenkins项目90
6.5.3根据请求参数值判断是否触发Jenkins项目执行91
6.5.4控制打印内容91
6.5.5控制响应92
6.6本章小结92
7多分支构建93
7.1创建多分支pipeline93
7.2根据分支部署到不同的环境96
7.3when指令的用法97
7.4GitLabtrigger对多分支pipeline的支持99
7.5GenericWebhookTrigger插件在多分支pipeline场景下的应用99
7.6本章小结100
8参数化pipeline101
8.1什么是参数化pipeline101
8.2使用parameters指令101
8.2.1parameters指令支持的参数类型102
8.2.2多参数104
8.3由另一个pipeline传参并触发104
8.4使用ConditionalBuildStep插件处理复杂的判断逻辑106
8.5使用input步骤107
8.5.1input步骤的简单用法108
8.5.2input步骤的复杂用法109
8.6小贴士111
8.6.1获取上游pipeline的信息111
8.6.2设置手动输入步骤超时后,pipeline自动中止111
8.7本章小结111
9凭证管理112
9.1为什么要管理凭证112
9.2凭证是什么112
9.3创建凭证113
9.4常用凭证114
9.4.1Secrettext114
9.4.2Usernamewithpassword115
9.4.3Secretfile115
9.4.4SSHUsernamewithprivatekey116
9.5优雅地使用凭证117
9.6使用HashiCorpVault118
9.6.1HashiCorpVault介绍118
9.6.2集成HashiCorpVault118
9.7在Jenkins日志中隐藏敏感信息120
9.8本章小结122
10制品管理123
10.1制品是什么123
10.2制品管理仓库123
10.3过渡到制品库124
10.4管理Java栈制品125
10.4.1使用Maven发布制品到Nexus中125
10.4.2使用Nexus插件发布制品127
10.5使用Nexus管理Docker镜像128
10.5.1Nexus:创建Docker私有仓库129
10.5.2创建Docker私有仓库凭证130
10.5.3构建并发布Docker镜像130
10.5.4小贴士131
10.6管理原始制品131
10.6.1创建raw仓库131
10.6.2上传制品,获取制品132
10.7从其他pipeline中拷贝制品134
10.8版本号管理135
10.8.1语义化版本135
10.8.2版本号的作用136
10.8.3方便生成版本号的VersionNumber插件137
10.9小贴士138
10.9.1Nexus匿名用户权限问题138
10.9.2制品库的容量要大139
10.10本章小结139
11可视化构建及视图140
11.1GreenBalls插件140
11.2BuildMonitorView插件141
11.3使用视图143
11.3.1使用项目的维度建立视图143
11.3.2设置默认视图145
11.4本章小结146
12自动化部署147
12.1关于部署有什么好说的147
12.1.1部署不等于发布147
12.1.2什么是自动化部署148
12.1.3自动化运维工具解决的问题148
12.2Jenkins集成Ansible实现自动化部署149
12.2.1Ansible介绍149
12.2.2Jenkins与Ansible集成150
12.2.3Ansible插件详解153
12.3手动部署比自动化部署更可靠吗156
12.4如何开始自动化部署157
12.5小贴士158
12.6本章小结159
13通知160
13.1邮件通知160
13.1.1使用Jenkins内置邮件通知功能160
13.1.2使用EmailExtension插件发送通知162
13.2钉钉通知164
13.3HTTP请求通知166
13.4本章小结168
14分布式构建与并行构建169
14.1Jenkins架构169
14.2增加agent170
14.2.1对agent打标签170
14.2.2通过JNLP协议增加agent171
14.2.3通过JNLP协议增加Windowsagent175
14.2.4通过Swarm插件增加agent175
14.2.5agent部分详解176
14.2.6小结180
14.3将构建任务交给Docker180
14.3.1在Jenkinsagent上安装Docker180
14.3.2使用Docker180
14.3.3配置Docker私有仓库181
14.4并行构建182
14.4.1在不同的分支上应用并行构建183
14.4.2并行步骤184
14.4.3并行阶段与并行步骤之间的区别185
14.5本章小结185
15扩展pipeline186
15.1为什么要扩展pipeline186
15.2在pipeline中定义函数186
15.3使用共享库扩展187
15.3.1创建共享库187
15.3.2使用共享库189
15.3.3@Library的更多用法189
15.3.4共享库结构详细介绍190
15.3.5使用共享库实现pipeline模板192
15.4通过Jenkins插件实现pipeline步骤193
15.4.1生成Jenkins插件代码骨架193
15.4.2启动Jenkins测试:mvnhpi:run196
15.4.3在Jenkinsfile中使用greet步骤196
15.4.4全局配置插件197
15.5本章小结199
16Jenkins运维200
16.1认证管理200
16.1.1使用Jenkins自带的用户数据库200
16.1.2使用LDAP认证202
16.2授权管理204
16.2.1使用Role-basedAuthorizationStrategy插件授权205
16.2.2管理角色206
16.2.3权限大全207
16.2.4角色分配208
16.2.5小结210
16.3Jenkins监控210
16.3.1使用Monitoring插件监控210
16.3.2使用Prometheus监控211
16.4Jenkins备份213
16.4.1JENKINS_HOME介绍213
16.4.2使用PeriodicBackup插件进行备份214
16.5汉化216
16.6Jenkins配置即代码216
16.7使用init.groovy配置Jenkins217
16.8本章小结219
17自动化运维经验220
17.1小团队自动化运维实践经验220
17.1.1先做监控和告警220
17.1.2一开始就应该做配置版本化223
17.1.3Jenkins化:将打包工作交给Jenkins223
17.1.4将制品交给Nexus管理224
17.1.5让Jenkins帮助我们执行Ansible225
17.1.6小结225
17.2ChatOps实践226
17.2.1Rocket.Chat226
17.2.2Hubot227
17.2.3Hubot与Jenkins集成229
17.2.4Jenkins推送消息到Rocket.Chat231
17.3本章小结231
18如何设计pipeline232
18.1设计pipeline的步骤232
18.2以X网站为例,设计pipeline233
18.3X网站pipeline详解236
18.3.1尽可能将所有的具体操作都隐藏到共享库中236
18.3.2只生成一次制品236
18.3.3对不同环境采用同一种部署方式237
18.3.4配置版本化238
18.3.5系统集成测试238
18.3.6如何实现指定版本部署238
18.3.7主干开发,分支发布239
18.4本章小结239
2016年4月Jenkins发布了2.0版本(https://jenkins.io/blog/2016/04/26/jenkins-20-is-here/),开始支持pipelineascode。同年11月,pipelineascode作为“采用”项出现在ThoughtWorks技术雷达(https://www.infoq.cn/article/2016%2F11%2Fthoughtworks-radar-forecast)的采用环中。
2019年1月,笔者见同行在微信群里吐槽Jenkins的老旧,比如Jenkins不支持手动stage。经过了解,笔者大概猜到这位朋友还在使用Jenkins1.x,或者知识还停留在Jenkins1.x上。因为他说的问题,在Jenkins2.x中已经不存在了。
这里并不是想说这位朋友不了解Jenkins2.x,而是想说Jenkins1.x已经成为过去式。长期以来,在中文网站上能搜到的关于Jenkins的文章大多停留在Jenkins1.x时代。这样想来,也就能理解为什么这位朋友会有这样的误解了。
自Jenkins2.0发布已有三个年头,据笔者所知,目前市面上还没有pipelineascode实践方面的书籍。中文的Jenkins书籍,只有《Jenkins权威指南》一本,其中也并没有pipelineascode方面的介绍。《Jenkins 2.x实践指南》弥补了这一空白,系统地介绍了Jenkins2.x的pipelineascode。
《Jenkins 2.x实践指南》第1章介绍笔者对软件工程生产力的独到见解;第2章通过一个Helloworld示例带领初学者入门Jenkinspipeline;第3章详细介绍Jenkinspipeline的语法;第4-14章介绍在Jenkinspipeline中如何实现持续集成、持续交付的各个阶段,包括构建、测试、制品管理、部署等;第15章介绍扩展Jenkinspipeline的多种方式,本章对希望通过Jenkins实现持续集成、持续交付平台的读者非常有帮助;第16章介绍Jenkins运维相关知识;第17章介绍笔者整合Jenkins与多个第三方系统,实现ChatOps及自动化运维的经验;为避免读者出现“不知从哪里下手”的情况,第18章通过一个简单的案例介绍如何设计pipeline。
笔者建议所有读者都要阅读第1章和第3章,它们是《Jenkins 2.x实践指南》的核心;已经入门了Jenkinspipeline的读者可以跳过第2章;而第4-14章可以作为参考手册使用。
《Jenkins 2.x实践指南》适合对Jenkins有初步认识,希望通过Jenkins实现持续集成、持续交付、DevOps的技术人员,以及希望了解pipelineascode技术在实际工作中如何应用的读者。
最后,感谢策划编辑郑柳洁女士为《Jenkins 2.x实践指南》付出的努力;感谢刘杜康和黄献华在百忙之中对部分章节的审校;感谢黄峰达在出版方面的帮助;感谢王晓峰在部署目录命名方面的建议;感谢志平帮助处理我的个人照片;感谢妻子的理解与支持。









