SonarQube Analysis не показывает покрытие кода

У меня есть проект Jenkins для анализа моего проекта NodeJS с помощью SonarQube. Я добавил istanbul как зависимость к package.json моего проекта. В конфигурации сборки Jenkins сначала я запускаю сценарий оболочки:

cd ./project-name
npm install
node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha path-to-unit-tests
node_modules/.bin/istanbul report cobertura
cd ..

Это устанавливает зависимости, запускает тесты и генерирует отчет о покрытии кода, а также создает файл cobertura-охват.xml.

После сценария оболочки я запускаю Invoke Standalone SonarQube Analysis со следующими свойствами для покрытия кода:

sonar.java.coveragePlugin=cobertura
sonar.dynamicAnalysis=reuseReports
sonar.cobertura.reportPath=./project-name/coverage/cobertura-coverage.xml

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

Version of SonarQube server: 5.2
Version of JavaScript plguin used on SonarQube: 2.9
Version of Cobertura plugin used on SonarQube: 1.6.3
Version of Cobertura plugin used on Jenkins: 1.9.7
Version of NodeJS plugin used on Jenkins: 0.2.1

Я проверил, что в рабочей области есть файл cobertura-coverage.xml. Также проверил журналы консоли сборки и не обнаружил ошибок. Я также пробовал продвигать покрытие кода с использованием формата LCOV раньше:

sonar.dynamicAnalysis=reuseReports
sonar.javascript.lcov.reportPath=./project-name/coverage/lcov.info

Отчет не публикуется в SonarQube, хотя отчет о покрытии создается в рабочей области Jenkins. Я посмотрел содержимое рабочего пространства и проверил. Журналы консоли показывают создание отчета о покрытии. Также пробовал

sonar.dynamicAnalysis=reuseReports
sonar.javascript.lcov.reportPath=project-name/coverage/lcov.info

а также

sonar.dynamicAnalysis=reuseReports
sonar.cobertura.reportPath=project-name/coverage/cobertura-coverage.xml

но безрезультатно. Я также перезапустил серверы Jenkins и SonarQube по 2 раза каждый. Просмотрел много похожих вопросов в StackOverflow и в других местах, но не нашел ничего, что работает.

Если я добавлю действие после сборки Publish Cobetura Coverage Report и укажу путь к файлу cobetura-extension.xml в поле Cobertura xml report pattern, отчет о покрытии кода будет опубликован в Jenkins.

Посмотрел логи фоновых задач в SonarQube и увидел исключение.

java.lang.IllegalStateException: Cannot persist sources of project-key:project-name/node_modules/jscs/jscs-browser.js
at     org.sonar.server.computation.step.PersistFileSourcesStep$FileSourceVisitor.visitFile(PersistFileSourcesStep.java:132) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitNode(DepthTraversalTypeAwareCrawler.java:72) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:44) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitChildren(DepthTraversalTypeAwareCrawler.java:91) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:47) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitChildren(DepthTraversalTypeAwareCrawler.java:91) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:47) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.step.PersistFileSourcesStep.execute(PersistFileSourcesStep.java:89) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.step.ComputationStepExecutor.execute(ComputationStepExecutor.java:39) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.taskprocessor.report.ReportTaskProcessor.process(ReportTaskProcessor.java:53) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.taskprocessor.CeWorkerRunnableImpl.executeTask(CeWorkerRunnableImpl.java:78) [sonar-server-5.2.jar:na]
at org.sonar.server.computation.taskprocessor.CeWorkerRunnableImpl.run(CeWorkerRunnableImpl.java:55) [sonar-server-5.2.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_45-internal]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_45-internal]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_45-internal]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_45-internal]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45-internal]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_45-internal]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45-internal]
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.PacketTooBigException:     Packet for query is too large (7989143 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
### The error may involve org.sonar.db.source.FileSourceMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO file_sources (project_uuid, file_uuid, created_at, updated_at, binary_data, line_hashes, data_hash,     src_hash, data_type, revision)     VALUES (?, ?, ?,     ?, ?, ?,     ?, ?,?,     ?)
### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (7989143 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:154) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:141) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52) ~[mybatis-3.2.7.jar:3.2.7]
at com.sun.proxy.$Proxy84.insert(Unknown Source) ~[na:na]
at org.sonar.db.source.FileSourceDao.insert(FileSourceDao.java:117) ~[sonar-db-5.2.jar:na]
at org.sonar.server.computation.step.PersistFileSourcesStep$FileSourceVisitor.persistSource(PersistFileSourcesStep.java:160) ~[sonar-server-5.2.jar:na]
at org.sonar.server.computation.step.PersistFileSourcesStep$FileSourceVisitor.visitFile(PersistFileSourcesStep.java:130) ~[sonar-server-5.2.jar:na]
... 18 common frames omitted
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (7989143 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3540) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2417) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2535) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1911) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1203) ~[mysql-connector-java-5.1.35.jar:5.1.35]
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) ~[commons-dbcp-1.4.jar:1.4]
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) ~[commons-dbcp-1.4.jar:1.4]
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:44) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:69) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.ReuseExecutor.doUpdate(ReuseExecutor.java:50) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:105) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:71) ~[mybatis-3.2.7.jar:3.2.7]
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:152) ~[mybatis-3.2.7.jar:3.2.7]
... 25 common frames omitted

