时间触发
时间触发是指定义一个时间,时间到了就触发pipeline执行。在pipeline中,使用trigger指令来定义时间触发,只能定义在pipeline块下。支持cron pollSCM upstream三种方式。其它方式可以通过插件来实现。
定时触发
定时执行就像cronjob,一到时间点就执行。它的使用场景通常是执行一些周期性的job,比如每晚构建。
pipeline {
agent any
triggers {
cron('0 0 * * *')
-
}
stages {
stage('Nightly build')
{
steps {
echo "这是一个耗时的构建,每天凌晨执行"
-
}
-
}
-
}
}
enkins tigger cron语法采用UNIX cron语法(有细微差别)。一条cron包含5个字段,使用空格或者Tab分隔,格式为:分,时,日,月,周
- MINUTE:一小时内的分钟,取值范围为0~59
- HOUR:一天内的小时,0~23
- DOM:一个月的某几天,1~31
- MONTH:月份,取值1~12
- DOW:星期几,取值0~7 0和7代表周日
还可以使用以下特殊字符,一次性指定多个值
- *匹配所有
- M-N,匹配M到N之间的值
- M-N/X or */x 指定到N范围内,以X值为步长
- A,B,…,Z 使用逗号枚举多值
在一些大型组织中,会同时存在大量的同一时刻执行的定时任务,比如N个半夜零点 0 0 * * * 执行的任务。这样会产生负载不均衡。在Jenkins tigger cron语法中使用H字符来解决这一问题,H代表hash。对于没必要精确到零点0分执行的任务,cron可以这样写: H 0 * * *,代表零点0分支59分之前任何一个时间点执行。
需要注意的是,H应用在DOM,一个月的某一天字段时会有不准确的情况,因为10月有31天,而2月却是28天。
Jenkins trigger cron还设计了一些人性化的别名:@yearly、@annually、@monthly、@weekly、@daily、@midnight和@hourly。
例如@hourly与 H * * * *相同,代表一小时内的任何时间;@midnight实际上代表在半夜12:00到凌晨2:59之前的某个时间。其它别名很少有应用场景。
轮询代码仓库
轮询代码仓库是指定期到代码仓库询问代码是否有变化,如果有变化就执行。有读者会问:那多久轮询一次?笔者的回答是:越频繁越好。
因为构建的间隔时间越长,在一次构建内就可能会包含多次代码提交。当构建失败时,你无法马上知道那一次代码提交导致了构建失败。总之,越不频繁集成,得到的持续集成的好就越少。 triggers { pollSCM(‘H/1 * * * *’) }
这种一般用于特殊情况,比如外网的代码仓库无法调用内网的jenkins。则需要用这种方式。