在Jenkins 2.0管道中通过并行执行访问构建

在Jenkins 2.0管道中通过并行执行访问构建,jenkins,jenkins-plugins,jenkins-workflow,jenkins-pipeline,jenkins-2,Jenkins,Jenkins Plugins,Jenkins Workflow,Jenkins Pipeline,Jenkins 2,我目前正在使用这个插件,它似乎已经被放弃,取而代之的是Jenkins 2.0中的管道 使用新管道重建现有作业时遇到了一些问题 目前,我有类似的代码: ignore(FAILURE) { join = parallel([ job1: {build('job1')}, job2: {build('job2')}, job3: {build('job3')} ]) } results = [join.job1.result.toString(), join.job2.

我目前正在使用这个插件,它似乎已经被放弃,取而代之的是Jenkins 2.0中的管道

使用新管道重建现有作业时遇到了一些问题

目前,我有类似的代码:

ignore(FAILURE) {
  join = parallel([
    job1: {build('job1')},
    job2: {build('job2')},
    job3: {build('job3')}
  ])
}
results = [join.job1.result.toString(), join.job2.result.toString(), join.job2.result.toString()]

if(join.job1.result.toString() == 'SUCCESS') {
  buildList << join.job1.lastBuild.getDisplayName()
}
join['Job1']的转储不会像构建流插件那样提供对抽象构建或类似构建的访问。相反,它显示:

<org.jenkinsci.plugins.workflow.cps.CpsClosure2@2eac6ed9
def=com.cloudbees.groovy.cps.impl.CpsClosureDef@59647704
delegate=WorkflowScript@3aa1807f 
owner=WorkflowScript@3aa1807f
thisObject=WorkflowScript@3aa1807f 
resolveStrategy=0 
directive=0
parameterTypes=null 
maximumNumberOfParameters=0 
bcw=null>


使用新管道,是否有方法访问数据,如job1.result、job1.lastBuild、job1.lastBuild.getDisplayName()?

在执行
并行
步骤后,您可以使用Jenkins API访问该数据:

Jenkins.instance.getItemByFullName('Job1').lastBuild

稍晚一点,但您也可以在闭包中定义
build
命令返回的
runWrapper
对象,并将其放置在
parallel
命令之外定义的映射中

这里有一个例子注意:我使用的是
propagate:false
,这样就不会抛出异常(JUnit测试失败等)。您必须决定如何处理异常、try/catch/finally等

要执行的示例管道作业(需要使用字符串param
commandStr
)参数化):

正在执行作业(配置):

生成日志显示:

[Pipeline] parallel
[Pipeline] [job1] { (Branch: job1)
[Pipeline] [job2] { (Branch: job2)
[Pipeline] [job1] build (Building command-test-job)
[job1] Scheduling project: command-test-job
[Pipeline] [job2] build (Building command-test-job)
[job2] Scheduling project: command-test-job
[job1] Starting building: command-test-job #7
[job2] Starting building: command-test-job #8
[Pipeline] [job2] }
[Pipeline] [job1] }
[Pipeline] // parallel
[Pipeline] echo
job1 -> SUCCESS
[Pipeline] echo
job1 -> echo 'HI' && exit 0
[Pipeline] echo
job2 -> SUCCESS
[Pipeline] echo
job2 -> echo 'HO' && exit 0
[Pipeline] End of Pipeline
Finished: SUCCESS
这与非常类似,但实际上不需要显式定义runwrapper,也不需要将其放在其他映射中

tl;dr您只需将并行构建存储到hashMap中,并通过直接在其键集上循环来访问该映射即可


对这个答案持保留态度,我使用的是旧版本的管道(Jenkins 2.7.2和管道2.2)

您可以将并行构建结果存储到hashMap中,并在映射的键集上循环以获取有关构建的一些信息

def create\u build\u作业(作业名称,pool\u label=“master”,propagate=false){
生成作业:作业\u名称,参数:[[$class:'LabelParameterValue',名称:“节点\u标签”,标签:${pool\u标签}]],传播:传播,等待:true
}
def buildmap=[:]
def生成结果
阶段“执行构建”
//test1设置为失败,test2设置为成功
buildmap['test1']={create_build_job('test1',“您的_节点_标签”)}
buildmap['test2']={create_build_job('test2',“您的_节点_标签”)}
构建结果=并行构建映射
for(k in build_results.keySet()){
println build_结果[“${k}]”。getProperties()
}
对于这个管道,我只是转储存储在映射中项中的RunWrapper的所有属性,但是您可以直接访问每个属性,因此如果您想要生成的结果,您可以执行以下操作:

build_results["${k}"].result
此管道生成的控制台输出(带有任何可能编辑的标识信息)为:

