2017-08-29 61 views
2

我多椎结构:詹金斯多椎filnaly导致

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

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

+0

即使失败,您是否可以从配置中排除或禁用JOB D? – ANIL

+0

它需要一些关于项目的额外信息。不,我不能从Multijob中排除或禁用它。 – Andrey

回答

1

无论JOB D执行结果如何,您都希望Master MultiJob Project (Job)成功。但是,JOB A,JOB BJOB C应该是成功的。您可以使用Groovy Postbuild Plugin使Master Multijob Project (Job)成功。

在Jenkins中安装此插件后,您将在Post-build Actions部分获得Groovy Postbuild步骤。选择Groovy Postbuild步骤,它将提供添加Groovy脚本来操纵工作行为的选项。

添加下面的脚本有:

if([email protected] == hudson.model.Result.FAILURE){ 
errpattern = ~/[FAILURE].*/; 
manager.build.logFile.eachLine{ line -> 
    errmatcher=errpattern.matcher(line) 
    if (errmatcher.find()) { 
     [email protected] = hudson.model.Result.SUCCESS 
    } 
    } 
} 

什么上面的脚本需要做的是改变你的父作业的构建状态到成功,如果失败。但是,这里的问题是它会将阶段中的任何子作业失败的构建状态更改为成功。

你只想忽略JOB D的失败状态而不是其他工作。因此,我们可以做的是确定JOB A,JOB 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 A,JOB BJOB C的构建结果。现在

if((ma[email protected] == 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()) { 
     [email protected] = hudson.model.Result.SUCCESS 
    } 
    } 
} 

,它会忽略的JOB D构建结果,然后检查是否为JOB A, B & C构建结果成功与否。如果他们成功了,那么它会将Multijob的构建结果更改为SUCCESS。

+0

谢谢,这是一个很好的解决方案,但不幸的是我们无法安装插件。 – Andrey

0

Groovy脚本的另一个解决方案。将它添加为Multijob中的Post build动作。

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()))) { 
    [email protected] = hudson.model.Result.SUCCESS 
}