如果您有“n”个自由式工作,并且您必须收到一封电子邮件通知,那么请使用 jenkins 的 Multijob 插件。这是方法之一。在这里,您可以按顺序或并行运行您的作业。要将结果整合到一封电子邮件中,您需要额外的插件,例如 Copy Artifact、Groovy。
下面我举一个例子,我需要在一封电子邮件中获得 2 个自由式工作“工作 A”和“工作 B”的结果
(先决条件:- Multijob、Artifact、Groovy 插件已安装在 jenkins 中运行作业的节点应至少有 2 个执行程序)要遵循的步骤。
- 创建一个多作业项目(将其命名为“Master”)
- 在 Add Build Step ----> MultiJob Phase a. “在第 1 阶段”我添加了“作业 A”,在“第 2 阶段”添加了“作业 B”(因为我希望我的作业按顺序运行) b。如果您想并行执行作业,请在“阶段 1”中添加“作业 A”和“作业 B”
- “作业 A”和“作业 B”应检查复制工件的权限并添加项目以允许将工件复制为“主”(这将授予“主”遍历子作业结果的权限)
- 现在对于“大师”,您需要在 Groovy 后期构建中添加 Groovy 脚本(添加后期构建操作 ---> Groovy Postbuild)
下面给出的是我用来遍历我的子作业结果然后获取通过百分比来决定我是否需要将主人的状态设置为成功或失败的 groovy 脚本。这里我的作业结果是 nunit 结果。
import hudson.model.*
import com.tikal.jenkins.plugins.multijob.*
void log(msg) {
manager.listener.logger.println(msg)
}
def boolean findpercent(int pass,int total)
{
log 'Entered the function find percent'
def float percent = 0.0
log percent
percent = (pass/total) * 100
log percent
if(percent >= 90.0)
{
return true
}else
{
return false
}
}
threshold = Result.SUCCESS
void aggregate_results() {
def failed = false
def int totalTestCases = 0
def int failedTestCases = 0
def int passedTestcases = 0
def int skipTestcases = 0
mainJob = manager.build.getProject().getName()
job = hudson.model.Hudson.instance.getItem(mainJob)
log '-------------------------------------------------------------------------------------'
log 'Aggregated status report'
log '-------------------------------------------------------------------------------------'
log mainJob
log job
log manager.build.getNumber()
log manager.build.getResult()
job.getLastBuild().getSubBuilds().each { subBuild->
subJob = subBuild.getJobName()
subJobNumber = subBuild.getBuildNumber()
job1 = hudson.model.Hudson.instance.getItem(subBuild.getJobName())
build = job1.getBuildByNumber(subJobNumber)
log build
log job1.getLastCompletedBuild().getResult()
log job1.getLastCompletedBuild().getTestResultAction()
log build.getResult()
log subJobNumber
log subJob
log job1
log subBuild
log build.getAllActions()
log '-------------------------------------------------------------------------------------'
log 'build.getTestResultAction()'
log '-------------------------------------------------------------------------------------'
log build.getTestResultAction()
testResult = build.getTestResultAction()
log testResult
if (testResult != null) {
total = testResult.getTotalCount()
log total
log totalTestCases
totalTestCases += total
log totalTestCases
failures = testResult.getFailCount()
log failures
log failedTestCases
failedTestCases += failures
log failedTestCases
skip = testResult.getSkipCount()
log skip
log skipTestcases
skipTestcases += skip
pass = total - (failures + skip )
log pass
passedTestcases += pass
log pass
log passedTestcases
}
}
log 'Total testcases run'
log totalTestCases
log 'Total failedTestCases'
log failedTestCases
log 'Total skipTestcases'
log skipTestcases
log 'Total passedTestcases'
log passedTestcases
log 'End Result'
if(findpercent(passedTestcases,totalTestCases)) {
log 'success'
manager.build.setResult(hudson.model.Result.SUCCESS)
}else
{
log 'failure'
manager.build.setResult(hudson.model.Result.FAILURE)
}
log 'time taken'
log manager.build.getTimestampString()
log 'Time End'
}
try
{
aggregate_results()
}
catch(Exception e) {
log('ERROR: ${e.message}')
log('ERROR: Failed Status report aggregation')
}
现在在可编辑的电子邮件通知中,我使用 BUILD_LOG_EXCEPT 来获取所需的值。例如 ${BUILD_LOG_EXCERTT, start = "Total passedTestcases", end="End Result"} 这将返回变量 passTestcases 的值,因为它存在于日志 Total passedTestcases 和 End Result 之间
注意:- 运行作业的从节点应至少有 2 个执行器。因为这里的 master 将一直运行,直到您的所有子作业都运行为止。因此,如果它按顺序运行,您将需要两个执行器。如果您需要并行运行,则需要 n 个执行器(n-1 个子作业和 1 个主作业)。