Started by user <user>
[Pipeline] stage (Perform Build)
Entering stage Perform Build
Proceeding
[Pipeline] parallel
[Pipeline] [test1] { (Branch: test1)
[Pipeline] [test2] { (Branch: test2)
[Pipeline] [test1] build (Building test1)
[test1] Scheduling project: test1
[test1] Starting building: test1 #11
[Pipeline] [test2] build (Building test2)
[test2] Scheduling project: test2
[test2] Starting building: test2 #11
[Pipeline] }
[Pipeline] }
[Pipeline] // parallel
[Pipeline] echo
{rawBuild=test1 #11, class=class org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper, absoluteUrl=<jenkins_url>/job/test1/11/, buildVariables={}, previousBuild=org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@1480013a, id=11, nextBuild=null, changeSets=[], result=FAILURE, description=null, startTimeInMillis=1509667550519, timeInMillis=1509667550510, duration=956, number=11, displayName=#11}
[Pipeline] echo
{rawBuild=test2 #11, class=class org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper, absoluteUrl=<jenkins_url>/job/test2/11/, buildVariables={}, previousBuild=org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@2d9c7128, id=11, nextBuild=null, changeSets=[], result=SUCCESS, description=null, startTimeInMillis=1509667550546, timeInMillis=1509667550539, duration=992, number=11, displayName=#11}
[Pipeline] End of Pipeline
Finished: SUCCESS
由用户启动
[管道]阶段(执行构建)
进入执行构建阶段
诉讼程序
[管道]并行
[管道][test1]{(分支:test1)
[管道][test2]{(分支:test2)
[管道][测试1]构建(构建测试1)
[test1]调度项目:test1
[test1]开始构建:test1#11
[管道][测试2]构建(构建测试2)
[test2]调度项目:test2
[test2]开始构建:test2#11
[管道]}
[管道]}
[管道]//并行
[管道]回声
{rawBuild=test1#11,class=classorg.jenkinsci.plugins.workflow.support.steps.build.RunWrapper,absoluteUrl=/job/test1/11/,buildVariables={},previousBuild=org.jenkinsci.plugins.workflow.support.steps.build。RunWrapper@1480013a,id=11,nextBuild=null,changeSets=[],结果=失败,描述=null,开始时间分钟数=1509667550519,时间分钟数=1509667550510,持续时间=956,数字=11,显示名称=#11}
[管道]回声
{rawBuild=test2#11,class=classorg.jenkinsci.plugins.workflow.support.steps.build.RunWrapper,absoluteUrl=/job/test2/11/,buildVariables={},previousBuild=org.jenkinsci.plugins.workflow.support.steps.build。RunWrapper@2d9c7128,id=11,nextBuild=null,changeSets=[],result=SUCCESS,description=null,startTimeInMillis=1509667550546,timeInMillis=1509667550539,duration=992,number=11,displayName=11}
[管道]管道末端
完成:成功

但如果您在沙盒环境中运行,则需要一些脚本批准。您也可以在“src”中编写groovy类这会抓取org.jvnet.hudson.main并获取当前实例的句柄。这样做,我认为我不需要修改任何安全设置。只是好奇:你在哪里找到了关于并行返回的对象的信息?我只想知道除了getProperties和result之外,还有什么其他可用的方法。显然官方文档没有提到它返回的对象。@ZhengLiu看,有一个PR为
parallel
@Nils的返回值添加文档谢谢,Nils。也许我遗漏了什么,但是除了
result
和之外,我没有看到任何关于
parallel
返回对象的属性
displayName
。例如,如何获取内部版本号?我尝试了
。buildNumber
但失败。我想我可以使用
getProperties
查看所有可用的属性,但不幸的是,我在公司使用Jenkins基础设施,没有调用
getProperties
的权限。
[Pipeline] parallel
[Pipeline] [job1] { (Branch: job1)
[Pipeline] [job2] { (Branch: job2)
[Pipeline] [job1] build (Building command-test-job)
[job1] Scheduling project: command-test-job
[Pipeline] [job2] build (Building command-test-job)
[job2] Scheduling project: command-test-job
[job1] Starting building: command-test-job #7
[job2] Starting building: command-test-job #8
[Pipeline] [job2] }
[Pipeline] [job1] }
[Pipeline] // parallel
[Pipeline] echo
job1 -> SUCCESS
[Pipeline] echo
job1 -> echo 'HI' && exit 0
[Pipeline] echo
job2 -> SUCCESS
[Pipeline] echo
job2 -> echo 'HO' && exit 0
[Pipeline] End of Pipeline
Finished: SUCCESS
build_results["${k}"].result
Started by user <user>
[Pipeline] stage (Perform Build)
Entering stage Perform Build
Proceeding
[Pipeline] parallel
[Pipeline] [test1] { (Branch: test1)
[Pipeline] [test2] { (Branch: test2)
[Pipeline] [test1] build (Building test1)
[test1] Scheduling project: test1
[test1] Starting building: test1 #11
[Pipeline] [test2] build (Building test2)
[test2] Scheduling project: test2
[test2] Starting building: test2 #11
[Pipeline] }
[Pipeline] }
[Pipeline] // parallel
[Pipeline] echo
{rawBuild=test1 #11, class=class org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper, absoluteUrl=<jenkins_url>/job/test1/11/, buildVariables={}, previousBuild=org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@1480013a, id=11, nextBuild=null, changeSets=[], result=FAILURE, description=null, startTimeInMillis=1509667550519, timeInMillis=1509667550510, duration=956, number=11, displayName=#11}
[Pipeline] echo
{rawBuild=test2 #11, class=class org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper, absoluteUrl=<jenkins_url>/job/test2/11/, buildVariables={}, previousBuild=org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@2d9c7128, id=11, nextBuild=null, changeSets=[], result=SUCCESS, description=null, startTimeInMillis=1509667550546, timeInMillis=1509667550539, duration=992, number=11, displayName=#11}
[Pipeline] End of Pipeline
Finished: SUCCESS