在前文《 如何让自己少写点bug? 》中已经讨论过 持续集成系统 (简称CI系统)的重要性,它是企业级开代码质量的 重要防护网 !持续集成开源工具鳞次栉比,但企业级开发用得最广泛的工具当属Jenkins系统,国内很多的通信大厂、互联网大厂都正在使用中!
Jenkins一直是开源CI&CD软件领导者, 安装简易、配置简单、提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。Jenkins 支持各种运行方式,可通过系统包安装、也可以作为Java程序安装,甚至可以通过Docker来安装。而且Jenkins在企业级开发中可以非常便捷地与SVN、Git等代码管理工具无缝对接!
很多人(或项目)使用Jenkins系统目光还仅仅局限于在Jenkins上建议各种各样的Job来完成CI任务,熟不知该种方式随着Jenkins 2.0版本的发布而逐渐淘汰了, Jenkins 2.0的Pipeline 才是大趋势。
已经步入 2.0时代 的Jenkins系统,最大的特色便是加入了 Pipeline流水线 功能,Pipeline的加持,让Jenkins系统对项目做持续集成时变得更加灵活和强大。
Pipeline是 Jenkins 2.0版本 的精华所在,是帮助Jenkins实现 从CI到CD 华丽转身的关键工具!
所谓Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的 复杂发布流程 。
Pipeline的实现方式是基于一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins 2.0 Pipeline支持从代码仓库(Git/SVN)直接读取脚本,从而实现了 Pipeline as Code 的理念。
这里主要结合我自己对传统Jenkins Job使用的一些 痛点 来说:
传统的Jenkins Job难以灵活高效地并行(Job间、节点间、任务间、甚至任务内四个维度的并行)
传统的Jenkins Job日益失控的趋势让我们措手不及,Job太多,CI脚本太离散,维护成本实在太高了,而且很危险,一单Jenkins Server挂了,一切都Game Over了
新拉分支的分支代码CI部署太麻烦了
传统的Jenkins Job显示真的是不太直观啊
我想这些理由应该足以让我们把目光转向Jenkins 2.0新增的Pipeline功能!
可暂停性 :Pipeline基于Groovy脚本可以实现Job的暂停和等待用户的输入或批准然后继续执行。2. 更灵活的并行任务 :通过Groovy脚本可以实现Step,Stage间的并行执行,和更复杂的相互依赖关系。
可扩展性 :通过Groovy的脚本编程更容易按需扩展CI任务。
优雅型性 : 设计Pipeline = 设计代码 ,非常符合程序员思维
As Code:集中管理CI脚本、用代码库来管理脚本、从代码库直接读取脚本,从而可以将项目CI迅速拉起来!
Pipeline为用户设计了三个最最基本的概念:
Stage :一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
Node :一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
Step:Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。
一个典型的Stage View如下图所示:
从图中可以十分方便地看到哪些Stage通过,哪些Stage失败,以及构建的时间。
Jenkins 2.0的Pipeline搭建使用的是Groovy脚本,通过Groovy脚本实现工作流管理的步骤如下:
去Jenkins主界面建立Pipeline任务
实际上更常用的是 MultiBranch Pipeline (即多分支的Pipeline),上面的图中截图没有包含,但与普通Pipeline基本类似。
使用Groovy脚本自定义工作流
上图的实例脚本如下:
开始执行Pipeline
构建过程的stage View如下:
很明显可以看出,这里显示的和Groovy脚本中格式化的代码是一致的,会实时显示各个工作流的执行进度和结果,直观易懂。鼠标移上去,能看到日志信息的缩略图,单击可以调到对应stage的console中。
总而言之,一切都是那么地优雅!
在这里总结一下Pipeline中的关键DSL语法,利用Groovy对其进行组合可以完成任何一项复杂的CI/CD流程,熟悉它们大有裨益。
archiveArtifacts
归档文件,举例:
bat
执行windows平台下的批处理文件,如
build
触发构建一个jenkins job,如
checkout
从SCM系统中checkout repo,如:
deleteDir()
从workspace中删除当前目录
dir
切换目录,如
dir('/home/jenkins'){// 切换到/home/jenkins目录中做一些事情 // some block }
echo
打印信息,如 echo 'hello world'
emailtext
利用Jenkins发送邮件,内容、主题全都可以自定义,如
emailext body:'Subject_test',subject:'Subject_test',to:'hansonwang99@163.com.cn' // 邮件的正文body,主题subject,收件人to等可以进行自定义
error
抛出一个错误信号,可以自行在代码里抛出,如 error 'read_error'
fileExists
检查工作空间某个路径里是否存在某个file,举例:
input
等待外界用户的交互输入,举例:
isUnix
用于判断当前任务是否运行于Unix-like节点上,举例:
defflag =isUnix() if(flag ==false){// 可以据此进行判断 echo "not run on a unix node !" }
load
调用一个外部groovy脚本,举例:
node
分配节点给某个任务运行,举例:
parallel
并行地执行任务,可以说是最实用高效的工具了,举例:
properties :
设置Job的属性,举例:
pwd
显示当前目录
从工作空间中读取文件,举例:
retry
重复body内代码N次,举例:
sh
执行shell脚本,如:sh "sh test.sh"
sleep
延时,如延时2小时:sleep time: 2, unit: 'HOURS'
stage
创建任务的stage,举例:
stash
存放文件为后续构建使用,举例:
unstash
将stash步骤中存放的文件在当前工作空间中重建,举例:
timeout
时间限制,举例
timestamps
用于在控制台加时间戳,举例:
touch
创建文件,举例:
unzip
解压文件,举例:
validateDeclarativePipeline
检查给定的文件是否包含一个有效的Declarative Pipeline,返回T或者F
waitUntil
等待,直到条件满足
withCredentials
使用凭据
withEnv
设置环境变量,注意近本次运行有效!
writeFile
写文件到某个路径
writeJSON
写JSON文件,用法基本同上
zip
创建zip文件
ws
自定义工作空间,在其中做一些工作,效果类似于Dir命令,举例:
后 记
若有错误或者不当之处,可在本公众号内反馈,一起学习交流!
更多热文在此:
● Spring Boot 系列实战文章合集(源码已开源)
● 程序员写简历时必须注意的技术词汇拼写
● 前后端都分离了,该搞个好用的API管理系统了!
● 从一份配置清单详解Nginx服务器配置
● 如何在Windows下像Mac一样优雅的开发
● Docker容器可视化监控中心搭建
● 利用ELK搭建Docker容器化应用日志中心
● 真实IT领域2/8法则,扎心了!
● 一文详解 Linux系统常用监控工具
更多 务实、能看懂、可复现的 技术文章、资源尽在公众号 CodeSheep ,欢迎扫码订阅,第一时间获取更新 :arrow_down::arrow_down::arrow_down: