3. 定时构建与轮询SCM
任务目标
在Jenkins中为同一个Job分别配置定时构建(Build periodically)与轮询SCM(Poll SCM),理解两者在触发机制上的本质区别:前者按固定时间触发,后者仅在检测到代码仓库发生变化时才触发构建。
环境准备
- Jenkins 2.303+(本案例使用Pipeline Job演示)
- 一个可访问的Git仓库(本地或远程均可,本案例使用本地Git仓库验证)
- Jenkins已安装Git插件(默认安装)
实现步骤
创建一个Pipeline类型的Job,在Jenkinsfile中通过triggers指令同时声明两种触发方式。使用cron表达式定义定时构建,使用pollSCM定义轮询频率。为便于验证,在构建日志中打印当前时间与触发原因。
关键完整代码
// Jenkinsfile
pipeline {
agent any
triggers {
// 定时构建:每个工作日(周一至周五)上午10:00触发
cron('0 10 * * 1-5')
// 轮询SCM:每5分钟检查一次代码变更,有变更才触发
pollSCM('H/5 * * * *')
}
stages {
stage('Build') {
steps {
echo "构建时间: ${new Date().format('yyyy-MM-dd HH:mm:ss')}"
echo "触发原因: ${currentBuild.getBuildCauses()[0].shortDescription}"
// 模拟构建产物
sh 'echo "build artifact v1.0" > output.txt'
}
}
}
post {
success {
echo "构建成功,产物已生成"
}
}
}
运行与验证
- 将上述Jenkinsfile保存到Git仓库根目录,并提交推送。
- 在Jenkins中新建Pipeline Job,配置Pipeline script from SCM,指向该Git仓库。
- 首次手动点击Build Now,确认Job能正常执行。
- 验证定时构建:将cron表达式临时改为
'*/2 * * * *'(每2分钟),保存后等待,观察Job是否在无代码变更时也自动触发。 - 验证轮询SCM:将pollSCM改为
'* * * * *'(每分钟),保存后不修改代码,观察1-2分钟,确认Job不会触发;然后修改仓库中任意文件并提交推送,等待最多1分钟,确认Job自动触发。 - 打开每次构建的Console Output,查看
触发原因字段:定时构建显示Started by timer,轮询SCM触发显示Started by an SCM change。
判定标准
- 定时构建在到达设定时间时自动执行,即使代码无变化。
- 轮询SCM在代码无变化时不触发;代码提交推送后,在设定的轮询周期内自动触发。
- 构建日志中能明确区分两种触发原因。
常见问题
- cron表达式时区:Jenkins使用服务器本地时区,而非UTC。若需特定时区,需在系统配置中调整。
- H/5与*/5的区别:
H/5表示每5分钟的哈希分散值,避免多个Job同时触发造成负载;*/5则固定在每分钟的0秒开始计算。生产环境推荐使用H开头。 - 轮询SCM的负载:频繁轮询会增加SCM服务器压力,建议轮询间隔不小于5分钟,或改用Webhook(如GitHub插件)实现即时触发。