You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy中如何让build步骤仅在JobB有SCM变更时触发?

实现Jenkins Job A按需触发Job B(仅当Job B的SCM符合变更规则时)

要实现和pollSCM一致的变更检测逻辑(包括includedRegions的过滤),核心是复用Job B自身的SCM配置来做预检测,而非手动对比commit ID。下面是具体的实现方案:

核心思路

直接调用Jenkins内置的SCM变更检测机制,模拟pollSCM的行为——以Job B上次完成构建的版本为基准,检查最新代码中是否有符合includedRegions规则的变更,仅当检测到有效变更时才触发构建。

具体实现代码

在Job A的Pipeline脚本中添加自定义检测函数,再按需触发Job B:

// 检测指定Job的SCM是否有符合配置规则的变更
def hasRelevantChanges(String jobName) {
    def targetJob = Jenkins.instance.getItemByFullName(jobName)
    if (!targetJob) {
        error "目标Job ${jobName}不存在"
    }
    def jobScm = targetJob.scm
    if (!jobScm) {
        error "目标Job ${jobName}未配置SCM"
    }
    
    // 获取上次完成构建的基准commit(如果存在)
    def lastCompletedBuild = targetJob.lastCompletedBuild
    def baselineCommit = lastCompletedBuild ? lastCompletedBuild.changeSet.last()?.commitId : null
    
    // 模拟pollSCM的变更检测逻辑
    def scmPoller = jobScm.createPoller(targetJob)
    def pollResult = scmPoller.poll(targetJob, null, baselineCommit ? [baselineCommit] : null)
    
    // 返回是否有符合规则的变更
    return pollResult.hasChanges() && !pollResult.changeSets.isEmpty()
}

// 主逻辑:检测后触发Job B
if (hasRelevantChanges("JobB")) {
    echo "检测到Job B的SCM有符合规则的变更,触发构建..."
    build(job: "JobB")
} else {
    echo "Job B的SCM无符合规则的变更,跳过触发"
}

代码说明

  1. 获取目标Job配置:通过Jenkins.instance.getItemByFullName获取Job B实例,校验其是否存在且已配置SCM
  2. 确定变更基准:以Job B上次完成构建的最后一个commit作为对比基准,首次构建则直接检测全量代码
  3. 模拟pollSCM检测:用scm.createPoller创建SCM轮询器,调用poll方法执行变更检测,该过程会自动应用Job B配置的includedRegions等过滤规则
  4. 判断是否触发:根据检测结果,仅当存在有效变更时才调用build步骤触发Job B

注意事项

  • 确保执行Job A的用户拥有访问Job B配置、构建历史的权限,否则会抛出权限异常
  • 如果Job B配置了多个SCM,需修改代码遍历所有SCM实例分别检测
  • 可通过修改Job B的includedRegions并提交对应目录的代码,测试变更检测逻辑是否生效

内容的提问来源于stack exchange,提问作者frans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:05:25