SonarQube scans Java projects
關於如何掃描的前文
解決方案目前嘗試了兩種:
- maven 4.0之後直接引用插件
在CI腳本新增一個stage給maven插件
- 提供target/classes
在sonar-project.properties配置文件
加入sonar.java.binaries=target/classes
確認Maven版本
確認plugin版本
https://mvnrepository.com/artifact/org.sonarsource.scanner.maven/sonar-maven-plugin
第一種方式請參考官方文件
第一種方式:修改CI腳本
sonarqube-build:
stage: sonarqube-build
image: maven:3.8.1-openjdk-17
script:
- mvn clean install -Dmaven.test.failure.ignore=true
- mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.8.0.2131:sonar
only:
- <只在什麼分支或狀態觸發>
sonarqube-check:
stage: sonarqube-check
tags:
- <運行的runner標籤> # name of gitlab runner tag
image:
name: sonarsource/sonar-scanner-cli:5.0
entrypoint: [""]
variables:
GIT_DEPTH: 0
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner
allow_failure: true
needs:
- sonarqube-build
only:
- <只在什麼分支或狀態觸發>
第二種方式:
- 修改配置 sonar-project.properties
sonar.projectKey=<你的專案名稱>
sonar.qualitygate.wait=true
sonar.language=java
sonar.sources=.
# 忽略文件路径
# sonar.exclusions=**/*.java
# 編譯目錄參數
# sonar.java.binaries=./**/target/classes
- 修改CI腳本
原理在於mvn build階段會產生sonar需要的target/classes要沿用
build:
stage: build
tags:
- <運行的runner>
#觸發條件
rules:
- if: $CI_MERGE_REQUEST_LABELS == '<指定標籤>' && $CI_PIPELINE_SOURCE == 'merge_request_event'
script:
- bash <需要運行的build腳本>
#在這裡保留/target/classes路徑要對
artifacts:
paths:
- ./**/target/classes
reports:
dotenv: build.env
expire_in: 1 week
然後接著跑掃描器
scan:
stage: scan
tags:
- <運行的runner>
rules:
- if: $CI_MERGE_REQUEST_LABELS == '<指定標籤>' && $CI_PIPELINE_SOURCE == 'merge_request_event'
image:
name: sonarsource/sonar-scanner-cli:5.0
entrypoint: [""]
variables:
GIT_DEPTH: 0
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner
allow_failure: true
#需要運行好build階段才觸發
dependencies:
- build
needs:
- build
寫好之後觸發CI就能執行成功
有兩個stage
- build
- scan