Показать покрытие кода с исходным кодом в Jenkins с Cobertura (результат запуска с другой машины) - PullRequest
5 голосов
/ 21 января 2020

Фон

У меня большое приложение на c ++ со сложной структурой каталогов. Структура настолько глубока, что репозиторий кода не может быть сохранен в рабочей области Jenkins, но представляет собой некий каталог root, в противном случае сборка завершится неудачно, так как ограничение длины пути опрокинуто.

Теперь, поскольку приложение тестируется в разных средах, тестируйте Приложение запускается в другой машине. Приложение и все ресурсы сжимаются и копируются на тестовую машину, на которой тесты выполняются с использованием OpenCppCoverage, и в результате создается Cobertura xml.

Теперь, поскольку для отображения результата covarage необходим исходный код, xml is скопировать обратно на сборочную машину и затем передать в плагин Jenkins Cobertura.

Проблема

Отчеты о покрытии показывают только процентные результаты для модуля или исходного кода. Содержимое кода не отображается, но отображается следующее сообщение об ошибке:

Источник

Исходный код недоступен. Некоторые возможные причины:

  • Это не самая последняя сборка (для экономии места на диске этот плагин сохраняет только исходный код самой последней сборки).
  • Cobertura нашла исходный код, но не предоставила достаточно информации, чтобы найти Исходный код.
  • Cobertura не смог найти исходный код, поэтому у этого плагина нет надежды найти его.
  • У вас недостаточно прав для просмотра этого файла.

Теперь я нашел этот ответ SO , который обещает:

Выходной файл xml должен находиться в той же папке, где coverage выполняется, поэтому:

coverage xml -o coverage.xml

Ссылка на исходную папку помещается в coverage.xml, а если выходной файл помещается в другую папку, ссылка на исходную папку будет неправильной.

Проблема в том, что:

  • I ' мы запускаем тесты на другой машине (это можно преодолеть с помощью сценария, который изменяет пути в xml).
  • мой исходный код не может находиться внутри рабочей области во время сборки
  • размещение xml в соответствующем каталоге исходного кода плагин Cobertura не принимает. Он заканчивается этой ошибкой:
[Cobertura] Publishing Cobertura coverage report...

FATAL: Unable to find coverage results

java.io.IOException: Expecting Ant GLOB pattern, but saw 'C:/build_coverage/Products/MyMagicProduct/Src/test/*Coverage.xml'. See http://ant.apache.org/manual/Types/fileset.html for syntax

Это часть результата xml (до изменений):

<?xml version="1.0" encoding="utf-8"?>
<coverage line-rate="0.63669186741173223" branch-rate="0" complexity="0" branches-covered="0" branches-valid="0" timestamp="0" lines-covered="122029" lines-valid="191661" version="0">
  <sources>
    <source>c:</source>
    <source>C:</source>
  </sources>
  <packages>
    <package name="C:\jenkins\workspace\MMP_coverage\MyMagicProduct\src\x64\Debug\MMPServer.exe" line-rate="0.63040511358728513" branch-rate="0" complexity="0">
      <classes>
        <class name="AuditHandler.cpp" filename="build_coverage\Products\MyMagicProduct\Src\Common\AuditHandler.cpp" line-rate="0.92682926829268297" branch-rate="0" complexity="0">
          <methods/>
          <lines>
            <line number="18" hits="1"/>
            <line number="19" hits="1"/>
            <line number="23" hits="1"/>
            <line number="25" hits="1"/>
            <line number="27" hits="1"/>
            ....
          </lines>
        </class>
   ....

Самая большая проблема в том, что я не уверен если местоположение xml действительно является проблемой, так как плагин не сообщает подробности проблем, возникших при попытке получить / найти соответствующий исходный код. Вторая пуля из Cobertura, которая может объяснить проблему, совершенно сбивает с толку:

Cobertura нашла исходный код, но не предоставила достаточно информации для поиска исходного кода.

Что еще я Я пробовал

  1. Я гарантировал, что любой может прочитать исходный код (чтобы избежать проблем с доступом)
  2. Я изменил xml, поэтому filename содержит путь относительно : рабочая область jenkins, путь, где находится xml файл с отчетом Coverity
  3. скопировал мой исходный код в разные места, даже содержащий каталог "cobertura", так как что-то подобное я нашел в исходном коде плагина
  4. Я попытался разобраться в проблеме, изучив исходный код.
  5. Я нашел несколько (немного устаревших) проектов github , которые, возможно, подсказывают как исправить это - в настоящее время я пытаюсь понять, что именно он делает (я не хочу импортировать этот проект в свою структуру сборки).

