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»