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

时间:2016-02-05 15:29:55

标签: jenkins jenkins-workflow

我正在使用workflow-plugin(重命名为Pipeline Plugin)创建相当复杂的工作流程。为简单起见,我们假设我需要构建一个工作,但这项工作非常昂贵,并且不需要每次构建。只有在有一些SCM变化时。

因此,我们将此作业称为 expensiveJob ,并且源代码管理有 SCMRepositoryA

所以我基本上想说

build job: 'expensiveJob'

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

有办法怎么做?

我目前的解决方案是,我必须在管道脚本中签出 SCMRepositoryA ,然后检查 currentBuild.rawBuild.changeSets 在我看来喜欢相当多的不必要的工作,可能必须与我的工作中的源代码管理变化保持一致..

2 个答案:

答案 0 :(得分:3)

目前没有相当于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()
}

答案 1 :(得分:0)

使用接受的答案,这就是我设置声明性管道的方法,以跳过一些依赖于最新工作的昂贵阶段

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/工作之前,这需要几个脚本授权