Jenkinsfile 语法
- 字符串
def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"
- 环境变量
# Jenkins 流水线中可访问的完整的环境变量列表记录在 ``${YOUR_JENKINS_URL}/pipeline-syntax/globals#env``
BUILD_ID: 当前构建的 ID,与 Jenkins 版本 1.597+ 中创建的构建号 BUILD_NUMBER 是完全相同的。
BUILD_NUMBER: 当前构建号,比如 “153”。
BUILD_TAG: 字符串 ``jenkins-${JOB_NAME}-${BUILD_NUMBER}``。可以放到源代码、jar 等文件中便于识别。
BUILD_URL: 可以定位此次构建结果的 URL(比如 http://buildserver/jenkins/job/MyJobName/17/ )
EXECUTOR_NUMBER: 用于识别执行当前构建的执行者的唯一编号(在同一台机器的所有执行者中)。这个就是你在“构建执行状态”中看到的编号,只不过编号从 0 开始,而不是 1。
JAVA_HOME: 如果你的任务配置了使用特定的一个 JDK,那么这个变量就被设置为此 JDK 的 JAVA_HOME。当设置了此变量时,PATH 也将包括 JAVA_HOME 的 bin 子目录。
JENKINS_URL: Jenkins 服务器的完整 URL,比如 https://example.com:port/jenkins/ (注意:只有在“系统设置”中设置了 Jenkins URL 才可用)。
JOB_NAME : 本次构建的项目名称,如 “foo” 或 “foo/bar”。
NODE_NAME : 运行本次构建的节点名称。对于 master 节点则为 “master”。
WORKSPACE : workspace 的绝对路径。
1. ## Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Example') {
steps {
echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
} } }}
2. ## Jenkinsfile (Declarative Pipeline)
pipeline {
agent any // agent 必须设置在流水线的最高级。如果设置为 agent none 会失败
environment {
// 使用 returnStdout
CC = """${sh(
returnStdout: true,
script: 'echo "clang"'
)}""" // 使用 returnStdout 时,返回的字符串末尾会追加一个空格。可以使用 .trim() 将其移除
// 使用 returnStatus
EXIT_STATUS = """${sh(
returnStatus: true,
script: 'exit 1'
)}"""
}
stages {
stage('Example') {
environment {
DEBUG_FLAGS = '-g'
}
steps {
sh 'printenv'
}} }}
- 处理凭据
- credentials(): 它支持 secret 文本,带密码的用户名,以及 secret 文件凭据
- SSH 秘钥或证书 Jenkins 的片段生成器特性
1.1 Secret 文本
environment {
AWS_ACCESS_KEY_ID = credentials('jenkins-aws-secret-key-id')
AWS_SECRET_ACCESS_KEY = credentials('jenkins-aws-secret-access-key')
}
1.2. 带密码的用户名
environment {
BITBUCKET_COMMON_CREDS = credentials('jenkins-bitbucket-common-creds')
}
# BITBUCKET_COMMON_CREDS - 包含一个以冒号分隔的用户名和密码,格式为 username:password。
# BITBUCKET_COMMON_CREDS_USR - 附加的一个仅包含用户名部分的变量。
# BITBUCKET_COMMON_CREDS_PSW - 附加的一个仅包含密码部分的变量。
1.3 Secret 文件
# secret 文本和 secret 文件凭据之间的唯一不同是,对于 secret 文本,凭据本身直接输入到 Jenkins 中,而 secret 文件的凭据则原样保存到一个文件中,之后将传到 Jenkins
- 处理参数
parameters {
string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
}
stages {
stage('Example') {
steps {
echo "${params.Greeting} World!"
}
}
}
- 处理故障
post {
always {
junit '**/target/*.xml'
}
failure {
mail to: [email protected], subject: 'The Pipeline failed :('
}
}
- 使用多个代理
- 可选的步骤参数
高级脚本式流水线
- 并行执行
stage('Build') {
/* .. snip .. */
}
stage('Test') {
parallel linux: {
node('linux') {
checkout scm
try {
unstash 'app'
sh 'make check'
}
finally {
junit '**/target/*.xml'
}
}
},
windows: {
node('windows') {
/* .. snip .. */
}
}
}
Docker
- 自定义执行环境
设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。 - 容器的缓存数据
流水线支持 向Docker中添加自定义的参数, 允许用户指定自定义的 Docker Volumes 装在, 这可以用于在流水线运行之间的 agent上缓存数据。在流水线运行期间使用maven
container 缓存~/.m2
, 从而避免了在流水线的后续运行中重新下载依赖的需求。
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v $HOME/.m2:/root/.m2'
}
}
....
}
- 使用多个容器
Docker和流水线的结合允许 Jenkinsfile 通过将 agent {} 指令和不同的阶段结合使用 multiple 技术类型。 - 使用Dockerfile agent { dockerfile true }
- 指定Docker标签
脚本化流水线的高级用法
- 一个 "sidecar" 运行 MySQL, 另一个提供执行环境 , 通过使用Docker 容器链接
node {
checkout scm
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
docker.image('mysql:5').inside("--link ${c.id}:db") {
/* Wait until mysql service is up */
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
/* Run some tests which require MySQL */
sh 'make check'
}
docker.image('centos:7').inside("--link ${c.id}:db") {
/*
* Run some tests which require MySQL, and assume that it is
* available on the host name `db`
*/
sh 'make check'
}
}
}
- 构建容器
node {
checkout scm
def dockerfile = 'Dockerfile.test'
def customImage = docker.build("my-image:${env.BUILD_ID}", "-f ${dockerfile} ./dockerfiles")
}
- 使用远程 Docker 服务器
node {
checkout scm
docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {
docker.image('mysql:5').withRun('-p 3306:3306') {
/* do things */
}
}
}
- 使用自定义注册表
node {
checkout scm
docker.withRegistry('https://registry.example.com', 'credentials-id') {
def customImage = docker.build("my-image:${env.BUILD_ID}")
/* Push the container to the custom Registry */
customImage.push()
}
}
扩展共享库
全局共享库配置: Manage Jenkins » Configure System » Global Pipeline Libraries流水线开发工具
Blue Ocean 编辑器,命令行流水线linter, IDE 集成流水线语法
-
规模 Pipelines
如何设置速度/持久性设置?
有 3 种方式配置持久性设置:- Globally, 在 "管理Jenkins" > "系统配置"下你可以选择一个全局默认 durability设置 , 标记 "流水线速度/持久性设置"。 你可以使用下面这些更具体的设置覆盖这些内容。
- Per pipeline job: 在作业配置的顶部, 标记 "自定义流水线速度/持久性级别" - 它会覆盖全局设置。或者, 使用 "属性" 步骤 - 该设置将会应用到该步骤执行后的下一次运行(相同的结果)。
- Per-branch for a multibranch project: 配置自定义分支属性策略 (在SCM下)并为自定义流水线速度/持久性级别添加属性。它会覆盖全局设置。 你还可以使用 "属性" 步骤来覆盖设置,但请记住,你可能需要再次运行该步骤来撤销该设置。
术语
Agent
代理通常是一个机器或者容器, 它连接到 Jenkins 的主服务器并在主服务器的指示下执行任务。Artifact
在 Build 或 Pipeline 运行期间生成的一个不可变文件,该文件被 archived到Jenkins Master 供用户在之后进行检索。Build
Project 的单个执行结果Cloud
一个提供动态 Agent 配置和分配的系统配置, 如由 Azure VM Agents 或 Amazon EC2 插件提供的配置。Core
主要的 Jenkins 应用程序 (jenkins.war
) which 提供基本的 web UI, 配置, 和 Plugins构建的基础。Downstream
一个已配置的 Pipeline 或 Project,它作为一个单独的流水线或项目执行的一部分被触发。Executor
一个工作的执行位置 ,由 Node 上的 Pipeline 或 Project 定义。一个节点可能由0或多个配置的执行器,它对应 有多少并发项目或流水线能够在此节点上执行。Fingerprint
被认为是全局唯一的一个散列,用于追踪 Artifact 或其他跨多个 Pipelines 或 Projects 的实体的使用。Folder
用于 Pipelines 和/或 Projects 的组织容器, 类似于文件系统的文件夹。Item
web UI中的一个实体, 对应于以下任一个: Folder , Pipeline , 或 Project 。Job
一个不赞成使用的一个术语, Project的同义词。Label
用于分组Agents的用户定义的文本, 通常使用类似的功能和功能。例如, 基于 Linux代理的linux
或者Docker-capable代理的docker
。Master
中心, 协调保存配置, 加载插件,和呈现给Jenkins各种用户界面的过程。Node
一种机器,他是Jenkins环境的一部分,能够执行 Pipelines 或 Projects 。 Master 和 Agents 都被认为是节点。Project
应该执行的工作的用户配置描述 , 比如 构建一个软件, 等等。Pipeline
连续交付流水线的一个用户定义模型, 了解更请阅读本手册的 Pipeline chapter 。Plugin
Jenkins功能的扩展,由Jenkins 核心 分别提供。Publisher
完成所有已配置的发布报告, 发送通知等 Steps 之后 Build 的部分。stage
stage
是流水线的一部分, 用于定义整个流水线的概念上不同的子集, 例如: "Build", "Test", 和 "Deploy", 他们被许多插件用于可视化或呈现Jenkins流水线状态/进展。Step
一个单一的任务; 从根本上,步骤告诉Jenkins在一个 Pipeline 或 Project 中要做 what 。Trigger
触发一个新的 Pipeline 运行或 Build 的标准。Update Center
托管了插件和插件元数据的库,用来支持在Jenkins内部安装插件。Upstream
一个已配置 Pipeline 或 Project,它 触发一个流水线或项目作为执行的一部分。Workspace
A disposable directory 在 Node 文件系统的一次性目录, 其中工作可以通过 Pipeline 或 Project 完成。在 Build 或 Pipeline 运行完成之后, 工作区通常会保留在适当的位置。除非在Jenkins Master上设置了 特定的工作区清理策略。