建置 SonarQube|Piece of DevOps

建置一套基本的程式碼自動審查機制,因為有 Docker 其實並不困難。首先介紹如何在 Docker 上快速建置程式碼審查的環境:
SonarQube
SoanrQube 在 Community 版本中,可以審查大部分常用的語言(可審查語言列表)。SonarQube 審查後,會進一步產生報告,顯示是否有潛藏的漏洞,或著有可以改進的地方,並且提供對應問題的由來及處理方針。這對專案來說,不僅能提高整體品質,進一步還能增進程式開發者 Coding 相關概念及能力。

既然是快速建置,所以在這裡直接使用在 Docker Hub 上,SonarQube 提供的 Image(sonarqube - Docker Hub)來建置。版本的選擇上,則是使用 7.6-community。選擇此版本是為了之後使用 sonar-gitlab-plugin這部分,會在後續的文章中會再詳細討論。確認版本後,就直接把它拉下來吧!
$ docker run \
  --name sonarqube7.6 \
  -p 9090:9000 \
  -d sonarqube:7.6-community
SonarQube 預設的使用的 Port 是 9000。我們將此 Port 對應到本機的 9090,也就是我們從外部要連接它的 port 號。現在,我們擁有一個預設版的 SonarQube 了。我們也可以透過 http://127.0.0.1:9090 連接到我們的 SonarQube,其預設的帳號密碼都是 admin。但如果你有一堆的設定想餵給 SonarQube,你可以試試以下的方式:
$ docker run \
  --name sonarqube7.6 \
  -p 9090:9000 \
  -v $(pwd)/sonarqube_conf:/opt/sonarqube/conf \
  -v $(pwd)/sonarqube_extensions:/opt/sonarqube/extensions \
  -v $(pwd)/sonarqube_logs:/opt/sonarqube/logs \
  -v $(pwd)/sonarqube_data:/opt/sonarqube/data \
  -d sonarqube:7.6-community
在這裡,我們建立 4 個 Volume,讓我們能更便利的設定 SonarQube 及取得相關資訊,但需要注意的是,如果加入 sonarqube_extensions,SonarQube 將不會安裝任何預設的 plugin。這四個 Volume 分別用於:
  • sonarqube_conf:加入設定檔 sonar.properties(可設定項目介紹),重啟 Container 後生效。需注意,SonarQube 8.0 前,連接 DB 相關的兩個 config 是無法在 sonar.properties 中生效的,分別為
    • sonar.jdbc.username
    • sonar.jdbc.password
  • sonarqube_extensions:加入額外的 plugin,例如 sonar-gitlab-plugin。Container 啟動後,會在其中產生一個子目錄 downloads。將 plugin 的 jar 檔放進去,重啟SonarQube 後(http://127.0.0.1:9090/admin/system -> Restart Server),SonarQube 就會安裝對應的 plugin。
  • sonarqube_data:內建的 H2 Database 及 Elasticsearch 存儲資料的位置。
  • sonarqube_log:SonarQube 相關的 Log。
另外,Sonar 並不建議我們直接使用內建的 H2 Database,所以 SonarQube 提供建立與其他 DB 的連接的方式(可連接的 DB 及連接方式),並將分析的資料存放其中。以下介紹連接 Postgresql 的方式。首先,先開一個 Postgresql 的 Container:
$ docker run --name sonar-postgres \
  -e POSTGRES_PASSWORD=<presgres password> \
  -e POSTGRES_DB=<db name> \
  -d postgres 
  • POSTGRES_PASSWORD:預設帳號 postgres 的密碼。
  • POSTGRES_DB:預設 Database 的名字。
接下來,確認一下 Postgresql 在 Docker 中的 IP:
$ docker inspect sonar-postgres | grep -e "\"IPAddress" | tr " ,\"" "\0" | head -n 1
output> IPAddress:<sonar-postgres IP>
docker run 的時候,帶入以下參數,就可以連接到剛開啟的 Postgresql 囉:
$ docker run \
  --name sonarqube7.6 \
  -p 9090:9000 \
  -e sonar.jdbc.username=postgres \
  -e sonar.jdbc.password=<presgres password> \
  -e sonar.jdbc.url=jdbc:postgresql://<sonar-postgres IP>/<db name> \
  -d sonarqube:7.6-community
參數分別代表的是:
  • sonar.jdbc.username:DB 的 username,這邊使用的是 Postgresql 預設帳號  postgres。
  • sonar.jdbc.password:則是對應的 password,也就是剛剛建立 sonar-postgres 時給的 <presgres password>。
  • sonar.jdbc.url:連接 DB 的 URL,除了需要給 <sonar-postgres IP>,最後需要加上剛剛建立 sonar-postgres 時給的 <db name>,讓 SonarQube 知道要連接哪個 Database。
如此,我們就建置好 SonarQube 了!剛開始使用,建議先用預設的 SonarQube 即可,這樣可以避免少裝了某些 Plugin 而導致分析品質不佳的情形(抓不到蟲)。另外,SonarQube 還可以讓你找有哪些 Plugin 可以使用(http://127.0.0.1:9090/admin/marketplace),找到想裝的 Plugin 就可以直接安裝。可以善加利用這個功能哦!

熱門文章