Пока что не повезло.

Обновление:

Внезапно только (я не уверен, что я сделал) это работает для моей учетной записи. Проблема в том, что это работает только для меня, все другие пользователи имеют такую ​​же проблему. Это ясно указывает на то, что проблема должна быть в безопасности.

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Я столкнулся с очень похожей проблемой, когда мне пришлось разработать конвейер CI для очень большого клиента C ++. У меня были лучшие результаты, если я избегал Cobertura Plugin и вместо этого использовал HTML Publisher Plugin . Основной проблемой, с которой я столкнулся, был также поиск исходных файлов.

  1. Преобразование OpenCppCoverage результата в HTML

Этот шаг довольно прост. Вы должны добавить параметр --export_type=html:<outputPath> (см. Commandline-reference ) к вызову OpenCppCoverage.

mkdir CodeCoverage
OpenCppCoverage.exe --export_type=html:CodeCoverage <GoogleTest.exe>

Приведенные выше команды должны привести к html -файлу в справочник <jenkins_workspace>/CodeCoverage/index.html

Publi sh результат OpenCppCoverage

Для этого мы используем HTML Publisher Plugin, как я упоминал выше. reportDir - это каталог, созданный на первом этапе и содержащий наш html -файл. Его путь относительно рабочего пространства Jenkins.

    publishHTML target: [
      allowMissing: false,
      alwaysLinkToLastBuild: true,
      keepAll: true,
      reportDir: 'CodeCoverage',
      reportFiles: 'index.html',
      reportName: 'Code Coverage'
      ]

, и чтобы быть уверенным, что каждый может загрузить и проверить результат локально, мы архивируем результат OpenCppCoverage:

   archiveArtifacts artifacts: 'CodeCoverage/*.*'

You Теперь вы можете увидеть результат на боковой панели вашего конвейера под Code Coverage, и результат будет выглядеть следующим образом:

enter image description here enter image description here

Это решение, которое сработало для меня.

Надеюсь, это поможет хоть немного. Я могу только совет избегать Cobertura Plugin. Я потратил впустую так много времени, пытаясь исправить это и узнать мои источники ...

1 голос
/ 28 января 2020

Хорошо, я нашел причины, по которым у меня возникли проблемы с этим плагином.

  1. xml из openCppCoverage просто правильно. Никаких изменений здесь не требуется, чтобы заставить его работать (если есть источники, на которые указывает файл pdb). Источники вне рабочего пространства Jenkins здесь не проблема. Когда я скопировал исполняемый файл со сборочной машины на тестовую машину, затем запустил тесты с openCppCoverage и скопировал результат обратно на сборочную машину, это нормально.

  2. В конфигурации задания любой пользователь, который должен Просмотр покрытия кода должен иметь доступ к Job/workspace в разделе безопасности. В моем случае я включил это для всех зарегистрированных пользователей. enter image description here Это охватывает последний пункт сообщения об ошибке.

  3. Самое важное: сборка должна быть успешной . Я имею в виду от начала до конца. Не измеряет, был ли успешен шаг, содержащий вызов плагина cobertura. Если какой-либо шаг (даже в будущем шаге) не удался, то cobertura не будет показывать код для этого прогона покрытия. В моем случае работа по сборке не удалась, поскольку время одного из тестов истекло. Это было вызвано накладными расходами openCppCoverage, что замедляет тесты в 3. Мой сценарий обнаружил таймаут и убил один из тестов.

Я обнаружил, что неудачная сборка была проблемой случайно. Во время экспериментов я заметил два случая, когда cobertura показывал исходный код:

  • Я перезапустил работу и удалил все шаги, кроме одного, ответственного за публикацию результатов coloratura
  • Я выполняю всю работу таким образом он запускает один тестовый пример, который прошел

Недопустимо сея покрытие, если сборка не удалась (если тест не удался, то, скорее всего, была взята неверная ветвь кода), но пользовательский интерфейс должен указывать, что в другом way.

Заключение

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

Я отправлю отчет, что плагин должен дать лучшее объяснение, что пошло не так.

...