Jenkins Pipeline是一套插件,它支持实现和集成“continuous delivery (CD) pipeline”到Jenkins。
CD pipeline是流程的自动化表达,用于从版本控制向用户和客户获取软件。 软件的每个变化(在源码控制中提交),在其被发布的过程中,都经历了一个复杂的过程。该过程包括了以一种可靠并可重复的方式来构建软件, 以及通过测试和部署的多阶段来处理构建软件(称为一个build)。
Pipeline提供了一组可扩展的工具,通过“Pipeline domain-specific language (DSL) syntax”对从简单到复杂的交付pipeline“作为代码”来建模。
Jenkins Pipeline的定义写在一个文本文件中(称为 Jenkinsfile ),该文件可以被提交到项目的源码控制仓库。这是“Pipeline-as-code”的基础;将CD pipeline作为应用的一部分,像其它代码一样,可以版本化和审查。
创建 Jenkinsfile 并提交到源码控制,提供了很多立竿见影的好处:
定义Pipeline的语法,无论是在web UI还是在 Jenkinsfile 文件中,都是相同的,不过通常认为,在 Jenkinsfile 中定义Pipeline,并纳入源码控制,是最佳实践。
Jenkinsfile 可用两种语法进行编写:声明式和脚本式。
声明式和脚本式的Pipeline,从根本上是不同的。声明式Pipeline是Jenkins Pipeline新一些的特性:
不过, Jenkinsfile 里很多单个的语法组件(或称“步骤”),对于声明式和脚本式Pipeline是通用的。
Jenkins本质上是一个自动化引擎,它支持许多自动化模式。Pipeline添加了一组强大的工具到Jenkins,支持从简单的CI到复杂的CD Pipeline的用例。通过对一系列的相关任务进行建模,用户可以利用Pipeline的很多特性:
尽管Jenkins一直允许将自由式job链接到一起的初级形式来执行串行任务,Pipeline使这个概念成为了Jenkins的头等公民。
构建在可扩展性这个核心Jenkins价值之上,Pipeline也可以扩展,用户可使用Pipeline Shared Libraries,开发人员可使用插件来扩展。
下面的流程图是一个CD场景的示例,在Jenkins Pipeline中很容易建模:

Pipeline是CD pipeline的用户自定义模型。Pipeline代码定义了整个构建流程,通常包含了构建应用、测试和发布阶段。
同时, pipeline 块是声明式Pipeline语法的重要部分。
Node是一个机器,它是Jenkins环境的一部分,能够执行Pipeline。
同时, node 块是脚本式Pipeline语法的重要部分。
stage 块定义了任务的概念上的不同子集,这些任务在整个Pipeline上被执行(比如:Build、Test和Deploy stage),很多插件用它来可视化或者展示Jenkins Pipeline状态/进度。
单个任务。本质上,step告诉Jenkins在一个特定的时间点上做什么(或者叫流程里的一步)。比如,要执行shell命令 make ,使用 sh step: sh 'make' 。当插件扩展Pipeline DSL,通常意味着检查实现了一个新的step。
在声明式Pipeline语法中, pipeline 块定义了整个Pipeline要做的工作。
Jenkinsfile(声明式Pipeline):
pipeline {
agent any
stages {
stage('Build') {
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
在脚本式Pipeline语法中,一个或多个 node 块在整个Pipeline中做核心工作。尽管这不是脚本式Pipeline语法的强制需求,把Pipeline的工作限制在 node 块中,做了两件事:
Jenkinsfile(脚本式Pipeline):
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
Jenkinsfile(声明式Pipeline):
pipeline {
agent any
options {
skipStagesAfterUnstable()
}
stages {
stage('Build') {
steps {
sh 'make'
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml'
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
Jenkinsfile(脚本式Pipeline):
node {
stage('Build') {
sh 'make'
}
stage('Test') {
sh 'make check'
junit 'reports/**/*.xml'
}
if (currentBuild.currentResult == 'SUCCESS') {
stage('Deploy') {
sh 'make publish'
}
}
}
https://www.jenkins.io/doc/book/pipelinehttps://www.jenkins.io/zh/doc/book/pipeline (中文文档)