「n」個のフリースタイルの仕事があり、単一の電子メール通知を取得する必要がある場合は、jenkins のマルチジョブ プラグインを使用します。これはアプローチの 1 つです。ここで、ジョブを順次または並列に実行できます。結果を 1 つのメールにまとめるには、 Copy Artifact 、 Groovy などの追加のプラグインが必要です。
以下に、2 つのフリースタイル ジョブ 'ジョブ A' と 'ジョブ B' の結果を 1 通のメールで取得する必要がある例を示します。
(前提条件:- マルチジョブ、アーティファクト、Groovy プラグインが jenkins にインストールされている ジョブを実行するノードには、少なくとも 2 つのエグゼキューターが必要です) 従う手順。
- マルチジョブ プロジェクトを作成します (「マスター」という名前を付けます)。
- ビルド ステップの追加 ----> マルチジョブ フェーズ 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_EXCERPT を使用して目的の値を取得しました。例: ${BUILD_LOG_EXCERPT, start = "Total passedTestcases", end="End Result"} これは、ログ Total passedTestcases と End Result の間に存在するため、変数 passedTestcases の値を返します。
注: - ジョブを実行するスレーブ ノードには、少なくとも 2 つのエグゼキュータが必要です。ここでは、すべてのサブジョブが実行されるまでマスターが実行されるためです。そのため、順次実行する場合は、2 つのエグゼキュータが必要になります。並行して実行する必要がある場合は、n 個のエグゼキューター (n-1 サブジョブと 1 マスター ジョブ) が必要です。