似乎这很容易在jenkins中集成CMake + CTest。 cmakebuilder插件非常容易配置(只需设置源树和构建树,完成!)。但是我无法理解如何调用CTest步骤。
根据主xUnit page,自版本1.58起,支持CTest的XML输出,请参阅bug report。
这就是我能找到的所有文件。当我在google或stackoverflow上搜索时,我只能找到需要手动步骤的非常旧的文档。
我想知道如何使用xUnit(1.81)设置最近的jenkins(1.532.1)。我应该创建一个“添加构建步骤”吗?我应该创建一个“构建后动作”吗?我需要填写什么才能让CTest运行并生成正确的XML文件,以便jenkins可以集成它们?
答案 0 :(得分:43)
这是一个小例子,演示如何让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
使用选项ctest
运行-T Test
将使CTest在构建文件夹内的子文件夹Testing
中生成XML输出文件,该文件可由{{1然后在后期构建操作中插件。如果某些测试失败,xUnit
是必要的,以防止Jenkins过早地中止构建(不运行xUnit插件)。
如果您使用的是Windows,请改为设置类似的|| /usr/bin/true
作业步骤:
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
。
答案 1 :(得分:4)
对于那些希望在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是非常有用的资源。