Sonarqube является отличным инструментом для качества кода и проверки безопасности. Это один из инструментов, которые мы используем для обеспечения измерения и улучшения качества наших продуктов с течением времени.
Мы также используем Gitlab — Управление кодом и инструмент CI/CD в некоторых наших проектах. Анализ кода Sonarqube интегрирован как шаг в наши конвейеры Gitlab CI.
В течение долгого времени у меня было настраиваемое изображение Docker для этих целей, автоматически созданное и опубликованное в реестре контейнеров Gitlab.
Несмотря на то, что этот изображение Docker на заказ довольно автоматизировало, добавляло к обслуживанию трубопроводов. Я был рад видеть, что Sonarsource недавно опубликовал Официальное изображение SonarsCanner Cli Docker и Объявлена поддержка интеграции Gitlab в V8
Sonarsource/Sonar-Scanner-Cli-Docker
Docker Image для SonarsCanner CLI
Изображение Docker ожидает, что код будет установлен на $ Pwd
, который установлен на /usr/src
. Это отличается от того, где Gitlab устанавливает каталог источников по умолчанию.
Чтобы все это работало, должна быть установлена следующая переменная среды:
sonar: image: sonarsource/sonar-scanner-cli script: - sonar-scanner -Dsonar.qualitygate.wait=true allow_failure: true variables: SONAR_PROJECT_BASE_DIR: "${CI_PROJECT_DIR}"
Переменная среды Sonar_project_base_dir
переопределяет поведение по умолчанию Анкет Предопределенная переменная среды Gitlab Ci_project_dir
Относится к месту, где Gitlab устанавливает исходный код проекта.
Без этой переменной установите следующая ошибка вводящего в заблуждение в журнале Gitlab:
ERROR: Error during SonarScanner execution java.lang.IllegalStateException: Unable to create user cache: /usr/src/.sonar/cache at org.sonarsource.scanner.api.internal.cache.FileCache.createDir(FileCache.java:147) at org.sonarsource.scanner.api.internal.cache.FileCache.(FileCache.java:46) at org.sonarsource.scanner.api.internal.cache.FileCache.create(FileCache.java:52) at org.sonarsource.scanner.api.internal.cache.FileCacheBuilder.build(FileCacheBuilder.java:48) at org.sonarsource.scanner.api.internal.JarDownloaderFactory.create(JarDownloaderFactory.java:42) at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory.createLauncher(IsolatedLauncherFactory.java:68) at org.sonarsource.scanner.api.EmbeddedScanner.doStart(EmbeddedScanner.java:185) at org.sonarsource.scanner.api.EmbeddedScanner.start(EmbeddedScanner.java:123) at org.sonarsource.scanner.cli.Main.execute(Main.java:73) at org.sonarsource.scanner.cli.Main.main(Main.java:61) Caused by: java.nio.file.AccessDeniedException: /usr/src/.sonar at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source) at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(Unknown Source) at java.base/java.nio.file.Files.createDirectory(Unknown Source) at java.base/java.nio.file.Files.createAndCheckIsDirectory(Unknown Source) at java.base/java.nio.file.Files.createDirectories(Unknown Source) at org.sonarsource.scanner.api.internal.cache.FileCache.createDir(FileCache.java:145) ... 9 more ERROR: ERROR: Re-run SonarScanner using the -X switch to enable full debug logging.
Улучшения
Было бы неплохой идеей кэшировать каталоги сканера сонара, которые будут повторно использованы в будущих пробегах трубопровода:
sonar: image: sonarsource/sonar-scanner-cli script: - sonar-scanner -Dsonar.qualitygate.wait=true allow_failure: true variables: SONAR_PROJECT_BASE_DIR: "${CI_PROJECT_DIR}" cache: key: "sonar-${CI_PROJECT_ID}" paths: - ".scannerwork" - ".sonar"
В моем конкретном случае анализ Sonarqube не зависел от каких -либо других шагов в трубопроводе, поэтому я использовал потребности
и зависимости
Свойства, чтобы заставить его работать заранее и пропустить скачивание артефактов других шагов.
sonar: image: sonarsource/sonar-scanner-cli needs: [] dependencies: [] script: - sonar-scanner -Dsonar.qualitygate.wait=true allow_failure: true variables: SONAR_PROJECT_BASE_DIR: "${CI_PROJECT_DIR}" GIT_DEPTH: 0 cache: key: "sonar-${CI_PROJECT_ID}" paths: - ".scannerwork" - ".sonar"
Наконец, я использовал Git_depth
переменная среды для обеспечения соблюдения Мелкий клон нашего довольно большого репозитория.
Оригинал: «https://dev.to/mungell/setup-sonarqube-with-gitlab-542b»