Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins 如何使管道作业等待所有触发的并行作业?_Jenkins_Groovy_Jenkins Pipeline - Fatal编程技术网

Jenkins 如何使管道作业等待所有触发的并行作业?

Jenkins 如何使管道作业等待所有触发的并行作业?,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我将Groovy脚本作为Jenkins中管道作业的一部分,如下所示: node { stage('Testing') { build job: 'Test', parameters: [string(name: 'Name', value: 'Foo1')], quietPeriod: 2, wait: false build job: 'Test', parameters: [string(name: 'Name', value: 'Bar1')], q

我将Groovy脚本作为Jenkins中管道作业的一部分,如下所示:

node {
    stage('Testing') {
        build job: 'Test', parameters: [string(name: 'Name', value: 'Foo1')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Bar1')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Baz1')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Foo2')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Bar2')], quietPeriod: 2, wait: false
        build job: 'Test', parameters: [string(name: 'Name', value: 'Baz2')], quietPeriod: 2, wait: false
    }
}
它并行执行多个其他自由式作业,因为
wait
标志设置为
false
。但是,我希望调用方作业在所有作业完成后完成。目前,管道作业触发所有作业,并在几秒钟后自行完成,这不是我想要的,因为我无法跟踪总时间,也无法一次性取消所有触发的作业

当所有并行作业都完成时,如何更正上述脚本以使管道作业完成

我尝试将生成作业包装到
waitUntil{}
块中,但没有成功。

您应该使用管道并行表达式,它将等待所有生成的作业/子任务完成:

stage('testing') {
    def branches = [:]

    for(i = 0; i < params.size(); i += 1) {
        def param = params[i]

        branches["Test${i}"] = {
            build job: 'Test', parameters: [string(name: 'Name', value: param)], quietPeriod: 2
        }
    }
    parallel branches
}
阶段(“测试”){
def分支=[:]
对于(i=0;i
您可以在管道文档中找到更多示例,网址为

,但它不能处理多个作业

Map jobResults = [:]

Boolean failedJobs = false
def buildJobWithParams(def jobs_list, Map results) {
  def branches = [:]    
  for(job in jobs_list)
  {
    print job
    branches["Test-${job}"] = {
       def jobBuild = build job: job, propagate: false
       def jobResult = jobBuild.getResult()
       echo "Build of '${job}' returned result: ${jobResult}"
       results[job] = jobResult
    }
  }    
  return branches
}

stage('Run integration tests') {
      steps {
            def job_branch = buildJobWithParams(item_list, jobResults)
            print job_branch
            parallel job_branch
          }
}

项列表
有多个作业,但它只会多次执行最后一个作业。

遇到相同的问题,并找到有效的解决方案。就用foreach吧

stage('testing') {
    def jobs = [:]

    [1,2,3,4,5].each{
        i -> jobs["Test${i}"] = {
            build job: 'Test', 
            parameters: [string(name: 'theparam', value: "${i}")],
            quietPeriod: 2
        }
    }
    parallel jobs
}

这对我有用。触发3个作业。等待他们完成。 注意额外的“->”来指定groovy闭包。 我有一个->在每个循环上,还有一个在平行线上。 这意味着在运行并行部分时将计算该值

def jobsString = "job1,job2,job3"
ArrayList jobsList = jobsString.split('\\,')

def parallelJobs2Run = [:]
jobsList.each { job ->
    echo "Going to parallel for job ${job}"
    parallelJobs2Run["${job}"] = { ->
        echo "Calling job ${job}"
        jobResults=build job: "${pathJenkinsFolder}${job}",
        parameters: [
            string(name: 'param1', value: "${value1}"),
            string(name: 'param2', value: "${value2}")
        ],
        propagate: true,
        wait: true

        // List of values: https://stackoverflow.com/questions/46262862/how-to-i-get-the-url-of-build-triggered-with-build-step-on-jenkins
        buildNumber = ${jobResults.number}
        echo "${job} Build number |${buildNumber}| result: |${jobResults.result}|"
        echo "See details on: |${jobResults.absoluteUrl}|"
    }
};
parallel parallelJobs2Run

另一种基本上做相同事情的方法是将作业包装在单独的阶段中,然后将所有子阶段包装在
parallel{}
中,如下所示:

stage('Trigger all dependent jobs') {
    parallel {
        stage('Trigger task 1') {
            steps {
                build job: "task-1"
            }
        }
        stage('Trigger task 2') {
            steps {
                build job: "task-2"
            }
        }
        stage('Trigger task 3') {
            steps {
                build job: "task-3"
            }
        }
    }   
}
这种方法允许你在每个并行阶段做任何你想做的事情——上面的任务可能完全不同(彼此不同)


此外,据我所知,上述方法代表了声明性管道语法。

有没有找到解决方法?在我看来@kenorbIt的行为与for闭包外创建的job变量相同,因此当执行并行时,它总是取最后一个值。尝试在for-like:`for(job in jobs_list){def myJob=job print myJob branchs[“Test-${myJob}”]={def jobBuild=build myJob:myJob,propagate:false def jobResult=jobBuild.getResult()echo“构建${myJob}”返回的结果:${jobResult}”结果[myJob]=jobResult}`Hmm,我使用了同一个参数化作业(工作流依赖于提供的参数)…我认为它可以称为作业代理/多路复用器。没有尝试过同时创造不同的詹金斯工作,诚实的说,这非常有帮助。谢谢在这个答案上,我对它作了进一步的阐述