在Jenkins中生成CTest结果(xUnit> = 1.58)

mal*_*lat 27 cmake ctest jenkins

看起来这应该很容易在jenkins中集成CMake + CTest.该cmakebuilder插件是非常容易配置(刚才设置的源树和构建树,完成了!).但是我无法理解如何调用CTest步骤.

根据主要的xUnit页面,从版本1.58开始,支持CTest的XML输出,请参阅错误报告.

这就是我能找到的所有文件.当我在google或stackoverflow上搜索时,我只能找到需要手动步骤的非常旧的文档.

我想知道如何使用xUnit(1.81)设置最近的jenkins(1.532.1).我应该创建一个"添加构建步骤"吗?我应该创建一个"构建后动作"吗?我需要填写什么才能让CTest运行并生成正确的XML文件,以便jenkins可以集成它们?

sak*_*kra 46

这是一个小例子,演示如何让xUnit选择CTest生成的XML测试结果文件.该示例包含单个C++源文件main.cpp

#include <cstdlib>
int main() {
    std::exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

并附带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)
Run Code Online (Sandbox Code Playgroud)

CMake列表文件生成可执行文件main并从两个CMake测试中运行此可执行文件,出于演示目的,一个将始终失败,另一个将始终成功.

使用Jenkins,设置一个新工作并添加新的cmakebuilder构建步骤.将CMake源目录指向包含本地计算机上的示例项目的文件夹.CMake构建目录应设置为build.这将使Jenkins在作业的工作空间目录中创建一个CMake构建文件夹.设置Clean Build标志以使作业始终以干净状态开始是个好主意.

然后,假设您正在运行Unix,请添加Execute shell作业步骤并在Command框中输入以下shell脚本:

cd build
/usr/local/bin/ctest --no-compress-output -T Test || /usr/bin/true
Run Code Online (Sandbox Code Playgroud)

ctest使用该选项运行-T Test将使CTest Testing在build文件夹内的子文件夹中生成XML输出文件,然后可以通过xUnit后置构建操作中的插件拾取该文件.在|| /usr/bin/true防止詹金斯过早中止版本(但不运行的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
Run Code Online (Sandbox Code Playgroud)

最后xUnit,必须按以下方式配置插件:

添加Publish xUnit test result report构建后操作,然后使用插件的Add按钮创建CTest-Version测试结果报告.在CTest-Version (default) Pattern输入文件模式中build/Testing/**/Test.xml.

  • 在Ubuntu 14.04上,shell命令应为`/ usr/bin/ctest --no-compress-output -T Test ||/bin/true`由于二进制文件的不同位置 (2认同)

Ala*_*son 5

对于那些想在Jenkins声明性管道中解析CTest输出的用户,您现在可以使用xUnit插件轻松地做到这一点,因为它可以直接解析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()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有关如何xUnit在声明式管道中配置插件的示例,Jenkins代码段生成器是非常有用的资源。