Фон
У меня большое приложение на 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 нашла исходный код, но не предоставила достаточно информации для поиска исходного кода.
Что еще я Я пробовал
- Я гарантировал, что любой может прочитать исходный код (чтобы избежать проблем с доступом)
- Я изменил xml, поэтому
filename
содержит путь относительно : рабочая область jenkins, путь, где находится xml файл с отчетом Coverity - скопировал мой исходный код в разные места, даже содержащий каталог "cobertura", так как что-то подобное я нашел в исходном коде плагина
- Я попытался разобраться в проблеме, изучив исходный код.
- Я нашел несколько (немного устаревших) проектов github , которые, возможно, подсказывают как исправить это - в настоящее время я пытаюсь понять, что именно он делает (я не хочу импортировать этот проект в свою структуру сборки).
Пока что не повезло.
Обновление:
Внезапно только (я не уверен, что я сделал) это работает для моей учетной записи. Проблема в том, что это работает только для меня, все другие пользователи имеют такую же проблему. Это ясно указывает на то, что проблема должна быть в безопасности.