文章目录
- Pipeline
- 什么是Jenkins Pipeline
- 声明式和脚本式Pipeline语法
- 为何使用Pipeline
- Pipeline概念
- Pipeline
- Node
- Stage
- Step
- Pipeline语法概述
- 声明式Pipeline
- 脚本式Pipeline
- Pipeline示例
- 参考
Pipeline
什么是Jenkins Pipeline
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
并提交到源码控制,提供了很多立竿见影的好处:
- 自动为所有branch和PR(Pull Request)创建Pipeline构建流程。
- 在Pipeline上代码审查/迭代 (以及剩余的源码)。
- 对Pipeline进行审计追踪。
- Pipeline只有单一源,可被项目里的多个成员查看和编辑。
定义Pipeline的语法,无论是在web UI还是在 Jenkinsfile
文件中,都是相同的,不过通常认为,在 Jenkinsfile
中定义Pipeline,并纳入源码控制,是最佳实践。
声明式和脚本式Pipeline语法
Jenkinsfile
可用两种语法进行编写:声明式和脚本式。
声明式和脚本式的Pipeline,从根本上是不同的。声明式Pipeline是Jenkins Pipeline新一些的特性:
- 相比脚本式Pipeline语法,它提供更加丰富的语法特性
- 是为了使读写Pipeline代码更容易而设计的。
不过, Jenkinsfile
里很多单个的语法组件(或称“步骤”),对于声明式和脚本式Pipeline是通用的。
为何使用Pipeline
Jenkins本质上是一个自动化引擎,它支持许多自动化模式。Pipeline添加了一组强大的工具到Jenkins,支持从简单的CI到复杂的CD Pipeline的用例。通过对一系列的相关任务进行建模,用户可以利用Pipeline的很多特性:
- 代码:Pipeline是在代码中实现的,通常会纳入源码控制,团队有编辑、审查和迭代其交付Pipeline的能力。
- 持久:Pipeline可以从Jenkins控制器的计划和非计划的重启中存活下来。
- 可暂停:Pipeline可以停止并等待人工输入或批准,然后继续运行Pipeline。
- 多功能:Pipeline支持复杂的现实世界的CD需求,包括fork/join,循环, 并行工作。
- 可扩展:Pipeline插件支持指定扩展到它的DSL,以及与其它插件集成的多个选项。
尽管Jenkins一直允许将自由式job链接到一起的初级形式来执行串行任务,Pipeline使这个概念成为了Jenkins的头等公民。
构建在可扩展性这个核心Jenkins价值之上,Pipeline也可以扩展,用户可使用Pipeline Shared Libraries,开发人员可使用插件来扩展。
下面的流程图是一个CD场景的示例,在Jenkins Pipeline中很容易建模:
Pipeline概念
Pipeline
Pipeline是CD pipeline的用户自定义模型。Pipeline代码定义了整个构建流程,通常包含了构建应用、测试和发布阶段。
同时, pipeline
块是声明式Pipeline语法的重要部分。
Node
Node是一个机器,它是Jenkins环境的一部分,能够执行Pipeline。
同时, node
块是脚本式Pipeline语法的重要部分。
Stage
stage
块定义了任务的概念上的不同子集,这些任务在整个Pipeline上被执行(比如:Build、Test和Deploy stage),很多插件用它来可视化或者展示Jenkins Pipeline状态/进度。
Step
单个任务。本质上,step告诉Jenkins在一个特定的时间点上做什么(或者叫流程里的一步)。比如,要执行shell命令 make
,使用 sh
step: sh 'make'
。当插件扩展Pipeline DSL,通常意味着检查实现了一个新的step。
Pipeline语法概述
声明式Pipeline
在声明式Pipeline语法中, pipeline
块定义了整个Pipeline要做的工作。
Jenkinsfile(声明式Pipeline):
pipeline {
agent any
stages {
stage('Build') {
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
脚本式Pipeline
在脚本式Pipeline语法中,一个或多个 node
块在整个Pipeline中做核心工作。尽管这不是脚本式Pipeline语法的强制需求,把Pipeline的工作限制在 node
块中,做了两件事:
- 通过向Jenkins队列中添加一项,安排块中包含的step运行。一旦node上的执行器空闲,该step就会运行。
- 创建workspace(某个Pipeline所特有的目录),在此处工作在从源码控制检出的文件上。
注意:取决于Jenkins配置,一些workspace在一段时间静止(inactivity)后,可能不会自动清理。
Jenkinsfile(脚本式Pipeline):
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
Pipeline示例
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/pipeline
https://www.jenkins.io/zh/doc/book/pipeline
(中文文档)