如何阻止Jenkins声明管道中的上游/下游构建?

2mbi3lxu  于 2023-02-07  发布在  Jenkins
关注(0)|答案(1)|浏览(277)

我有3个下游构建任务,它们在成功构建1个上游任务“项目U”时触发。示例:

triggers {
        pollSCM('H/5 * * * *')
        upstream(upstreamProjects: 'Project U', threshold: hudson.model.Result.SUCCESS)
    }

这按预期工作,但是,如果代码更改同时提交到所有部分,则上游和下游构建将同时开始构建。
我希望避免这种情况,因为下游构建将运行两次,而第一次运行是非常无用的,因为上游提交还没有构建。所以我希望配置下游作业,以阻止它们的构建,而上游作业正在构建。
我知道如何在用户界面中的Jenkins Freestyle作业中执行此操作(另请参见this answer):

但我找不到如何在Jenkins声明管道中执行此操作?

ve7v8dk2

ve7v8dk21#

此方法的工作原理如下:

waitUntil {
            def job = Jenkins.instance.getItemByFullName("Project U")
            !job.isBuilding() && !job.isInQueue()
        }

当这个下游作业启动时,它将检查上游作业是处于活动状态还是在排队,如果是,它将等待直到它的构建完成。
我还不能找到如何以编程方式访问当前作业的上游作业,因此需要复制作业名称。(有一个方法getBuildingUpstream(),它会方便得多,但我还没有找到从Job示例获取当前Project对象的方法。)
我最终在Jenkins共享库中创建了这个函数:

/*
    vars/waitForJobs.groovy
    
    Wait until none of the upstream jobs is building or being queued any more

    Parameters:
    
    upstreamProjects   String with a comma separated list of Jenkins jobs to check 
                       (use same format as in upstream trigger) 
    
*/

def call( Map params) {

    projects = params['upstreamProjects'].split(', *')
    
    echo 'Checking the following upstream projects:' 
    if ( projects.size() == 0) {
        echo 'none'
    } else {
        projects.each {project ->
            echo "${project}"
        }
    }
    
    waitUntil {
        def running = false
        projects.each {project ->
            def job = Jenkins.instance.getItemByFullName(project)
            if (job == null) {
                error "Project '${project} not found"
            }
            if (job.isBuilding()) {
                echo "Waiting for ${project} (executing)"
                running = true             
            }
            if (job.isInQueue()) {
                echo "Waiting for ${project} (queued for execution)"
                running = true
            }
        }
        return !running
    }

}

好处是我可以直接从上游触发器复制参数,因为它使用完全相同的格式。下面是一个例子,它看起来像什么:

pipeline {
[...]   
    triggers {
        pollSCM('H/5 * * * *')
        upstream(upstreamProjects: 'Project U1, Project U2, Project U3', threshold: hudson.model.Result.SUCCESS)
    }    
[...]
    stages {
        stage('Wait') {
            steps {
                script{
                    // Wait for upstream jobs to finish
                    waitForJobs(upstreamProjects: 'Project U1, Project U2, Project U3')
                }
            }
[...]
        }
    }
}

相关问题