背景
通過 Gitlab-CI 自動將 Jacoco 的執行結果上報至 Sonar
Gitlab Runner 和 Sonarqube 都是基於 Docker 執行
First 一步到位
.gtitlab-ci.yml
image: maven:3.6.3-jdk-8
before_script:
- mvn clean
test:
script:
- mvn verify sonar:sonar
複製程式碼
簡單粗暴,等流水線跑完,就能夠在 Sonar 服務中看程式碼掃描結果(假定 Pom 中已配置好 Soanr 的相關引數)
我以為的需求 ↑ ------------------- 實際的需求 ↓
Last 按步執行
為方便在 Sonar 之前執行額外的 Stage
test-job 完成然後執行 sonar-job,sonar-job會把 test-job 的執行結果推送到 Sonar
.gtitlab-ci.yml
··· ignore ···
test-job:
stage: test
before_script:
- mvn clean
script:
- mvn verify
sonar-job:
stage: sonar
script:
- mvn sonar:sonar
複製程式碼
But... 跑了好多次流水線都是 Failed(瞧,一天就過去了),特別是一開時沒有將 Sonar 相關的 Maven 依賴掛載出來,跑一次流水線需要 20 分鐘,除錯效率可想而知(雖然 Runner 配置了 Maven 依賴的掛載,因為 Sonar 還有自己的快取資料需要掛載,就是下面的路徑(暫且這麼認為),掛載後直接將達幾十秒,跑流水線一定要把 Maven 依賴掛載出來,不然每次 PR 真的欲仙欲死)
/root/.sonar/cahce
為啥會執行 Remove 操作!!!!,這操作把 sonar-job 需要的資料給理清了
找了很久的原因,看著 gitlab-ci 的官方文件,嘗試了 artifact 、cache,想將 test-job 生成的 target 傳遞給 soanr-job
artifact 方式沒成功,cache 成功了,but...肯定不行
最後發現 remove 操作之前是 git checkout, 這一步操作會將本地的改動還原掉,也就是把 test-job 構建好的內容清理掉.......(心情複雜.jpg & 我怎麼這麼辣雞.jpg)
因此阻止 sonar-job 進行 checkout 操作就行
再次開啟了 gitlab-ci 的 配置說明文件,瀏覽器 Ctrl+F ,輸入:checkout(太懶了,從頭看到尾太難了)
Got you, variables 中有兩個 GIT STRATEGY, GIT_CHECKOUT 屬性
-
GIT STRATEGY 設定為 none
-
GIT_CHECKOUT 設定為 "false"(沒錯,就是字串,還得帶引號)
以上兩種方式都可,要注意的是得配置在某個不希望進行檢出操作的 Job 中,而不是全域性的
配置參考
.gtitlab-ci.yml
image: maven:3.6.3-jdk-8
stages:
- test
- sonar
test-job:
stage: test
before_script:
- mvn clean
script:
- mvn verify
sonar-job:
stage: sonar
script:
- mvn sonar:sonar
variables:
GIT_CHECKOUT: "false"
複製程式碼
pom.xml
··· ignore ···
<profile>
<id>sonar</id>
<properties>
<sonar.host.url>http://127.0.0.1:9000</sonar.host.url>
<sonar.login>soanr access token</sonar.login>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.coverage.jacoco.xmlReportPaths>${project.build.directory}/jacoco-ut/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
<sonar.language>java</sonar.language>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.7.0.1746</version>
</plugin>
</plugins>
</build>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
··· ignore ···
複製程式碼
PS: 這是我在掘金的第一篇水文,就是突然想寫點東西~~~~~~