Pipeline 是什么
从某种抽象层次上讲,部署流水线(Deployment pipeline) 是指从软件版本控制库到用户手中这一过程的自动化表现形式。持续交付指的是: 发布可靠软件的系统方法;
按《持续交付》中的定义,Jenkins 本来就支持 pipeline(通常会把部署流水线简称为 pipeline),只是一开始不叫 pipeline,而叫任务。
Jenkins 1.x 只能通过界面手动操作来“描述”部署流水线。Jenkins 2.x终于支持 pipeline as code 了,可以通过“代码” 来描述部署流水线。
使用代码而不是 UI 的意义在于:
- 更好的版本化:将 pipeline 提交到软件版本库中进行版本控制。
- 更好的协作:pipeline 的每次修改对所有人都是可见的。除此之外,还可以对 pipeline 进行代码审查。
- 更好的重用性:手动操作没法重用,但是代码可以重用。
Jenkinsfile 又是什么
Jenkinsfile 就是一个文本文件,也就是部署流水线概念在 Jenkins 中的表现。像 Dockerfile 之于 Docker。所有部署流水线的逻辑都写在 Jenkinsfile 中。
Jenkins 默认是不支持 Jenkinsfile 的。我们需要安装 pipeline 插件,其安装方式与普通插件的安装方式无异。安装完成后,就可以创建 pipeline 项目了。
pipeline 语法的选择
Jenkins 团队在一开始实现 Jenkins pipeline 时,Groovy 语言被选择作为基础来实现 pipeline。所以在写脚本式 pipeline 时,很像是(其实就是)在写 Groovy 代码。这样的确为用户提供了巨大的灵活性和可扩展性,我们还可以在脚本式 pipeline 中写 try-catch. 示例如下:
1 | node { |
以上写法被称为脚本式(Scripted)语法。Jenkins pipeline 还支持另一种语法:声明式(Declar-ative)语法。pipeline 2.5 版本开始,才同时支持两种格式的语法。
脚本式语法的确灵活,可扩展,但是也意味着更复杂。再者,Groovy 语言的学习成本对于(不使用 Groovy的)开发团队来说通常是不必要的。所以才有了声明式语法,一种提供更简单,更结构化(more opinionated)的语法。示例如下
1 | pipeline { |
创建第一个 pipeline
首先在 Jenkins 中新建一个 pipeline 项目。
点击 “新建任务”,输入任务名称 “pipeline-hello-world”,然后选择 “流水线”,点击确定;
在 pipeline-hello-world 项目的设置页面中,切换到 “流水线” 页面,填入 pipeline 的内容,内容如下:
1
2
3
4
5
6
7
8
9
10
11pipeline {
agent any
stages {
stage('Build') {
steps {
echo "Hello World"
}
}
}
}点击保存,点击左侧菜单栏,选择“立即构建”。
执行后,结果如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Started by user wanwu
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/pipeline-hello-world
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] echo
Hello World
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
和大多数 Hello World 示例一样,以上示例只是为了让大家对 pipeline 有一个感性的认识。