Jenkins pipeline 语法介绍
- Jenkins pipeline (流水线)是一套运行于 jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
它把持续提交流水线(Continuous Delivery Pipeline)的任务集成到 Jenkins 中。- pipeline 是 jenkins2.X 最核心的特性, 帮助 jenkins 实现从 CI 到 CD 与 DevOps 的转变。
持续提交流水线(Continuous Delivery Pipeline)会经历一个复杂的过程: 从版本控制、向用户和客户提交软件,软件的每次变更(提交代码到仓库)到软件发布(Release)。
这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为 Build)。Jenkins pipeline 本质
- 本质上,Jenkins 是一个自动化引擎,它支持许多自动模式。 Pipeline 向 Jenkins 中添加了一组强大的工具, 支持简单的 CI 到全面的 CD pipeline。
通过对一系列的相关任务进行建模, 用户可以利用pipeline 的很多特性:
1、代码:Pipeline 以代码的形式实现,使团队能够编辑,审查和迭代其 CD 流程。
2、可持续性:Jenkins 重启或者中断后都不会影响 Pipeline Job。
3、停顿:Pipeline 可以选择停止并等待人工输入或批准,然后再继续 Pipeline 运行。
4、多功能:Pipeline 支持现实复杂的 CD 要求,包括循环和并行执行工作的能力。
5、可扩展:Pipeline 插件支持其 DSL 的自定义扩展以及与其他插件集成的多个选项。- DSL 是什么?
DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言(下简称 DSL);而与 DSL 相对的就是 GPL,这里的 GPL 并不是我们知道的开源许可证,而是 General Purpose Language 的简称,即通用编程语言,也就是我们非常熟悉的 Objective-C、Java、Python 以及C 语言等等。
总结:
1.Jenkins Pipeline 是一组插件,让 Jenkins 可以实现持续交付管道的落地和实施。
2.持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完整过程的自动化表现。
3.软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。
Jenkins pipeline 入门
- pipeline 脚本是由 groovy 语言实现的但无需专门学习 groovy
- Groovy 是一种基于 JVM(Java 虚拟机)的敏捷开发语言,它结合了 Python、Ruby 和Smalltalk 的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。
由于其运行在 JVM 上的特性,Groovy 也可以使用其他非 Java 语言编写的库。pipeline 支持两种语法:
-Declarative:声明式
-Scripted pipeline :脚本式声明式 pipeline 语法:
- 官网:
https://www.jenkins.io/doc/book/pipeline/syntax/
https://www.jenkins.io/zh/doc/book/pipeline/syntax/声明式语法包括以下核心流程:
1.pipeline : 声明其内容为一个声明式的 pipeline 脚本
2.agent: 执行节点(job 运行的 slave 或者 master 节点)
3.stages: 阶段集合,包裹所有的阶段(例如:打包,部署等各个阶段)
4.stage: 阶段,被 stages 包裹,一个 stages 可以有多个 stage
5.steps: 步骤,为每个阶段的最小执行单元,被 stage 包裹
6.post: 执行构建后的操作,根据构建结果来执行对应的操作- 根据上面流程创建一个简单的 pipeline
pipeline{
agent any
stages{
stage("This is first stage"){
steps("This is first step"){
echo "I am GF"
}
}
}
post{
always{
echo "The process is ending"
}
}
}
Pipeline:作用域:应用于全局最外层,表明该脚本为声明式 pipeline 是否必须:必须
agent:作用域:可用在全局与 stage 内,agent 表明此 pipeline 在哪个节点上执行
是否必须:是
参数:any,none, label, node,docker,dockerfile
agent any #运行在任意的可用节点上
agent none #全局不指定运行节点,由各自 stage 来决定
agent { label 'master' } #运行在指定标签的机器上,具体标签名称由 agent 配置决定
agent {
node {
label 'my-defined-label'
customWorkspace 'xxxxxxx'
}
}
#node{ label 'master'} 和 agent { label 'master' }一样,但是 node 可以扩展节点信息,允许额外的选项 (比如 customWorkspace )。
agent { docker 'python' } #使用指定的容器运行流水线
如:
agent {
docker {
image 'maven:3-alpine'
label 'my-defined-label'
args '-v /tmp:/tmp'
}
}
#定义此参数时,执行 Pipeline 或 stage 时会动态的在具有 label 'my-defined-label'标签的node 提供 docker 节点去执行 Pipelines。
docker 还可以接受一个 args,直接传递给 docker run 调用。
agent {
// Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/
dockerfile {
filename 'Dockerfile.build'
dir 'build'
label 'my-defined-label'
additionalBuildArgs '--build-arg version=1.0.2'
}
}Jenkins pipeline 声明式语法
Environment
- environment 指令指定一系列键值对,这些键值对将被定义为所有 step 或 stage-specific step 的环境变量,具体取决于 environment 指令在 Pipeline 中的位置。
该指令支持一种特殊的方法 credentials(),可以通过其在 Jenkins 环境中的标识符来访问预定义的凭据。
对于类型为“Secret Text” 的凭据,该 credentials()方法将确保指定的环境变量包含 Secret Text 内容;
对于“标准用户名和密码”类型的凭证,指定的环境变量将被设置为 username:password 并且将自动定义两个附加的环境变量:
MYVARNAME_USR 和 MYVARNAME_PSW。 pipeline {
agent any
environment {
CC = 'clang'
}
stages {
stage('Example') {
steps {
sh 'printenv'
}
}
}
}
Options
- options 指令允许在 Pipeline 本身内配置 Pipeline 专用选项。
- Pipeline 本身提供了许多选项,例如 buildDiscarder,但它们也可能由插件提供,例如 timestamps。 Option