本文所要達(dá)到的效果: 在push時自動觸發(fā)GitLab CI/CD pipeline job, 自動掃描所提交的代碼, 并將結(jié)果上報到sonarqube
名詞解釋:
SonarQube? - 是一個檢測bug, 漏洞及代碼異味的自動化工具. 它可以整合到現(xiàn)有的工作流中去啟用持續(xù)的代碼審查在項目的多分支及PR中.
SonarScanner for Maven - 通過常規(guī)的Maven命令執(zhí)行SonarQube分析的工具.
GitLab CI/CD 是一個內(nèi)置在GitLab中的工具瞭亮,用于通過持續(xù)方法進(jìn)行軟件開發(fā):
- Continuous Integration (CI) 持續(xù)集成
- Continuous Delivery (CD) 持續(xù)交付
- Continuous Deployment (CD) 持續(xù)部署
持續(xù)集成的工作原理是將小的代碼塊推送到Git倉庫中托管的應(yīng)用程序代碼庫中猬腰,并且每次推送時,都要運行一系列腳本來構(gòu)建、測試和驗證代碼更改贾节,然后再將其合并到主分支中。
持續(xù)交付和部署相當(dāng)于更進(jìn)一步的CI吟税,可以在每次推送到倉庫默認(rèn)分支的同時將應(yīng)用程序部署到生產(chǎn)環(huán)境犬辰。
這些方法使得可以在開發(fā)周期的早期發(fā)現(xiàn)bugs和errors,從而確保部署到生產(chǎn)環(huán)境的所有代碼都符合為應(yīng)用程序建立的代碼標(biāo)準(zhǔn)填物。
GitLab CI/CD 由一個名為 .gitlab-ci.yml 的文件進(jìn)行配置全庸,改文件位于倉庫的根目錄下。文件中指定的腳本由GitLab Runner執(zhí)行融痛。
軟件版本:
SonarQube: 8.9.2 lts-community
SonarScanner for Maven: 3.9
GitLab Runner: gitlab/gitlab-runner:alpine
Docker安裝SonarQube
docker-compose.yml
version: "3"
services:
sonarqube:
image: sonarqube:lts-community #8.9.2社區(qū)長期支持版
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "9000:9000" #暴露端口9000
db:
image: postgres:12
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
安裝好后設(shè)置管理員密碼, 在 administration - marketplace中搜索并下載中文插件, 重啟
多分支插件
安裝步驟:
將下載的jar文件拷貝到sonar安裝目錄下extensions/plugins/ 及 lib/common下, 并將權(quán)限設(shè)為775
在sonar安裝目錄下的config/sonar.properties中添加
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=web
配置項在sonar安裝目錄下的config/sonar.properties中添加
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=ce
配置項重啟SonarQube(在docker容器重啟, 如果使用儀表板的重啟服務(wù)器會導(dǎo)致插件不生效), 然后忽略使用第三方插件的警告
注意一定要將jar包權(quán)限設(shè)置為775, 并且要同時復(fù)制到 lib/common 下
GitLab-Runner 安裝及配置
docker安裝GitLab-Runner
docker pull gitlab/gitlab-runner
注冊一個Runner
以下是安裝GitLab Runner完之后的步驟.
以下的步驟描述了啟動并注冊一個短期gitlab-runner容器. 注冊后, 容器的配置會寫入你配置掛載的volume(例如/srv/gitlab-runner/config), 并且會被runner載入.
通過Docker注冊一個Runner:
-
根據(jù)不同的掛載類型運行相應(yīng)的注冊命令:
掛在到本地文件系統(tǒng):
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
如果你在安裝期間配置了其他位置的volume, 替換/srv/gitlab-runner/config成你配置的volume.
掛載到docker volume:
docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
輸入GitLab地址.
輸入從GitLab獲取的token.
輸入這個Runner的詳情描述. 你可以到GitLab的用戶界面修改該詳情.
輸入 runner所關(guān)聯(lián)的tag, 多個tag用逗號隔開. 你可以在GitLab的用戶界面修改該值.
runner需要的 執(zhí)行器. 對于大多數(shù)情形來說, 輸入docker. 執(zhí)行器選取可以參考Executors | GitLab.
如果你使用docker作為執(zhí)行器, 需要提供默認(rèn)的運行鏡像, 假如 .gitlab-ci.yml`文件沒有指定的話會在默認(rèn)鏡像中運行.
注冊sonar-scanner-maven Runner
-
運行命令
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register
填寫所需要的信息, GitLab地址和token可以在 GitLab項目設(shè)置 - CI/CD - Runner中找到
- 注冊完后, 會在GitLab 項目設(shè)置 - CI/CD - Runner中看到注冊的Runner
-
因為我們選擇了使用docker執(zhí)行器來運行maven鏡像, sonar-scanner-maven掃描器在掃描項目時會下載所需要的所有依賴, 并且有可能會找不到我們自己所打包的依賴, 為了防止掃描器下載時間過長及找不到我們自定義的依賴, 需要將本地依賴倉庫放入服務(wù)器上, 將倉庫目錄掛載到runner的volume.
① 將本地依賴拷入到服務(wù)器/root/gitlab-runner-temp/maven-repository
② 進(jìn)入gitlab-runner容器修改config.toml
找到我們剛配置的 runner
在volumes后添加"/root/gitlab-runner-temp/maven-repository:/root/.m2/repository:rw", 將宿主機(jī)的/root/gitlab-runner-temp/maven-repository掛載到 runner啟動時maven容器中的默認(rèn)repository位置
掃描分析項目
參考GitLab Integration | SonarQube Docs
設(shè)置禁用淺克隆
具體原因為確保掃描器可以訪問GitLab執(zhí)行CI/CD時的所有歷史
項目設(shè)置 - CI/CD - 流水線通用設(shè)置 - Git 淺克隆
設(shè)置為0
定義一些公共變量
項目設(shè)置 - CI/CD - 變量
變量可以參考https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
其中sonar_login和sonar_token參數(shù)可以在sonarqube中 點擊右上角頭像 - 我的賬號 - 安全 - 生成令牌中獲取
創(chuàng)建.gitlab-ci.yml文件
創(chuàng)建.gitlab-ci.yml文件到項目根目錄, .gitlab-ci.yml配置項可參考Keyword reference for the .gitlab-ci.yml file | GitLab
.gitlab-ci.yml
stages: # 定義gitlab pipeline執(zhí)行步驟
- sonarqube-check
sonarqube-check:
stage: sonarqube-check
tags: # 指定gitlab runner tag
- sonar-scanner-maven
image: maven:3.6.3-jdk-11 # 指定運行鏡像, 如果docker沒有會自動pull
variables: # 變量, 有些變量像SONAR_HOST_URL, SONAR_TOKEN, SONAR_LOGIN在gitlab CI/CD 變量中配置過, 所以可以不用重復(fù)配置
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # 聲明分析任務(wù)緩存文件夾
GIT_DEPTH: "0" # 告訴git獲取所有的分支, 分析任務(wù)強(qiáng)制要求
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
# 此位置配置新的服務(wù) 配置參數(shù)參考 https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
# 一定要指定sonar.projectKey和sonar.projectName兩個參數(shù)
- mvn verify sonar:sonar -X -Dmaven.test.skip=true -Dsonar.qualitygate.wait=true -am -Dsonar.projectKey=com.company.project:projectName -Dsonar.projectName=projectName
allow_failure: true
BTW
可以在IDEA中安裝sonarlint插件來獲取sonarqube配置的規(guī)則, 并實時在編碼時掃描
plugin:SonarLint - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)
另外需要安裝 Node.js
下載安裝好后, 切換到sonarlint選項卡, 點擊右邊的設(shè)置
配置連接
點擊 + 號
配置好后, 點擊Search in list, 會將所有項目列入左邊方框, 選中相應(yīng)項目即可