如何使用脚本化pipeline
Jenkins是一个开源的持续集成的服务器,提供持续自动化编译和测试。一些任务可以被Jenkins控制和监控,包括从仓库拉代码,执行静态代码分析,编译项目,执行测试,自动化测试然后部署应用。这些任务就是一个典型的持续交付的pipeline。
Pipelines是一套Jenkins插件。Pipelines可以看成是一系类阶段去执行一系列具体的任务,最终实现你的应用的持续发布。这个‘持续’是相对于你应用或者你的环境而言:有时,就与业务需要,你的应用可以需要每天发布,有的需要每周发布。然而,当一个关键的fix完成时,我们总希望,我们可以尽快发布,Pipeline则提供了一种自动化流程帮助我们达到这个目标。
在Jenkins中,Pipelines用特定的DSL来定义其描述和表达。而DSL是和Groovy同样的结构,所以,Goovy的使用者在使用pipeline时就很容易。
从Jenkins 2.0开始,pipeline的功能,无需额外的配置可直接使用。另一个提升是,pipelines可以保存为代码,这样的话,我们就可以开发我们的pipeline脚本并将其纳入我们的版本管理工具中。
在本文中,我们会讨论脚本化的pipeline(Pipeline as Code),介绍其架构和如何使用。
###如何创建Jenkins Pipeline 如上段所述,Jenkins增加了一个内嵌的groovy引擎,使Groovy称为Pipeline's DSL中的脚本语言。我们在创建了一个pipeline project后就可以编写脚本化pipeline的代码块了。
- Node块 我们需要定义的第一个块就是“node",如下
node {
}
一个”node“是Jenkins分发模式架构(工作负载会被发配到多个代理nodes)的一部分 .一个主node会处理你环境中所有内容,Jenkins中的代理node会从主node分走构建任务,然后执行在其中我们定义的pipeline工作。
'node'块不是必须的,但是我们建议使用它,因为只要有可用的node,在其中定义的所有步骤,都会在该node上执行并创建专门的工作目录。
- Stage块 stage块定义如下:
stage {
}
一个pipeline可能包含分好组多个阶段去完成:
1.从仓库中拉代码
2.构建应用
3.部署应用
4.执行功能测试
5.执行性能测试
以上每一步都可能包含多个操作,如部署应用阶段,可能就需要从特定环境中复制文件,然后去部署文件等。每个stage块都定义了这些要去执行的任务。例如,一个脚本化pipeline可能定义如下:
node {
stage (‘Build’) {
bat "msbuild ${C:\\Jenkins\\my_project\\workspace\\test\\my_project.sln}"
}
stage('Selenium tests') {
dir(automation_path) { //changes the path to “automation_path”
bat "mvn clean test -Dsuite=SMOKE_TEST -Denvironment=QA"
}
}
}
这个脚本包含如下阶段:
- 编译阶段: 由一个文件编译项目
- 测试阶段: 切换到相应目录,触发测试
stage块也是可选的,但是我们推荐使用,因为其提供了很好的组织脚本的方式。 Jenkins提供了生成pipeline语句的接口,当我们不知道如何定义一些操作时,可在‘pipeline script’界面,点击‘Pipeline Syntax’去选择操作,生成脚本。
Jenkinsfile
包含你pipeline代码的文件就是Jenkinsfile,我们可以将其放入版本控制中,其好处为:
- 组内的其他成员可以审阅和编辑
- 可以和你的应用一起走版本管理
Jenkinsfile可通过Jenkins web接口或者文档编辑器进行编辑,编辑后,保存为Jenkinsfile并保存到项目中,然后配置Jenkins让其检测到仓库有更新时,可以自动去下载你的仓库,执行该pipeline。
上述过程,可以通过配置“Build Trigger”来完成,使能“Poll SCM”,然后在时间表中输入cron表达式,配置repo。这样,Jenkins就会轮询去检测更新并执行。 更好的方法,是用Git Hooks去完成。
关于安全的一些讨论
Jenkins提供了一个沙盘去限制了Groovy脚本的执行,其保证了脚本可以被任何用户执行,而不需要申请额外的管理员权限。在这种情况下,这个脚本仅仅通过内部允许运行的API执行。 如果我们不选择使用sandbox,则这个脚本的执行则需要管理员批准,这个方法就是‘Script approval’。默认的,所有的Jenkins pipeline都会在Groovy sandbox中执行。如果在这种情况下,未认证的操作被用到,则这个脚本在执行则会失败。函数的白名单和黑名单都可以在‘Script Security’内嵌列表中查看到。