我有Multijob结构:
Master MultiJob Project (Job)
|----- Phase 1
|------> JOB A
|------> JOB D
|----- Phase 2
|------> JOB B
|------> JOB D
|----- Phase 2
|------> JOB C
作业D总是失败,但这个项目没问题。 如何从最终结果中排除结果作业D? (因为所有其他工作都是成功的,但最终结果是失败的)
答案 0 :(得分:2)
无论Master MultiJob Project (Job)
执行结果如何,您都希望JOB D
成功。但是,JOB A
,JOB B
和JOB C
应该会成功。
您可以使用Groovy Postbuild Plugin成功Master Multijob Project (Job)
。
在Jenkins中安装此插件后,您将在Groovy Postbuild
部分中获得Post-build Actions
步骤。选择Groovy Postbuild
步骤,它将提供一个选项来添加Groovy脚本来操作您的工作行为。
在那里添加以下脚本:
if( manager.build.@result == hudson.model.Result.FAILURE){
errpattern = ~/[FAILURE].*/;
manager.build.logFile.eachLine{ line ->
errmatcher=errpattern.matcher(line)
if (errmatcher.find()) {
manager.build.@result = hudson.model.Result.SUCCESS
}
}
}
上述脚本将执行的操作是将父作业的构建状态更改为成功(如果失败)。但是,这里的问题是,它会将您的构建状态更改为您的阶段中任何子作业失败的成功。
您只想忽略JOB D
的失败状态而不是其他作业。因此,我们可以做的是确定JOB A
,JOB B
和JOB C
的执行结果。如果其中任何一个失败,我们可以阻止Groovy脚本将父作业的构建状态更改为SUCCESS。
现在,要确定JOB A
,JOB B
和JOB C
我们可以使用以下内容:
JOBA_BUILD_STATUS=$(curl --silent "http://<jenkins_URL>/job/JOBA/$BUILD_ID/api/json" | jq -r '.result')
JOBB_BUILD_STATUS=$(curl --silent "http://<jenkins_URL>/job/JOBB/$BUILD_ID/api/json" | jq -r '.result')
JOBC_BUILD_STATUS=$(curl --silent "http://<jenkins_URL>/job/JOBC/$BUILD_ID/api/json" | jq -r '.result')
在多作业配置的Build
部分中,在所有阶段之后添加Execute shell
步骤并将上述脚本添加到其中。
现在,让我们调整groovy脚本以忽略JOB D
的构建结果,并考虑JOB A
,JOB B
和JOB C
的构建结果。
if((manager.build.@result == hudson.model.Result.FAILURE) && ("SUCCESS".equals(manager.build.buildVariables.get("JOBA_BUILD_STATUS"))) && ("SUCCESS".equals(manager.build.buildVariables.get("JOBB_BUILD_STATUS"))) && ("SUCCESS".equals(manager.build.buildVariables.get("JOBC_BUILD_STATUS")))){
errpattern = ~/[FAILURE].*/;
manager.build.logFile.eachLine{ line ->
errmatcher=errpattern.matcher(line)
if (errmatcher.find()) {
manager.build.@result = hudson.model.Result.SUCCESS
}
}
}
现在,它将忽略JOB D
的构建结果,然后检查JOB A, B & C
的构建结果是否为SUCCESS。如果它们成功,那么它会将Multijob的构建结果更改为SUCCESS。
答案 1 :(得分:0)
另一种使用groovy脚本的解决方案。在Multijob中将其添加为Post构建操作。
def subjobStatusMap = [:]
manager.build.getSubBuilds().each { subBuild->
subJobName = subBuild.getJobName()
subJobNumber = subBuild.getBuildNumber()
job = hudson.model.Hudson.instance.getItem(subBuild.getJobName())
results = job.getLastCompletedBuild().getResult()
subjobStatusMap.put((subJobName), results)
}
manager.listener.logger.println(subjobStatusMap)
if(("SUCCESS".equals(subjobStatusMap.get("JOB_A").toString()))&& ("SUCCESS".equals(subjobStatusMap.get("JOB_B").toString())) && ("SUCCESS".equals(subjobStatusMap.get("JOB_C").toString()))) {
manager.build.@result = hudson.model.Result.SUCCESS
}
答案 2 :(得分:0)
试试这个:
Groovy Postbuild
import hudson.model.*
jobA = Hudson.instance.getJob("JobA")
jobB = Hudson.instance.getJob("JobB")
jobC = Hudson.instance.getJob("JobC")
jobD = Hudson.instance.getJob("JobD")
if("SUCCESS".equals(jobA.getLastBuild().getResult().toString())&&
"SUCCESS".equals(jobB.getLastBuild().getResult().toString())&&
"SUCCESS".equals(jobC.getLastBuild().getResult().toString())
){
manager.build.@result = hudson.model.Result.SUCCESS
}