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 "构建成功,产物已生成"
        }
    }
}

运行与验证

  1. 将上述Jenkinsfile保存到Git仓库根目录,并提交推送。
  2. 在Jenkins中新建Pipeline Job,配置Pipeline script from SCM,指向该Git仓库。
  3. 首次手动点击Build Now,确认Job能正常执行。
  4. 验证定时构建:将cron表达式临时改为'*/2 * * * *'(每2分钟),保存后等待,观察Job是否在无代码变更时也自动触发。
  5. 验证轮询SCM:将pollSCM改为'* * * * *'(每分钟),保存后不修改代码,观察1-2分钟,确认Job不会触发;然后修改仓库中任意文件并提交推送,等待最多1分钟,确认Job自动触发。
  6. 打开每次构建的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插件)实现即时触发。
Jenkins 两种触发机制对比 定时构建 (Build periodically) cron('0 10 * * 1-5') 到达设定时间? (无论代码是否变化) 触发构建 Started by timer 轮询SCM (Poll SCM) pollSCM('H/5 * * * *') 检测到代码变更? (每5分钟检查一次) 有变更 触发构建 Started by SCM change 无变更 不触发 等待下次轮询 核心区别:定时构建 = 时间驱动;轮询SCM = 事件驱动(代码变更)