目录
1、结构
由一些指令和外套代码块组成。
1.1代码块:具有开头和结尾的任意一组代码块(例如{,}包含的代码块)。
1.2 部分:
stages:定义流水线主体和逻辑的所有单个阶段定义指令。
stage:封装一组DSL,用来把一系列步骤和阶段中其他项目(环境定义)分隔开。
posts:需要被执行的步骤和检验的条件。可以定义在阶段的末尾或者流水线的末尾。
1.3 指令
定义值(agent ('worker'))、配置行为triggers、指定要完成的行为。
1.4 步骤
可以使用任何合法的DSL语言。例如:git 、echo、sh
1.5 条件---when前面用过。
2、构建代码块
实线是必需的。如图:
2.1、agent :指定整个流水线或者一个特定的特定的阶段用来指定在哪里运行。
agent any: 可以运行在任意一个定义好的代理节点上。
agent none :不指定全局代理节点。意味着在单个阶段指定代理节点。
agent { label "<label>"}:表明在流水线或阶段可以运行在任何具有<lable>标签的代理节点上。label不能是正则表达式或者通配字符。
自定义工作空间:customWorkspace 用来指定代理节点所使用的空间。
agent {
node {
label "<labelname>"
customWorkspace "<desired directory>"
}
}
2.2、代理节点与Docker
在agent声明中,有两种快速获得Docker镜像的方法---指定一个已经存在的镜像或者从Dockerfile创建镜像。
使用现有Docker镜像的格式:
agent { docker '<image>'} : 从docker hub 上拉取指定的镜像,在基于该容器中运行这个流水线或者阶段。
agent { docker '<element>'} ,示例:
agent {
docker {
// 告诉jenkins去拉取特定镜像
image "image-name"
// 如果出现,在一个匹配label的上面实例化并控制该容器
label "worker-node"
// 如果出现,把参数传递给docker 容器,与平时使用docker一样。
args "-v /dir:dir"
}
}
agent {
dockerfile {
// 指定Dockerfile文件的路径
filename "<subdir/dockerfile name>"
// reuseNode true 重用之前声明的节点
label "<agent label>"
args "-v /dir:dir"
}
}
2.3 environment
environment{
TIMEZONE = "eastern"
TIMEZONE_DS = "${TIMEZONE}_daylight_savings"
// 设置配置
ADMIN_USER = credintials('admin-user')
}
2.4 tools
jenkins用户熟悉使用全局工具配置(Global Tool Configuration)。配置完成,tools指令可以让我们选择那些工具安装在已选择的节点上自动安装在配置路径。当前jenkins支持的工具类型有:ant、git、gradle、jdk、jgit、maven等。还可以指定一个类型。
tools {
gradle "gradle3.2"
}
注意:tools 不适用Dockerfile 或Docker 代理节点。
2.5 options
这个指令用来指定一些属性和值。可以应用到整个流水线。示例:
// 清除历史构建
options{
buildDiscarder(logRotator(numTokeeper:'3'))
}
// 拉取源码的快捷方法
options {
skipDefaultCheckout()
}
// 保留指定数量的流水线执行,包含控制台输出及制品
options {
buildDiscarder(logRotator(numToKeepStr:'10'))
}
options {
disableConcurrentBuilds()
}
//重试整个流水线
options { retry(2) }
options { skipStagesAfterUnstable()}
// 为整个流水线设置一个超时值
options { timeout(time: 15, unit: 'MINUTES') }
timeout(time: 2, unit: 'MINUTES') {
// pipeline processing
}
// 要求安装了Timesstamper插件
options { timestamps() }
2.6 triggers
指定使用什么类型的触发器来启动你的流水线运构建。可以通过webhook来通知构建。不适用于多分支、GitHub组织、Bitbucket团队/项目等类型的任务。
triggers {
upstream(upstreamProjects: 'jobA,jobB', threshold:
hudson.model.Result.SUCCESS)
}
triggers { githubPush() }
// Start a pipeline execution at 10 minutes past the hour
triggers { cron(10 * * * *) }
// 每10min扫描一次SCM的变化
triggers { pollSCM(*/10 * * * *) }
// 每小时前半个小时的某个时间启动流水线部分
triggers { cron(H(0,30) * * * *) }
// 周一至周五上午8点执行流水线项目
triggers { cron(0 8 * * * 1-5) }
参考:二、流水线的执行流程
2.7 parameters
用户指定参数file、choice、text、password、run、string。
parameters { booleanParam(defaultValue: false, description: 'test run?', name: 'testRun')}
parameters{ choice(choices: 'Windows-1\nLinux-2', description: 'Which platform?', name: 'platform')}
parameters{ file(fileLocation: '', description: 'Select the file to upload')}
parameters{ text(defaultValue: 'No message', description: 'Enter your message', name: 'userMsg')
parameters{ password(defaultValue: "userpass1", description: 'User password?', name: 'userPW')}
parameters{ run(name: "Last success", description:'Last successful project', project: 'project1', filter: 'Successful Builds')}
parameters{ string(defaultValue: "Linux", description: 'What platform?', name: 'platform')}
pipeline {
agent any
parameters{
string(defaultValue: "maintainer",
description: 'Enter user role:', name: 'userRole')
}
stages {
stage('listVals') {
steps {
echo "User's role = ${params.userRole}"
}
}
}
}
2.8 libraries---导入外部共享库
pipeline {
agent any
libraries {
lib("mylib@master")
lib("alib")
}
stages {
...
2.9 有条件执行一个阶段,与或非
只能使用在一个阶段的内部,不能使用在顶层。
stage('debug_build') {
when {
branch 'test'
}// 分支是test时继续执行
...
}
stage('debug_build') {
when {
environment name: "BUILD_CONFIG", value: "DEBUG"
}// 拥有指定的环境变量value时才继续执行
...
}
stage('debug_build') {
when {
expression {
echo "Checking for debug build parameter..."
expression { return params.DEBUG_BUILD }
}
...
}
when {
allOf {
environment name: "BUILD_CONFIG", value: "DEBUG"
branch 'test'
}// 与
}
when {
anyOf {
environment name: "BUILD_CONFIG", value: "DEBUG"
branch 'test'
}// 或
}
when {
not {
branch 'prod'
}// 非
}
2.13 post ---见二、流水线的执行流程
3、处理非声明式的代码
方法一、创建共享库(见五、声明式流水线)。
方法二、代码放置在pipeline之外。例如放在pipeline{ 的上面。任何可以在脚本式流水线中工作的代码,都可以放置在同一个文件/脚本区域。
方法三、script语句 --必须搭建了必备的Artifactory集成环境。
stage('stage1') {
<declarative code>
script {
def server = Artifactory.server 'my-server-id'
def rtGradle = Artifactory.newGradleBuild()
rtGradle.tool = 'gradle tool name'
}
<declarative code>
4、在阶段中使用parallel
stage('Unit Test') {
parallel{
stage ('set1') {
agent { label 'worker_node2' }
steps {
参考:https://www.jenkins.io/doc/book/pipeline/syntax/#ji-toolbar
https://ken.io/note/jenkins-maven-java-sonar-integration#H3-2