Jenkins 工作流(流水线)——仅在 SCM 发生变化时构建作业

Jenkins workflow (pipeline) - build job only when there are SCM changes

我正在使用工作流插件(重命名为管道插件)创建相当复杂的工作流。为简单起见,我们假设我需要构建一个作业,但这个作业非常昂贵并且不需要每次都构建。仅当有一些 SCM 更改时。

所以我们称这个工作为 expensiveJob 它是源代码管理 SCMRepositoryA.

所以我基本上想说

build job: 'expensiveJob'

我想轮询 SCM 更改并根据该信息构建作业。

有没有办法做到这一点?

我目前的解决方案是我必须在管道脚本中检出 SCMRepositoryA 然后检查 currentBuild.rawBuild.changeSets 在我看来,我喜欢做很多不必要的工作,并且可能必须与我工作中的任何源代码管理更改保持一致..

目前没有与 build 步骤等效的步骤,它只会启动轮询,而不是无条件地安排构建。

编写这样的步骤,或将其作为 build 步骤的选项,我认为不会特别困难。同时,对于非沙盒脚本,您可以直接调用 Jenkins API:如果下游项目配置了 SCM 触发器(只需要轮询 @daily,或者没有时间表全部),然后

Jenkins.instance.getItemByFullName('downstream').SCMTrigger.run()

可能足以立即安排轮询(未经测试)。或者,如果您想 运行 直接轮询,或者不想假设一个空白的 `SCMTrigger,那么

if (Jenkins.instance.getItemByFullName('downstream').poll(TaskListener.NULL).hasChanges()) {
    build 'downstream'
}

(再次未经测试)可以工作。但是,API 调用可能需要包装在 @NonCPS 方法中,因为中间结果不是 Serializable:

if (poll('downstream')) {
    build 'downstream'
}
@NonCPS boolean poll(String job) {
    Jenkins.instance.getItemByFullName(job).poll(TaskListener.NULL).hasChanges()
}

使用已接受的答案,这就是我设置声明性管道以跳过一些昂贵的阶段的方式,这些阶段取决于作业是否是最新的

stages {
    stage('Need to build?') {
        steps {
            script {
                env.changesPending = Jenkins.instance.getItemByFullName('expensive').poll(hudson.model.TaskListener.NULL).hasChanges()
                echo "env.changesPending=" +env.changesPending
            }
        }
    }
    stage('Pre-requisites') {
        when {
            expression { env.changesPending == true }
        }
        steps {
            build 'expensive'
        }
    }
    ...

这需要 http://your-jenkins/scriptApproval/ 中的几个脚本授权才能工作