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无符合规则的变更,跳过触发" }
代码说明
- 获取目标Job配置:通过
Jenkins.instance.getItemByFullName获取Job B实例,校验其是否存在且已配置SCM - 确定变更基准:以Job B上次完成构建的最后一个commit作为对比基准,首次构建则直接检测全量代码
- 模拟pollSCM检测:用
scm.createPoller创建SCM轮询器,调用poll方法执行变更检测,该过程会自动应用Job B配置的includedRegions等过滤规则 - 判断是否触发:根据检测结果,仅当存在有效变更时才调用
build步骤触发Job B
注意事项
- 确保执行Job A的用户拥有访问Job B配置、构建历史的权限,否则会抛出权限异常
- 如果Job B配置了多个SCM,需修改代码遍历所有SCM实例分别检测
- 可通过修改Job B的
includedRegions并提交对应目录的代码,测试变更检测逻辑是否生效
内容的提问来源于stack exchange,提问作者frans
相关产品推荐
相关产品推荐

