【问题标题】:Producing CTest results in Jenkins (xUnit >= 1.58)在 Jenkins 中生成 CTest 结果 (xUnit >= 1.58)
【发布时间】:2014-02-07 17:06:34
【问题描述】:

在詹金斯中集成 CMake+CTest 似乎应该很容易。 cmakebuilder 插件非常容易配置(只需设置源代码树和构建树,完成!)。但是我不明白如何调用 CTest 步骤。

根据主要xUnit page,从1.58版本开始支持CTest的XML输出,见bug report

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

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

【问题讨论】:

    标签: jenkins cmake ctest


    【解决方案1】:

    这是一个小示例,演示如何让 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 并从两个 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
    

    使用-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

    【讨论】:

    • 两个 cmets,1. 你在 CTest 执行中缺少 --no-compress-output。如果没有这个标志,你最终会得到issues.jenkins-ci.org/browse/JENKINS-21737 2。为了简化事情,我确实为 CTest 注册了一个错误来控制返回值:cmake.org/Bug/view.php?id=14749
    • @malat 感谢--no-compress-output 的提示。我已经更新了答案。
    • 这个答案是我如此喜欢 Stackoverflow 的原因。非常感谢,帮助很大!
    • 在 Ubuntu 14.04 上,由于二进制文件的位置不同,shell 命令应为 /usr/bin/ctest --no-compress-output -T Test || /bin/true
    • 您是否尝试过设置 xUnit 的“如果本次运行未更新测试结果,则构建失败”标志?
    【解决方案2】:

    对于那些想要在 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 是一个非常有用的资源。

    【讨论】:

      【解决方案3】:

      从 CMake 3.21.0 开始,CTest 中还有一个新选项:

      $ man ctest
      [...]
        --output-junit <file>        = Output test results to JUnit XML file.
      

      参考:

      【讨论】:

        猜你喜欢
        • 2011-09-13
        • 2016-05-03
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多