介绍
官方文档
Jenkins Pipeline(或简称为“Pipeline”,大写字母为“P”)是一套插件,支持在Jenkins中实现和集成连续交付管道。
持续交付(CD)管道是将软件从版本控制直接传递给用户和客户的过程的自动表达。对软件的每次更改(在源代码管理中提交)都会在发布的过程中经历一个复杂的过程。此过程涉及以可靠且可重复的方式构建软件,以及通过多个测试和部署阶段推进构建的软件(称为“构建”)。
Pipeline提供了一组可扩展的工具,用于通过管道域特定语言(Pipeline domain-specific language)语法“作为代码”对简单到复杂的传输管道进行建模。
Jenkins管道的定义被写入一个文本文件(称为Jenkinsfile),该文件又可以提交给项目的源代码控制库。这是“作为代码的管道”的基础;将CD管道视为应用程序的一部分,以便像任何其他代码一样进行版本控制和审查。
两种Pipeline语法的选择
选择
Jenkinsfile可以使用两种语法编写 - Declarative和Scripted。声明式和脚本化管道的构造从根本上不同。
早期Jenkins是使用Java实现的,所以在很早的时候就引入了groovy作为DSL,管理员可以使用groovy来实现一些自动化和高级的管理功能。因为groovy引擎已经集成到Jenkins,所以在pipeline一开始很自然就使用groovy来编写Jenkinsfile。也就是脚本式pipeline。但是groovy毕竟是一种语言,且学习成本很高。这个时候声明式的pipeline就出现了,主要是为了降低入门的难度,提高分工协作的能力。
作为官方推荐的语法,Declarative Pipeline也获得了很多官方的支持,比如blue ocean。即使声明式语法还没有支持的功能,也可以在声明式里直接调用脚本。
所以Declarative Pipeline是个不错的选择。
区别
在Declarative Pipeline语法中,pipeline块定义了整个管道中完成的所有工作。
在Declarative Pipeline中有效的基本语句和表达式与Groovy语法基本相同,区别在于:
Pipeline的顶级必须是一个块,特别是:pipeline {}
没有分号作为语句分隔符。 每个声明都必须独立
块只能由章节,指令,步骤或赋值语句组成。(Sections, Directives, Steps, or assignment statements.)
属性引用语句被视为无参数方法调用。 例如,输入被视为输入()
可以使用声明性指令生成器(Declarative Directive Generator)来帮助您开始配置声明性管道中的指令和部分。
声明式pipeline
pipeline {
agent any
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
branch 'production'
environment name: 'DEPLOY_TO', value: 'production'
}
steps {
echo 'Deploying'
}
}
}
}
脚本式pipeline
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
Declarative Pipeline语法
章节Sections
通常包含一个或多个Directives or Steps。
关键字 | 意义 | 常见选项 |
---|---|---|
agent | 指定整个管道或特定阶段在Jenkins环境中的执行位置,具体取决于代理程序部分的放置位置。 该部分必须在管道块内的顶层定义,但阶段级使用是可选的。 | any, none, label, node, docker, dockerfile |
post | post部分定义了一个或多个附加步骤,这些步骤在完成Pipeline或stage的运行时运行(取决于Pipeline中post部分的位置)。 | always, changed, fixed, regression, aborted, failure, success, unstable, cleanup |
stages | 包含一个或多个阶段指令的序列 | |
steps | 定义了在给定阶段指令中要执行的一系列一个或多个步骤。 |
指令Directives
关键字 | 意义 | 常见选项 |
---|---|---|
environment | 指定一系列键 - 值对,它们将被定义为所有步骤或阶段特定步骤的环境变量,具体取决于环境指令在管道中的位置。 | credentials() |
options | 允许在Pipeline中配置特定于Pipeline的选项。 | buildDiscarder, checkoutToSubdirectory, disableConcurrentBuilds, newContainerPerStage, overrideIndexTriggers, preserveStashes, quietPeriod, retry, skipDefaultCheckout,skipStagesAfterUnstable, timeout,timestamps |
parameters | 提供了用户在触发Pipeline时应提供的参数列表 | string, test, booleanParam, choice, file, password |
triggers | 定义了重新触发管道的自动方式。 对于与GitHub或BitBucket等源集成的管道,可能不需要触发器,因为基于webhooks的集成可能已经存在。 目前可用的触发器是cron,pollSCM和upstream。 | cron, pollSCM, upstream |
stage | 位于阶段部分。Pipeline所做的所有实际工作都将包含在一个或多个阶段指令中。 | |
tools | 定义用于自动安装和放置PATH的工具的部分。 如果未指定agent none,则忽略此项。引用的工具名必须在Manage Jenkins → Global Tool Configuration中预定义 |
maven,jdk,gradle |
input | 允许您使用输入步骤提示输入。 在应用any选项之后,在进入stage的agent或评估其状态之前,stage将暂停。 如果输入被批准,则stage将继续。 作为输入提交的一部分提供的任何参数将在该阶段的其余部分的环境中可用 | message, id, ok, submitter, submitterParameter, parameters |
when | 允许Pipeline根据给定的条件确定是否应该执行该阶段。 when指令必须至少包含一个条件。 | beforeAgent, branch, buildingTag, changelog, changeset, changeRequest, environment, equal, expression, tag, not, allof, anyof |
串行stages - Sequential Stages
声明性管道中的阶段可以按顺序声明要在其中运行的嵌套阶段的列表。
请注意,一个stage有且仅有一个steps, parallel, or stages,最后一个是连续阶段。
stages中各stage的阶段不能包含parallel或stage(s)本身,但它们允许使用阶段的所有其他功能,包括agent, tool, when。
串行stagesのExample
并行stages - Parallel
在并行块中声明多个嵌套阶段,这些阶段将并行执行。
关键字 - failFast
并行stagesのExample
Steps
使用step段
记录的所有可用步骤