Получение результатов CTest в Дженкинсе (xUnit>= 1.58)

похоже, что это должно быть легко интегрировать CMake+CTest в jenkins. The cmakebuilder плагин чрезвычайно прост в настройке (просто установите исходное дерево и дерево сборки, готово!). Однако я не понимаю, как вызвать шаги CTest.

согласно основному страница xUnit, начиная с версии 1.58 поддерживается вывод XML из CTest, см. сообщить об ошибке.

Это все документы, которые я смог найти. когда я поиск в google или stackoverflow, я могу найти только очень старую документацию, требующую ручных шагов.

Я хотел бы знать, как настроить недавний jenkins (1.532.1) с xUnit (1.81). Должен ли я создать "Add build-step"? Должен ли я создать "действие после сборки"? Что мне нужно заполнить, чтобы запустить CTest и создать правильные XML-файлы, чтобы Дженкинс мог их интегрировать ?

2 ответов


вот небольшой пример, который демонстрирует, как xUnit забрать файл результатов теста XML, сгенерированный CTest. Пример состоит из одного исходного файла 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. Это заставит Дженкинса создать папку сборки CMake в каталоге рабочей области задания. Это хорошая идея, чтобы установить Clean Build флаг, чтобы работа всегда начинается с чистого листа.

затем, предполагая, что вы используете Unix, добавьте Execute shell шаг задания и введите следующие команды скрипт в Command box:

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

под управлением ctest с параметром -T Test заставит CTest генерировать выходной XML-файл в подпапке Testing внутри папки сборки, которая может быть подобрана xUnit plug-in в действии после сборки. The || /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

наконец-то xUnit плагин должен быть настроен следующим образом:

добавить Publish xUnit test result report действие после сборки, а затем используйте плагин Add кнопка для создания CTest-Version отчет о результатах теста. В CTest-Version (default) Pattern введите шаблон файла build/Testing/**/Test.xml.


для тех, кто хочет проанализировать вывод 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()
    }
  }
}

для примеров того, как настроить xUnit плагин в декларативном конвейере,Дженкинс Генератор Фрагментов является очень полезным ресурсом.