我有多个作业结构:
Master MultiJob Project (Job)
|----- Phase 1
|------> JOB A
|------> JOB D
|----- Phase 2
|------> JOB B
|------> JOB D
|----- Phase 2
|------> JOB C
作业 D 总是失败,但对于这个项目来说还可以。 如何从最终结果中排除结果作业 D? (因为所有其他工作都是成功的,但最终结果是FAILED)
最佳答案
无论JOB D
执行结果如何,您都希望Master MultiJob Project (Job)
成功。但是,JOB A
、JOB B
和 JOB C
应该会成功。
您可以使用 Groovy Postbuild Plugin 来成功完成Master Multijob Project (Job)
.
在 Jenkins 中安装此插件后,您将在 Post-build Actions
部分中看到 Groovy Postbuild
步骤。选择 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
的 FAILURE 状态,而不是其他作业。因此,我们能做的就是确定JOB A
、JOB B
和JOB C
的执行结果。如果其中任何一个失败,我们可以阻止 Groovy 脚本将父作业的构建状态更改为成功。
现在,确定 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
的构建结果和作业 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
的构建结果是否成功。如果它们成功,那么它会将您的 Multijob 的构建结果更改为 SUCCESS。
关于Jenkins Multijob 最终结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45934504/