SonarQube掃描Java專案配合Gitlab CI

Hachibye
5 min readJul 18, 2024

--

SonarQube scans Java projects

關於如何掃描的前文

解決方案目前嘗試了兩種:

  • maven 4.0之後直接引用插件

在CI腳本新增一個stage給maven插件

  • 提供target/classes

在sonar-project.properties配置文件

加入sonar.java.binaries=target/classes

第一種方式:修改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

--

--

Hachibye
Hachibye

Written by Hachibye

字幕組退休勞工 ... DevOps/系統/雲端/資安

No responses yet