Jenkins 工作流程(管道)- 仅在 SCM 更改时构建作业

veh*_*mar 5 jenkins jenkins-workflow

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

所以让我们称这个工作为昂贵的工作,它是源代码管理,有SCMRepositoryA

所以我基本上想说

build job: 'expensiveJob'
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做到这一点?

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

Jes*_*ick 4

目前还没有同等的build仅启动轮询的步骤,而不是无条件安排构建。

我认为编写这样的步骤或使其成为该build步骤的选项并不是特别困难。同时,对于非沙盒脚本,您可以通过直接 Jenkins API 调用执行相同的操作:如果下游项目有配置的 SCM 触发器(仅需要 poll @daily,或者根本没有计划),那么

Jenkins.instance.getItemByFullName('downstream').SCMTrigger.run()
Run Code Online (Sandbox Code Playgroud)

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

if (Jenkins.instance.getItemByFullName('downstream').poll(TaskListener.NULL).hasChanges()) {
    build 'downstream'
}
Run Code Online (Sandbox Code Playgroud)

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

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