SonarQube and sonar-gitlab-plugin|Piece of DevOps

在之前的文章中,已經提及了 SonarQube 的建置及如何使用 Ant 將專案傳上 SonarQube。接下來介紹一個相當有趣且實用的 SonarQube Plugin 給使用 Gitlab-CI 的朋友們,那就是:
Sonar GitLab Plugin
透過這個 Plugin,SonarQube 審查的結果會直接回傳至 Gitlab 對應的專案上。也就代表你並不需要刻意開啟 SonarQube 的網頁,才會知道這次的 Commit 中有哪些潛在的 Bug 或不符合 Coding Style 的地方。需要注意的是,目前(2020/03/14) Sonar GitLab Plugin 最高支援到 SonarQube 7.6(<7.7),這也是為什麼在之前的文章中會使用 SonarQube 7.6 的原因。現在就把它加入 SonarQube 中開始吧!

安裝 Sonar GitLab Plugin

首先,可能是因為 Sonar GitLab Plugin 已經不支援最新版,所以在 SonarQube Marketplace 已經找不到它了,所以我們需要透過 Jar 直接安裝。以下是取得 Sonar GitLab Plugin 的 Jar 檔連結(2020/03/14):


現在已經有 Jar 檔了,那要怎麼安裝呢?在這裡有兩種方式。第一種,直接到 SonarQube Container 中的 /opt/sonarqube/extensions/plugins 目錄下,將這個 Jar 檔放進去。第二種則是提供給<將 /opt/sonarqube/extensions/ 目錄 mount 出來的狀況,此時也只需要把這個 Jar 放置於 mount 出來的目錄中的 downloads/ 目錄中即可。例如:
# 如 mount 出 extensions 的指令是:
-v /home/user1/sonar/sonarqube_extensions:/opt/sonarqube/extensions
# 則將 sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar 放置於:
/home/user1/sonar/sonarqube_extensions/downloads
現在重啟 SonarQube 即可。重啟完後就可以在 SonarQube 上的 Markplace 看到它囉!

建立 GitLab 與 SonarQube 間的連結

接下來就是比較麻煩的部分,也就是將 GitLab 與 SonarQube 做連接。以下可以分為兩個步驟:
  • 在 GitLab 上建立 SonarQube 使用得帳號,並取得 Access Token 供 SonarQube 使用。
  • 透過 Gitlab-CI 將特定參數傳給 SonarQube 讓它可以協助分析及回傳分析結果。
首先,我們來創 SonarQube 要使用得帳號吧!GitLab 的創建流程如下:
  1. 以 Admin 登入 GitLab。
  2. 點選左上角的鈑手圖示。
  3. Dashboard 中間的區塊 User 中,可以找到 New user 的按鈕,並點擊。
  4. 填入必要的 Name、Username、Email(Email 可任意填)即可。 

接下來,開始產生 Access Token 讓 SonarQube 有權限回傳結果至 GitLab。那要怎麼產生呢?就在創建完帳號後的頁面中,你可以看到 impersionation 的按鈕。點擊後,就會直接進入產生Token 的畫面。其中的 Name 只是 token 的名稱,任意填即可,Expires at 如果不填則是代表這隻 Token 沒有使用期限,最後勾選使用權限為 api,就可以按下 Create 了!

結果如下。記得要把 Token 記好,像是先貼在剪貼簿上之類的,因為這是它唯一會出現的時候,如果沒記下來,就只能再重建一把囉。
是不是以為 GitLab 的部分就結束了呢?事實上還最重要的一步,就是把使用者 SonarQube 加入需要分析的專案之中,且是 Maintainer 權限。

Sonar GitLab Plugin 設定

目前我們已經準備好 Token 了,接下來就把 Token 放到 SonarQube 中吧!這次透過SonarQube 的網頁完成。以 Admin 登入後,點選網頁中上的 Administration,選擇 Configure 中的 GitLab(也就是我們剛剛安裝的 Sonar GitLab Plugin)。並設定 GitLab 的網址,及剛剛產生的 Token 即可(如下)。
在此設定頁面中,其實還有很多設定,可以幫助你改變 SonarQube 所產生的 Report,這部分就留給讀者依需求嘗試,就不多作介紹囉。

.gitlab-ci.yml 設定

現在假設你已經有一個專案是已經可以上傳至 SonarQube。如果還沒有,可以參考使用 Ant 的版本。專案準備好後,接下來先來準備一隻 Script: ci-script.sh 來執行相關的內容吧。其中如下:
#! /bin/bash
# pre-task
ant -f ivy-retrieve.xml
ant -f run_junit.xml
# push to sonar
ant -f sonar.xml -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \
    -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \
    -Dsonar.gitlab.project_id=$CI_PROJECT_ID
在專案下建立完這隻 Script 後,記得要給予執行權限:
$ chmod 700 ./ci-script.sh
Script 中的 pre-task 是之前文章中,將檔案上傳至 SonarQube 需準備的相關程序,這邊所執行的事項是依專案所需,就當作可選項目即可。接下來的 sonal.xml 同樣是之前文章中,用來上傳專案至 SonarQube 的 Ant buildfile,這部分最重要的是後面帶的參數。這三個參數是讓 SonarQube 把分析結果回傳至 GitLab 的基本參數,分別代表:
  • sonar.gitlab.commit_sha:當次 commit 的 SHA code。
  • sonar.gitlab.ref_name:Branch 名稱。
  • sonar.gitlab.project_id:在 GitLab 中的專案 ID。
帶進去的值,則是讓 GitLab-CI 幫我們帶入,也就是 Script 中,CI 開頭的環境變數(可參考:GitLab CI/CD environment variables)。這邊結束後,就剩下設定 .gitlab.yml 了。其設定如下:
ckeck-with-sonar:
  image: "frekele/ant:1.10.3-jdk8"
  tags:
   - "all-in-one"
  script:
    - ./ci-script.sh
這邊的設定就相對簡單,指定好我們需要使用的 Image 及使用到的 Runner 的 Tag,最後補上執行剛剛寫好的 ci-script.sh。順道一提,為什麼要把指令包在一個 Script 內呢?因為指令中有些字元會讓 Gitlab 解析 .gitlab-ci.yml 時產生錯誤,為了避免這樣的情況發生,所以才會把指令都寫在 Script 中。

以上都設定完後,就可以來 Push 我們的專案至 GitLab 來看看,SonarQube 會不會回報什麼給我們囉!

SonarQube 講話囉!

以這次 Commit 為例,SonarQube 發現了一些錯誤,也在註記那些錯誤程式碼,最後也產生一個總結報表(如下圖)。
以上就是透過 Sonar Gitlab Plugin 將 GitLab 與 SonarQube 整合的方式,希望有幫助到你的 CI/CD 環境架設!

熱門文章