Jenkins 如何使管道作业等待所有触发的并行作业?
我将Groovy脚本作为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
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,我使用了同一个参数化作业(工作流依赖于提供的参数)…我认为它可以称为作业代理/多路复用器。没有尝试过同时创造不同的詹金斯工作,诚实的说,这非常有帮助。谢谢在这个答案上,我对它作了进一步的阐述