5

3つのシンプルなフリースタイルジョブで構成されるJenkinsプロジェクトがあり、それぞれに独自のビルドスレーブがあります。各ジョブは、Linux、Mac、またはWindowsなどの個別のプラットフォームに関連付けられています。開発者がコードをコミットすると、Jenkinsはリポジトリをポーリングした直後に、各ビルドスレーブでプロジェクトをビルドし、それらの各プロジェクトは、ビルドが失敗したか成功したかを説明するメールを開発者に送信します。 問題: scmの変更ごとに3つの個別の電子メールが、開発者の受信トレイ、特に小さな変更を頻繁に行うことを好む人々に属する受信トレイにスパムを送ります。したがって、彼らは電子メールを完全に無視する可能性があります。

質問:(プラグインまたはプロジェクトの再構築を介して)3つの成功/失敗の電子メールを1つの電子メールに統合する方法はありますか?Email-extプラグイン、MultiJobプラグイン、およびマルチ構成プロジェクトのビルドオプションを 調べましたが、プロジェクト構造を変更して、失敗したジョブを説明する1つの電子メールのみが開発者に送信されるようにする方法が見つからないようです。または成功しました。ジョブを1つのMultiJobプロジェクトに結合し、送信する前に各プラットフォームでビルドした結果を確認する必要があると思いますが、わかりません。Jenkinsについては、まだ理解していないことがたくさんあります。

皆さんからのアドバイスをいただければ幸いです。

4

2 に答える 2

5

「編集可能な電子メール通知」パブリッシャー (email-ext から) には、マトリックス (マルチ構成) プロジェクトの処理方法を決定する設定があります。

「マトリックスプロジェクトのトリガー」を「親ジョブのみをトリガーする」に設定すると、目的が達成されるはずです。

同様に、「各構成のトリガー」に構成して現在の結果を取得するか、「親と各構成のトリガー」の両方に構成することもできます。

于 2013-03-17T19:51:47.873 に答える
0

「n」個のフリースタイルの仕事があり、単一の電子メール通知を取得する必要がある場合は、jenkins のマルチジョブ プラグインを使用します。これはアプローチの 1 つです。ここで、ジョブを順次または並列に実行できます。結果を 1 つのメールにまとめるには、 Copy Artifact 、 Groovy などの追加のプラグインが必要です。

以下に、2 つのフリースタイル ジョブ 'ジョブ A' と 'ジョブ B' の結果を 1 通のメールで取得する必要がある例を示します。

(前提条件:- マルチジョブ、アーティファクト、Groovy プラグインが jenkins にインストールされている ジョブを実行するノードには、少なくとも 2 つのエグゼキューターが必要です) 従う手順。

  1. マルチジョブ プロジェクトを作成します (「マスター」という名前を付けます)。
  2. ビルド ステップの追加 ----> マルチジョブ フェーズ a. 「フェーズ 1」で「ジョブ A」を追加し、「フェーズ 2」で「ジョブ B」を追加しました (ジョブを順次実行したかったため) b. ジョブを並行して実行する場合は、「フェーズ 1」に「ジョブ A」と「ジョブ B」を追加します。
  3. 「ジョブ A」と「ジョブ B」は、アーティファクトをコピーする許可をチェックし、プロジェクトを追加して、アーティファクトを「マスター」としてコピーできるようにする必要があります (これにより、「マスター」がサブジョブの結果を反復処理する許可が与えられます)。
  4. 「マスター」の場合、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')

        }
  1. 編集可能な電子メール通知で、BUILD_LOG_EXCERPT を使用して目的の値を取得しました。例: ${BUILD_LOG_EXCERPT, start = "Total passedTestcases", end="End Result"} これは、ログ Total passedTestcases と End Result の間に存在するため、変数 passedTestcases の値を返します。

    注: - ジョブを実行するスレーブ ノードには、少なくとも 2 つのエグゼキュータが必要です。ここでは、すべてのサブジョブが実行されるまでマスターが実行されるためです。そのため、順次実行する場合は、2 つのエグゼキュータが必要になります。並行して実行する必要がある場合は、n 個のエグゼキューター (n-1 サブジョブと 1 マスター ジョブ) が必要です。

于 2016-02-29T05:56:46.347 に答える