一.pipeline是什么?
pipeline是部署流水线(Deployment pipeline),指从软件版本控制库到用户手中这一过程的自动化表现形式。
Jenkins 1.x只能通过界面手动配置来配置描述过程,让Jenkins完成任务,例如选择*风格的项目,通过选项等操作进行配置,让jenkins可以下载代码、编译构建、然后部署到远程服务器上。
而Jenkins 2.x终于支持pipeline as code了,可以通过代码来描述部署流水线,还是同样的功能,部分操作通过代码配置运行后,也会在界面里显示出来。
Pipeline 简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
pipeline的功能由pipeline插件提供,有的jenkins会自带,若没有则需要安装。
使用代码而不是UI的意义在于:
- 更好的版本化:将pipeline提交到版本库中进行版本控制
- 更好地协作:pipeline的每次修改对所有人都是可见的。除此之外,还可以对pipeline进行代码审查
- 更好的重用性:手动操作没法重用,但是代码可以重用
二.jenkinsfile是什么
Jenkinsfile就是一个文本文件,里面记录着逻辑,在执行jenkins job的时候,会读取这个文件按照上面的描述来进行各种操作。像Dockerfile之于Docker,Playbook之于Ansible。
Jenkinsfile有2种方式,可以直接在web配置中进行编写,这样只适合临时项目调试或简短的内容。
更多的是将pipeline的脚本在远程仓库上进行管理,这里配置远程仓库地址,让job每次执行的时候拉取这个项目,然后执行其中的某个文件。
可以将脚本放到一个仓库集中管理,也可以放到每个项目中,和代码在一起进行维护,具体方式可以根据公司情况来安排。
三.pipeline语法选择
Jenkins pipeline有2种语法:脚本式(Scripted)语法和声明式(Declar-ative)语法。pipeline插件从2.5版本开始,才同时支持两种格式的语法,推荐使用声明式语法,它的使用人群更广泛,也更好表达维护。
Jenkins团队在一开始实现Jenkins pipeline时,Groovy语言被选择作为基础来实现pipeline。所以,在写pipeline脚本时,就是在写groovy脚本。但区别是,pipeline是在上面封装了一层,需要用固定格式,jenkins才可以识别。
pipeline {
agent any
stages {
stage('pull') {
steps {
git branch: 'master', credentialsId: 'jenkins', url: 'http://代码'
echo '开始拉取代码'
}
}
}
}
按照格式编写,在其中可以加入groovy的脚本,例如循环、判断、添加变量等等。这样的好处是降低了学习成本,例如上面的下载代码的git指令,用groovy单纯实现就如下方式。
"git clone http://代码".execute().text
那如果根据不同分支拉取、配置秘钥等操作,这里还要再增加切换的操作,要单独学习groovy相关的知识。
四.脚本式和声明式
脚本式语法比较灵活,编写清晰简单,groovy的语法可以直接使用套用,例如直接定义个变量。
node () {
def branch = 'test'
stage 'pull'
sh " echo 拉取代码"
stage 'build'
sh " echo 构建代码"
}
声明式的语法在内容多的时候会更清晰
pipeline {
agent any
stages {
stage('pull') {
steps {
echo '拉取代码'
}
}
stage('build') {
steps {
echo '构建代码'
}
}
}
}
对比2个例子,可以发现声明式好像才是复杂的那个。但其实在后续使用中,可以发现脚本式会比较凌乱,就像没用函数的感觉,没有一个标准和结构。脚本式和声明式只是语法上有些区别,对于方法和功能大多都是一样支持的。
五.插件与pipeline
pipeline基本结构决定的是pipeline整体流程,stage代表每个阶段,但实际具体做操作的是pipeline中的每一个步骤。步骤是pipeline中已经不能再拆分的最小操作。像echo执行echo指令,sh执行shell命令。
那是不是说,Jenkins pipeline内置了所有可能需要用到的步骤呢?显然没有必要,因为很多步骤可能永远不会用到。
就像*Jenkins的插件,安装各种插件后,可以在*风格的项目里,看到多出来的选项,进行配置。pipeline也是如此,安装某些插件后,就可以在pipeline中用代码调用插件了。
哪些插件适配了Jenkins pipelien,官方有列表方便检索,步骤具体说明可以查看官方步骤参考文档