Acr*_*in3 3 jenkins jenkins-plugins jenkins-workflow jenkins-pipeline jenkins-2
我目前正在使用Build Flow插件,该插件似乎已被 Jenkins 2.0 中的 Pipelines 所取代。
使用新管道重建现有工作时遇到一些问题。
目前,我有类似的代码:
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()
}
Run Code Online (Sandbox Code Playgroud)
这里的目标是并行运行多个现有作业,然后访问有关已完成构建的信息。这在构建流程插件中一直运行没有问题。
我一直无法找到使用新管道访问这些数据的方法。
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
Run Code Online (Sandbox Code Playgroud)
join['Job1'] 的转储无法像 Build Flow 插件那样提供对 AbstractBuild 或类似内容的访问。相反,它显示:
<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>
Run Code Online (Sandbox Code Playgroud)
使用新的 Pipelines,有没有办法访问 job1.result、job1.lastBuild、job1.lastBuild.getDisplayName() 等数据?
有点晚了,但您也可以在闭包中定义命令runWrapper返回的对象build,并将其放置在命令外部定义的映射中parallel。
这是一个例子。注意:我使用的propagate: false目的是为了不引发异常(JUnit 测试失败等)。您必须决定如何处理异常,try/catch/finally 等。
要执行的示例管道作业(需要使用字符串 param 进行参数化commandStr):
env.PASSED_CMD="${params.commandStr}"
stage('command-exec') {
node {
sh "${commandStr}"
}
}
Run Code Online (Sandbox Code Playgroud)
执行作业(配置):
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}"
}
Run Code Online (Sandbox Code Playgroud)
构建日志显示:
[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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3879 次 |
| 最近记录: |