Jenkins工作流程(Pipeline) - 仅在源代码管理(SCM)更改时构建作业

5
我正在使用工作流程插件(现已更名为Pipeline插件)创建相当复杂的工作流程。简单起见,让我们假设我需要构建一个作业,但这个作业非常昂贵,不需要每次都构建。只有在存在一些SCM更改时才需要构建。
因此,我们称这个作业为expensiveJob,它的源代码管理是SCMRepositoryA
所以我基本上想说:
build job: 'expensiveJob'

我希望能够根据SCM的更改来轮询并构建任务。

有没有办法做到这一点?

我目前的解决方案是在管道脚本中检出SCMRepositoryA,然后检查currentBuild.rawBuild.changeSets,这似乎是相当多余的工作,可能需要与我的作业中的源代码管理进行对齐...


1
你是在寻找工作配置中“构建触发器”下的“定期检查SCM”吗? - Joao Morais
不,这个工作可能会影响到我的其他工作结果。因此,它必须从工作流程(管道)中进行编排。 - vehovmar
2个回答

4
目前还没有等价于“构建”步骤的选项,只是启动轮询而不是无条件地调度构建。
编写这样的步骤或将其作为“构建”步骤的选项并不是特别困难。与此同时,对于非沙盒脚本,您可以通过直接使用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()
}

非常好用!谢谢Jesse! - vehovmar

1
使用被接受的答案,这是我如何设置我的声明性流水线以跳过一些昂贵的阶段,这些阶段取决于作业是否最新。
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/ 进行了多次脚本授权后,它才能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接