1

我目前使用的是Build Flow插件,它似乎已被放弃,以支持Jenkins 2.0中的管道。从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() 
} 

这里的目标是并行运行多个现有的工作,然后对构建已完成访问信息。这在Build Flow插件中一直没有问题。

我一直无法找到使用新管道访问这些数据的方法。

echo 'Checking streams for latest builds' 
join = [:] 

join['Job1'] = { build job: 'Job1', parameters: [[$class: 'StringParameterValue', name: 'TimeWindow', value: '1200']], propagate: false} 
join['Job2'] = { build job: 'Job2', parameters: [[$class: 'StringParameterValue', name: 'TimeWindow', value: '1200']], propagate: false} 
join['Job3'] = { build job: 'Job3', parameters: [[$class: 'StringParameterValue', name: 'TimeWindow', value: '1200']], propagate: false} 

parallel join 

连接['Job1']的转储不允许访问AbstractBuild或类似的构建流插件。相反,它表明:

<[email protected] 
[email protected] 
de[email protected] 
[email protected] 
[email protected] 
resolveStrategy=0 
directive=0 
parameterTypes=null 
maximumNumberOfParameters=0 
bcw=null> 

使用新的管道,有没有)来访问像job1.result,job1.lastBuild,job1.lastBuild.getDisplayName数据(的方法吗?

回答

3

您可以使用詹金斯API的parallel步骤之后访问这些数据:

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

尽管这将需要一些脚本的批准,如果你是在sandb运行氧气环境。 – amuniz

+0

你也可以在“src”中写一个groovy类来获取org.jvnet.hudson.main并获取当前实例的句柄。这样做我不认为我需要修改我的任何安全设置。 – red888

2

有点晚了,但你还可以定义runWrapper对象通过build命令将在关闭返回,并将其放置在地图在parallel命令之外定义。

下面是一个例子。 说明:我使用的是propagate: false,因此不会抛出异常(JUnit测试失败等)。你必须决定要如何处理异常,的try/catch /终于等

实例管道作业执行(需要用绳子PARAM commandStr进行参数):

env.PASSED_CMD="${params.commandStr}" 
stage('command-exec') { 
    node { 
     sh "${commandStr}" 
    } 
} 

执行工作(配置):

buildRuns = [:] 
buildResults = [:] 
def buildClosure(String jobKey, String paramAValue) { 
    return { 
     def runWrapper = build(
      job: 'command-test-job', 
      propagate: false, 
      parameters: [[$class: 'StringParameterValue', name: 'commandStr', value: paramAValue]] 
     ) 
     buildResults."$jobKey" = runWrapper 
    } 
} 
buildRuns."job1" = buildClosure("job1", "echo 'HI' && exit 0") 
buildRuns."job2" = buildClosure("job2", "echo 'HO' && exit 0") 
parallel buildRuns 
for(k in buildRuns.keySet()) { 
    def runResult = buildResults."$k" 
    echo "$k -> ${runResult.result}" 
    echo "$k -> ${runResult.buildVariables.PASSED_CMD}" 
} 

构建日志显示:

[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 
0

钍与Steve-B's Answer非常相似,但您实际上并不需要明确定义运行包装,或者事先将其放置在附加地图中。

TL;博士您只需通过直接循环的并行构建存储到HashMap和访问地图上它的keySet代替


拿这个答案与盐粮,我使用的是旧版本的管道(Jenkins 2.7.2和Pipeline 2.2)。

您可以将并行构建结果存储到一个哈希映射并遍历该映射的keySet以获取有关该构建的一些信息。

def create_build_job(job_name, pool_label="master", propagate=false) { 
    build job: job_name, parameters: [[$class: 'LabelParameterValue', name: "node_label", label: "${pool_label}"]], propagate: propagate, wait:true 
} 

def buildmap = [:] 
def build_results 

stage 'Perform Build' 
    //test1 is set to fail, test2 is set to succeed 
    buildmap['test1'] = {create_build_job('test1', "your_node_label")} 
    buildmap['test2'] = {create_build_job('test2', "your_node_label")} 

    build_results = parallel buildmap 

    for(k in build_results.keySet()){ 
     println build_results["${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={}, previousBuil[email protected]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={}, previousBuil[email protected]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 
相关问题