Итак, теперь я обновил строку генерации покрытия кода сценария оболочки до

node_modules/.bin/istanbul cover -x node_modules ./node_modules/.bin/_mocha path-to-unit-tests

По-прежнему получаю исключение. На основании max_allowed_packet у меня нет MySQL, мне нужно увеличьте значение MAX_ALLOWED_PACKET в настройках базы данных. Просто сделал это и повторно запустил задание Дженкинса для анализа SonarQube. Исключение исчезло. Фоновая задача в SonarQube выполнена успешно. Но я все еще не вижу покрытия кода модульного теста на панели инструментов. Других исключений нет. Когда я нажимаю кнопку «Настроить виджеты», на виджете модульного теста появляется метка «Нет данных». Когда я возвращаюсь к панели управления, виджет модульного теста исчезает.

Есть идеи, что мне не хватает?


person Prachi    schedule 04.01.2016    source источник


Ответы (2)


В первый раз (~ год назад), когда я начал изучать "Sonarqube" и пока делал настройку, все работало нормально. Я смог увидеть все показатели вместе с «покрытием кода».

Для этой используемой версии была: sonarqube-6.7.5, sonar-scanner: sonar-scanner-3.2.0.1227-macosx

После этого, когда я попробовал сегодня какой-то другой проект, но мне пришлось почти ~ 3 часа, чтобы определить, почему покрытие кода не отображается в отчете сонаркуба, хотя все настроено правильно.

Потратив некоторое время, я нашел ниже две темы блога, которые помогают мне понять, почему я не получаю отчет о покрытии.

Если я прочитал правильно, то, похоже, произошла ошибка, из-за которой после "lcov" путь отчета не распознавался, хотя он был настроен правильно.

Справочные ссылки:

невозможно-получить-код- покрытие для JavaScript

Исправлено: js-охват-не-работает-больше < / а>

Используемая версия: Docker-образ sonarqube: 8.3.0 & newtmitch / sonar-scanner как сонар-сканер.

Для справки. Файл Dockerfile из моей локальной установки, который используется для запуска сонара-сканера:

FROM newtmitch/sonar-scanner AS sonarqube_scan
COPY . /usr/src
RUN ls -list
RUN sonar-scanner \
    -Dsonar.host.url="http://localhost:9000" \
    -Dsonar.projectKey="test-node-app" \
    -Dsonar.projectVersion="1.0" \
    -Dsonar.sources="/usr/src" \
    -Dsonar.language="javascript" \
    -Dsonar.sourceEncoding="UTF-8" \
    -Dsonar.dynamicAnalysis="reuseReports" \
    -Dsonar.javascript.lcov.reportPaths="/usr/src/app/coverage/lcov.info"

Надеюсь, кому-то это поможет!

Удачного обучения!

person Vikash Kumar Choudhary    schedule 02.05.2020

Публикация отчета lcov сработала после того, как я исправил исключение, упомянутое в вопросе. Но иногда я случайно вижу другое исключение. Более того, виджет модульного теста на панели инструментов SonarQube показывает только покрытие условных операторов. Требуется более точная настройка решения.

sonar.dynamicAnalysis=reuseReports
sonar.javascript.lcov.reportPath=project-name/coverage/lcov.info
person Prachi    schedule 06.01.2016
comment
sonar.javascript.lcov.reportPaths. В конце должна быть буква «s». Источник: docs.sonarqube.org/latest/analysis/coverage. - person foreverAnIntern; 30.04.2020