web-dev-qa-db-ja.com

JenkinsでCTest結果を生成する(xUnit> = 1.58)

これはCMake + CTestをjenkinsに統合するのが簡単なようです。 cmakebuilder プラグインは設定が非常に簡単です(ソースツリーとビルドツリーを設定するだけです!)。ただし、CTestステップを呼び出す方法を理解できません。

メインの xUnitページ によると、バージョン1.58以降、CTestからのXML出力がサポートされています。 バグレポート を参照してください。

それは私が見つけることができたすべてのドキュメントについてです。 googleまたはstackoverflowで検索すると、手動の手順を必要とする非常に古いドキュメントしか見つかりません。

最近のジェンキンス(1.532.1)をxUnit(1.81)でセットアップする方法を知りたいです。 「ビルドステップの追加」を作成する必要がありますか? 「ビルド後のアクション」を作成する必要がありますか?ジェンキンスがそれらを統合できるように、CTestを実行して適切なXMLファイルを生成するには、何を入力する必要がありますか?

28
malat

以下は、xUnitがCTestで生成されたXMLテスト結果ファイルを取得する方法を示す小さな例です。この例は、単一のC++ソースファイル_main.cpp_で構成されています

_#include <cstdlib>
int main() {
    std::exit(-1);
}
_

および付随する_CMakeLists.txt_:

_cmake_minimum_required(VERSION 2.8)
project(JenkinsExample)
enable_testing()
add_executable(main main.cpp)
add_test(test1 main)
add_test(test2 main)
set_tests_properties(test2 PROPERTIES WILL_FAIL ON)
_

CMakeリストファイルは、実行可能ファイルmainを生成し、2つのCMakeテストからこの実行可能ファイルを実行します。ここでは、デモ目的で1つは常に失敗し、もう1つは常に成功します。

Jenkinsを使用して、新しいジョブをセットアップし、新しいcmakebuilderビルドステップを追加します。ローカルマシン上のサンプルプロジェクトを含むフォルダーをCMakeソースディレクトリにポイントします。 CMakeビルドディレクトリはbuildに設定する必要があります。これにより、JenkinsはジョブのワークスペースディレクトリにCMakeビルドフォルダーを作成します。 _Clean Build_フラグを設定して、ジョブが常にクリーンな状態で開始されるようにすることをお勧めします。

次に、UNIXを実行していると想定して、_Execute Shell_ジョブステップを追加し、Commandボックスに次のシェルスクリプトを入力します。

_cd build
/usr/local/bin/ctest --no-compress-output -T Test || /usr/bin/true
_

_-T Test_オプションを指定してctestを実行すると、CTestはビルドフォルダー内のサブフォルダーTestingにXML出力ファイルを生成します。このファイルは、ビルド後のアクションでxUnitプラグインによって取得できます。 _|| /usr/bin/true_は、一部のテストが失敗した場合にJenkinsが(xUnitプラグインを実行せずに)ビルドを途中で中止しないようにするために必要です。

Windowsを使用している場合は、代わりに同様の_Execute Windows batch command_ジョブステップを設定します。

_cd build
"C:\Program Files (x86)\CMake 2.8\bin\ctest.exe" --no-compress-output -T Test || verify > NUL
_

最後に、xUnitプラグインを次のように構成する必要があります。

_Publish xUnit test result report_ビルド後アクションを追加し、プラグインのAddボタンを使用して_CTest-Version_テスト結果レポートを作成します。 CTest-Version (default) Patternに、ファイルパターン_build/Testing/**/Test.xml_を入力します。

44
sakra

Jenkins宣言型パイプラインでCTest出力を解析したい場合は、 (xUnit plugin を使用して簡単にこれを実行できます。CTest出力を直接解析できるためです。

Jenkinsfileにステージを追加してビルドディレクトリでctestを実行し、postステージを追加してxUnitで出力を処理します。これがスケルトンの例です:

pipeline {
  agent any
  stages {
    stage('Configure') {
      steps {
        dir('build') {
          sh 'cmake ../'
        }
      }
    }
    stage('Build') {
      steps {
        dir('build') {
          sh 'cmake --build .'
        }
      }
    }  
    stage('Test') {
      steps {
        dir('build') {
          sh 'ctest -T test --no-compress-output'
        }
      }
    }
  }
  post {
    always {
      // Archive the CTest xml output
      archiveArtifacts (
        artifacts: 'build/Testing/**/*.xml',
        fingerprint: true
      )

      // Process the CTest xml output with the xUnit plugin
      xunit (
        testTimeMargin: '3000',
        thresholdMode: 1,
        thresholds: [
          skipped(failureThreshold: '0'),
          failed(failureThreshold: '0')
        ],
      tools: [CTest(
          pattern: 'build/Testing/**/*.xml',
          deleteOutputFiles: true,
          failIfNotNew: false,
          skipNoTestFiles: true,
          stopProcessingIfError: true
        )]
      )

      // Clear the source and build dirs before next run
      deleteDir()
    }
  }
}

宣言型パイプラインでxUnitプラグインを構成する方法の例については、 Jenkins Snippets Generator が非常に役立つリソースです。

4