12

Jenkins パラメータ化トリガー プラグインを使用して、テスト名をパラメーターとして複数のテスト ジョブをトリガーする Jenkins ビルド ジョブがあります。これにより、複数のエグゼキュータで多数のテスト ビルドが開始され、すべて正しく実行されます。

「ダウンストリーム テストの結果を集計 -> すべてのダウンストリーム テストを自動的に集計」を使用して結果を集計したいと考えています。ビルド ジョブでこれを有効にし、フィンガープリンティングを設定して、これらがダウンストリーム ジョブとして認識されるようにしました。ビルド ジョブの lastBuild ページで、それらがダウンストリーム ビルドとして認識されていることがわかります。

ダウンストリーム ビルド

テスト #1-#3

「集約されたテスト結果」をクリックすると、最新のもののみが表示されます (テスト #3)。これは、ジョブが常に同じテストを実行するが、私の場合はすべてテスト スイートの異なる部分を実行する場合に、適切な動作になる可能性があります。

これを取得して、関連するすべてのダウンストリーム テスト ビルドを集約する方法はありますか?

追加: テスト ジョブをレプリケートすると、集約されたテスト結果が機能します。多数のテスト スイートがあるため、これは理想的ではありません。

4

2 に答える 2

4

手動の解決策の概要を説明し(コメントで述べたように)、後で必要に応じて詳細を提供します。

Pを親ジョブ、Dをダウンストリーム ジョブとします (アプローチを複数のダウンストリーム ジョブに簡単に拡張できます)。

  1. Pのインスタンス (ビルド) は、パラメーター化されたトリガー プラグインを介して (ビルド後のステップとしてではなく) ビルド ステップを介してDを呼び出し、 Dが終了するのを待ちます。Pは、他のパラメーターとともに、PのビルドのBUILD_IDに基づいてパラメーターをDに渡します。これをPARENT_IDと呼びましょう。
  2. Dはテストを実行し、それらをアーティファクトとしてアーカイブします (該当する場合は jUnit レポートと共に)。
  3. 次に、 Pは、 PARENT_IDを介してDの適切なビルドを見つける外部 Python (または内部 Groovy) スクリプトを実行します ( Dのビルドを繰り返し処理し、 PARENT_IDパラメーターの値を調べます)。次に、スクリプトはアーティファクトをDからPにコピーし、Pがそれらを公開します。

Python を使用している場合 (それが私がしていることです) - Python JenkinsAPI wrapperを利用します。Groovy を使用している場合 - Groovy プラグインを利用し、スクリプトをシステム スクリプトとして実行します。その後、 Java APIを介して Jenkins にアクセスできます。

于 2012-05-12T18:06:37.533 に答える
3

宣言型パイプラインを使用して、次のソリューションを思いつきました。

「コピーアーティファクト」プラグインのインストールが必要です。

ダウンストリーム ジョブで、「env」変数に結果ファイルへのパス (またはパターン パス) を設定します。

post {
  always {
    steps {
      script {
        // Rem: Must be BEFORE execution that may fail   
        env.RESULT_FILE='Devices\\resultsA.xml'
      }
      xunit([GoogleTest(
        pattern: env.RESULT_FILE,
      )])
    }
  }
}

私は xunit を使用していますが、junit にも同じことが当てはまります。

親ジョブでビルド変数を保存し、後処理で次のコードを使用して結果を集計します。

def runs=[]

pipeline {
  agent any
  stages {
    stage('Tests') {
      parallel {
        stage('test A') {
          steps {
            script {
              runs << build(job: "test A", propagate: false)
            }
          }
        }
        stage('test B') {
          steps {
            script {
              runs << build(job: "test B", propagate: false)
            }
          }
        }
      }
    }
  }
  post {
    always {
      script {
        currentBuild.result = 'SUCCESS'
        def result_files = []
        runs.each {
          if (it.result != 'SUCCESS') {
            currentBuild.result = it.result
          }
          copyArtifacts(
            filter: it.buildVariables.RESULT_FILE,
            fingerprintArtifacts: true,
            projectName: it.getProjectName(),
            selector: specific(it.getNumber().toString())
          )
          result_files << it.buildVariables.RESULT_FILE
        }
        env.RESULT_FILE = result_files.join(',')
        println('Results aggregated from ' + env.RESULT_FILE)
      }
      archiveArtifacts env.RESULT_FILE
      xunit([GoogleTest(
        pattern: env.RESULT_FILE,
      )])
    }
  }
}

親ジョブも「env」変数を設定するため、親ジョブによってそれ自体を集約できることに注意してください。

于 2019-07-25T07:32:22.037 に答える