本篇继续学习Declarative Pipeline的相关指令,本篇学习三个指令,分别是触发器(triggers),stage和tool。触发器主要是方便周期控制自动化提交,stage是在stages{...}下的一个指令,我们平台的大部分代码都在stage内完成,tool主要就是为了三大工具(jdk, gradle,maven)提供环境变量服务的。
指令1:triggers
该triggers指令定义了Pipeline应重新触发的自动化方式。对于与源代码集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基于webhook的集成可能已经存在。目前有三个可用的触发器是cron和pollSCM 和 upstream。
这个triggers是触发器的意思,所以这块是设置什么条件下触发pipeline代码执行,以及触发的频率。看到这里,如果你学习过Jenkins UI功能部分,你应该记得有下面这个图,用来控制轮询频率的,特别适合周期的自动化提交。
这篇介绍的触发器知识点就和这个有关。先记住这个点,在一个pipeline{…}代码中,只运行出现一次triggers{…},而且这个指令不是必须存在的。
cron
接受一个cron风格的字符串来定义Pipeline应重新触发的常规间隔,例如: triggers { cron('H 4/* 0 0 1-5') }
pollSCM
接受一个cron风格的字符串来定义Jenkins应该检查新的源更改的常规间隔。如果存在新的更改,则Pipeline将被重新触发。例如:triggers { pollSCM('H 4/* 0 0 1-5') }
upstream
接受逗号分隔的作业字符串和阈值。 当字符串中的任何作业以最小阈值结束时,将重新触发pipeline。例如:triggers { upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCCESS) }
举例一个可能利用scm的场景,如果一个公司做到了很好的代码覆盖测试,一般都会,如果监控到有人提交代码,就会自动化触发启动相关的单元测试。这个场景就是适合在pipeline代码里使用triggers指令,下面代码举例一个pollSCM的基本使用。
pipeline {
agent any
triggers {
pollSCM (‘H H(9-16)/2 * * 1-5)’)
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
解释下“H H(9-16)/2 * * 1-5)”的含义,这个你可以在上面截图这个页面点击右侧这个问号,出来具体含义。第一步,先根据空格,把字符串切割成5段。这5部分在下面这张图有解释。
所以,H H(9-16)/2 * * 1-5) 的含义就是:
第一部分“H” 表示hash,记住不是表示hour,是一个散列值,含义就是在一个小时之内,会执行一次,但是这次是一个散列值,而且不会并发执行。
第二部分“H(9-16)/2”,表示白天在早上9点到下午5点,每间隔2小时执行一次。
第三部分“*“,每天执行
第四部分“*“表示每月执行
第五部分“1-5“ 表示周一到周五执行
所以上面这个表达式“H H(9-16)/2 * * 1-5) “的含义就是,在每个月的周一到周五的白天,从早上9点到下午5点,每间隔两个小时去触发一次自动化构建。 这个就比较适合,我们每天上班,间隔两个小时去跑一次单元自动化测试。间隔时间长短,取决服务器压力和业务具体场景。
指令2:stage
该stage指令在该stages部分中,应包含步骤部分,可选agent部分或其他特定于阶段的指令。实际上,Pipeline完成的所有实际工作都将包含在一个或多个stage指令中。
特点:stage一定是在stages{…}里面,一个pipeline{…}中至少有一个stages{…}和一个stage{…}.这里多说一句,一个stage{…}中至少有一个steps{…}。Stage{…}还有一个特点就是,里面有一个强制的字符串参数,这个字符串参数就是描述这个stage是干嘛的,这个字符串参数是不支持变量的,只能你自己取名一个描述字段。
代码举例:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
指令3:tool
定义自动安装和放置工具的部分PATH。如果agent none指定,这将被忽略。
特点:
只支持定义maven jdk gradle三种工具的环境变量。
代码举例:
pipeline {
agent any
tools {
jdk 'jdk8'
}
stages {
stage('Example') {
steps {
sh 'java -version'
}
}
}
}
注意:工具名称必须在Jenkins 管理Jenkins → 全局工具配置中预配置。例如,上面代码我写了jdk,那么我必须在jenkins管理的全局工具配置中有jdk配置。