本文是Jenkins + SonarQube自動化代碼審查平台的搭建過程記錄,主要記錄了Jenkins和SonarQube的集成過程,本文預設Jenkins已經通過Docker的方式搭建完成,所以不再贅述,請參考 https://hub.docker.com/_/jenkins 進行Jenkins的安裝部署。
環境
本文所使用的環境:
Jenkins ver. 2.207
java version "1.8.0_181"
sonarqube:8.5.0-community
postgres:13-alpine
安裝SonarQube
為了快速啟動sonarqube
實例,我們采用docker的方式。
sonarqube
默認為英文版的,檢查規則為自帶的,我們這里采用中文漢化,另外java
語言加入 阿里p3c 規則。
基於Docker-compose安裝
Github有一個SonarQube快速安裝的開源項目,我們可以在它的基礎上做一些細微的修改:
使用Git Clone項目
git clone https://github.com/purgeteam/sonarqube-start
cd docker-start
修改 sonar-docker-start.yml
,注意這里我們使用PostgreSQL作為SonarQube的數據庫,最新版本已經不支持MySQL。最終修改好的yaml文件內容如下:
# 漢化版+阿里p3c驗證
version: "2"
services:
sonarqube:
image: sonarqube:8.5.0-community
container_name: sonarqube
ports:
- "9000:9000"
networks:
- sonarnet
environment:
- sonar.jdbc.url=jdbc:postgresql://postgres:5432/sonar
- sonar.jdbc.username=sonar
- sonar.jdbc.password=sonar
volumes:
- /home/data/sonarqube/data/:/opt/sonarqube/data/
- /home/data/sonarqube/logs/:/opt/sonarqube/logs/
- /home/data/sonarqube/extensions/:/opt/sonarqube/extensions/
- /home/data/sonarqube/lib/bundled-plugins/:/opt/sonarqube/lib/bundled-plugins/
depends_on:
- postgres
restart: unless-stopped
postgres:
image: postgres:13-alpine
container_name: postgres
ports:
- "5432:5432"
networks:
- sonarnet
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes:
- /home/data/postgresql/:/var/lib/postgresql/
- /home/data/postgresql/data/:/var/lib/postgresql/data/
restart: unless-stopped
networks:
sonarnet:
driver: bridge
在使用docker-compose啟動容器之前,先建立好如下幾個文件夾,並copy兩個jar包到 /home/data/sonarqube/extensions/plugins
下:
mkdir -p /home/data/sonarqube/data
mkdir -p /home/data/sonarqube/logs
mkdir -p /home/data/sonarqube/extensions/plugins
mkdir -p /home/data/sonarqube/lib/bundled-plugins
mkdir -p /home/data/postgresql
mkdir -p /home/data/postgresql/data
# copy兩個jar包
scp plugin/rhinoceros/sonar-pmd-plugin-3.2.0-SNAPSHOT.jar root@10.100.1.19:/home/data/sonarqube/extensions/plugins
scp plugin/sonar-l10n-zh-plugin-1.16.jar root@10.100.1.19:/home/data/sonarqube/extensions/plugins
完成上面的操作后,使用docker-compose啟動容器:
docker-compose -f sonar-docker-start.yml up -d
啟動ok,查看控制台進行訪問localhost:9000
,默認賬號密碼:admin/admin
。
默認規則配置
雖然已經集成了阿里P3C,但是使用的還是默認規則,這里我們需要設置為指定規則。
以admin賬號登陸,打開 質量配置
頁,點擊右上方的創建
按鈕,創建 p3c profiles
首次創建會跳轉到代碼規則配置頁面,剛新建的 profile 是沒有激活任何規則的,需要手動激活
我們需要為剛創建的 p3c profile 激活 p3c 規則,點擊【激活更多規則】
跳轉到激活頁面,搜索p3c,如圖,都是以[p3c]
開頭的規則。
批量修改->活動 p3c -> 應用 -> 成功
綁定規則成功后基本完成,我們返回質量配置
,在java
選擇剛設置的p3c
設置為默認。
配置阿里P3C已經完成。
集成Jenkins
安裝SonarQube Plugin
管理員權限登錄Jenkins,選擇:系統管理-->插件管理-->可選插件;搜索SonarQube Plugin,勾選,安裝后重新啟動JenKins。
由於我的環境是內網環境,所以只能采取離線安裝的方式:
選擇:系統管理-->插件管理-->高級-->上傳插件,上傳插件完成安裝,離線插件的下載地址:https://plugins.jenkins.io/sonar/ 。
配置SonarQube Scanner
除了安裝Plugin,還需要安裝Scanner作為掃描的客戶端,同樣我們采用離線安裝的方式,SonarQube Scanner的下載地址:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ ,這里我使用了當下最新的版本,sonar-scanner-cli-4.5.0.2216-linux.zip 。
如果Jenkins配置了Slave節點,那么每個節點都需要安裝scanner!!!
下載之后解壓到 /var/jenkins_home/
,並將文件夾重命名為 sonar-scanner
。
管理員權限登錄進入:系統管理--> 全局工具配置-->SonarQube Scanner,配置Scanner:
配置SonarQube Servers
系統管理-->系統設置-->SonarQube servers,填寫Name和Server URL,Name可以隨意填寫,Server URL就是SonarQube的url地址,除此之外,還需要配置token,token需要在在SonarQube中生成。
將生成的token配置為Jenkins的憑據:
憑據配置完成后,配置SonarQube Servers,最終效果圖如下:
至此,Jenkins的配置全部完成,接下來開始配置Git觸發Jenkins掃描。
Jenkins Job配置
這里假設Jenkins的Job已經配置好,我們可以選擇在 Pre Steps
或者 Post Steps
進行Sonar的配置,這里我選擇了在 Post Steps
進行SonarQube的配置:
主要配置Analysis properties,我的配置如下:
#key和name保持一致且在sonar下唯一
sonar.projectKey=${POM_GROUPID}:${POM_ARTIFACTID}
sonar.projectName=${POM_ARTIFACTID}
#工程版本
sonar.projectVersion=${GIT_BRANCH}
#sonar.branch.name=${GIT_BRANCH}
#源代碼目錄
sonar.sources=$WORKSPACE
#分析的語言
sonar.language=java
#編碼sonar.sourceEncoding=UTF-8
sonar.java.binaries=$WORKSPACE
# setting the java class version
sonar.java.source=1.8
完整配置如圖:
完成后進行自動掃描,Jenkins Job的界面和Sonar的界面分別如下:
其他
社區版的SonarQube不支持多分支的掃描,目前有個開源插件可以支持,但是只支持有限的版本,有興趣的可以嘗試一下:https://github.com/mc1arke/sonarqube-community-branch-plugin 。