Gitlab-CI與Sonar的故(pei)事(zhi)

菁蕪發表於2020-04-05

背景

通過 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

Gitlab-CI與Sonar的故(pei)事(zhi)

Gitlab-CI與Sonar的故(pei)事(zhi)

為啥會執行 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 STRATEGYGIT_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: 這是我在掘金的第一篇水文,就是突然想寫點東西~~~~~~

Gitlab-CI與Sonar的故(pei)事(zhi)

相關文章