Jenkins Multijob filnaly结果

时间:2017-08-29 08:44:44

标签: jenkins jenkins-plugins

我有Multijob结构:

Master MultiJob Project (Job)
 |----- Phase 1
            |------> JOB A 
            |------> JOB D
 |----- Phase 2
            |------> JOB B
            |------> JOB D
 |----- Phase 2
            |------> JOB C

作业D总是失败,但这个项目没问题。 如何从最终结果中排除结果作业D? (因为所有其他工作都是成功的,但最终结果是失败的)

3 个答案:

答案 0 :(得分:2)

无论Master MultiJob Project (Job)执行结果如何,您都希望JOB D成功。但是,JOB AJOB BJOB 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 AJOB BJOB C的执行结果。如果其中任何一个失败,我们可以阻止Groovy脚本将父作业的构建状态更改为SUCCESS。

现在,要确定JOB AJOB BJOB 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 AJOB BJOB 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)

试试这个:

  • 下载 Jenkins 插件 Groovy Postbuild
  • 添加构建后步骤: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

}

See the script image