什么是流水线
流水线提供了一组可扩展的工具,通过 特定的语法对从简单到复杂的交付流水线 “作为代码” 进行建模。
对Jenkins 流水线的定义被写在一个文本文件中 (成为 Jenkinsfile
),该文件可以被提交到项目的源代码的控制仓库。_这是"流水线即代码"的基础; 将CD 流水线作为应用程序的一部分,像其他代码一样进行版本化和审查。 创建 Jenkinsfile
并提交它到源代码控制中提供了一些即时的好处。
定义流水线的语法, 无论是在 web UI 还是在 Jenkinsfile
中都是相同的, 通常认为在Jenkinsfile
中定义并检查源代码控制是最佳实践。
声明式和脚本化的流水线语法
Jenkinsfile
能使用两种语法进行编写 - 声明式和脚本化。
声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:
- 相比脚本化的流水线语法,它提供更丰富的语法特性,
- 是为了使编写和读取流水线代码更容易而设计的。
流水线的概念
流水线
流水线定义一个CD流水线模型,它的代码定义了整个构建过程,包括构建、测试和交付应用程序阶段。pipeline
块是声明式流水线的关键部分。
节点
节点是一个机器 ,它是Jenkins环境的一部分并且能够执行流水线。 node
块是 脚本化流水线语法的关键部分。
阶段
stage
块定义了在整个流水线的执行任务的标识,展示Jenkins流水线目前的 状态/进展。
步骤
一个单一的任务, a step 告诉Jenkins 在特定的时间点要做_what_ (或过程中的 “step”)。
声明式流水线
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any #1
stages {
stage('Build') { #2
steps {
// #3
}
}
stage('Test') { #4
steps {
// #5
}
}
stage('Deploy') { #6
steps {
// #7
}
}
}
}
1、在任何可用的代理上,执行流水线或它的任何阶段。
2、定义 “Build” 阶段。
3、执行与 “Build” 阶段相关的步骤。
4、 定义"Test" 阶段。
5、 执行与"Test" 阶段相关的步骤。
6、 定义 “Deploy” 阶段。
7、执行与 “Deploy” 阶段相关的步骤。
脚本化流水线
Jenkinsfile (Scripted Pipeline)
node { #1
stage('Build') { #2
// #3
}
stage('Test') { #4
// #5
}
stage('Deploy') { #6
// #7
}
}
1、在任何可用的代理上,执行流水线或它的任何阶段。
2、定义 “Build” 阶段。 stage
块 在脚本化流水线语法中是可选的。 然而, 在脚本化流水线中实现 stage
块 ,可以清楚的显示Jenkins UI中的每个 stage
的任务子集。
3、执行与 “Build” 阶段相关的步骤。
4、 定义"Test" 阶段。
5、 执行与"Test" 阶段相关的步骤。
6、 定义 “Deploy” 阶段。
7、执行与 “Deploy” 阶段相关的步骤。
流水线示例
Jenkinsfile (Declarative Pipeline)
pipeline { #1
agent any #2
stages {
stage('Build') { #3
steps { #4
sh 'make' #5
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml' #6
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
1、 pipeline
是声明式流水线的一种特定语法,他定义了包含执行整个流水线的所有内容和指令的 “block” 。
2、agent
是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区。
3、stage
是一个描述 stage of this Pipeline的语法块。在 Pipeline syntax 页面阅读更多有关声明式流水线语法的stage
块的信息。如 above所述, 在脚本化流水线语法中,stage
块是可选的。
4、steps
是声明式流水线的一种特定语法,它描述了在这个 stage
中要运行的步骤。
5、sh
是一个执行给定的shell命令的流水线 step (由 Pipeline: Nodes and Processes plugin提供) 。
6、junit
是另一个聚合测试报告的流水线 step (由 JUnit plugin提供)。
7、node
是脚本化流水线的一种特定语法,它指示 Jenkins 在任何可用的代理/节点上执行流水线 (和包含在其中的任何阶段)这实际上等效于 声明式流水线特定语法的agent
。
参考文档
官方文档: https://www.jenkins.io/zh/doc/
流水线介绍: https://www.jenkins.io/zh/doc/book/pipeline/
流水线语法:https://www.jenkins.io/zh/doc/book/pipeline/syntax/
流水线入门:https://www.jenkins.io/zh/doc/book/pipeline/getting-started/