使用gitlab runner進行CI(三):使用sonarqube做c++的靜態檢查

前兩次我們講了如何配置gitlab runner(坑挖了挺久,因為是挺久前弄的,後來交給其他人維護了···)。本節主要講gitlab-ci的一些基本概念,並通過配置使用sonarqube進行靜態檢查來進行實踐。

1. gitlab-ci.yml的配置

gitlab ci通過項目內的.gitlab-ci.yml進行配置。語言是YAML。

1.1 幾個基本概念

pipeline: 流水線,也就是整個CI檢查的過程
job: 工作項,可以取任意名字,可以建立任意個工作項,工作項是流水線的一個過程。
stage: 每個工作項可以屬於一個stage,類似於分組
script: script是工作項中執行具體檢查的shell 命令
before_script: 所有工作項執行前會執行的命令,一般用於配置環境。

example:

before_script:
##設置環境變量
  - export PATH=$PATH 

## 定義有哪些stages 
stages:
  - analysis
  - build
  - test
  - deploy

##job名稱
cppcheck:
  stage: analysis
  ##具體命令
  script: 
   - source ~/.bashrc
   - echo hello_ci
  tags:
  ## 執行此項job的runner,設置見本系列第二節
    - cppcheck 

1.2 使用CI進行代碼檢查demo

1.建立一個測試項目,並為其設置runner(參考 使用gitlab runner 進行CI(二):gitlab runner的安裝與配置)
2.創建.gitlab-ci.yml文件,並將上文example內容拷貝至該文件
3.提交修改
此時,在項目的CI/CD-》Pipelines頁面(或Job),我們就可以看到pipeline的運行情況:
image
其中Status指示是否成功,點擊Stages可進入相應Stage運行的詳細情況:
image
可以看到是依次執行了before_script和job中的script命令。並最終成功了。

2. Sonarqube安裝和配置

SonarQube是一種自動代碼審查工具,用於檢測代碼中的靜態錯誤,漏洞以及代碼異常(如命名規範、代碼重複等)。支持C++、Java、Python等多種語言,能夠方便的和git、Jenkins、Gitlab-runner等集成,可以方便的作為代碼PR前的前置條件。
image

2.1 Sonarqube安裝

PS: 安裝平台為Ubuntu
為了能使用後面需要用到的C++掃描插件,我們安裝7.6版本(這個插件現在支持更高版本的了,還沒試過):
//binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.6.zip
解壓即可,假設我們解壓的路徑為~/sonarqube。

2.2 數據庫配置

我這邊暫時使用mysql,不過sonarqube最新的版本已經放棄了mysql的支持,可以使用其他的數據庫。

sudo apt update  #更新軟件源
sudo apt install mysql-server  #安裝mysql

修改sonarqube的配置(~/sonarqube/conf/sonar.properties):
其中jdbc.username和jdbc.password都是我們自己的mysql用戶名和密碼

# User credentials.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=root
sonar.jdbc.password=123456

#----- Embedded Database (default)
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092

#----- DEPRECATED 
#----- MySQL >=5.6 && <8.0
# Support of MySQL is dropped in Data Center Editions and deprecated in all other editions
# Only InnoDB storage engine is supported (not myISAM).
# Only the bundled driver is supported. It can not be changed.
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?user=root&password=123456&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

2.3 sonar-scanner安裝

sonar-scanner是在沒有指定scanner時的默認scanner.
//binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip
下載解壓即可

2.4 sonar-cxx插件安裝

sonar-cxx是開源的靜態檢測C++的插件,
根據 //github.com/SonarOpenCommunity/sonar-cxx/wiki/Compatibility-Matrix版本對應關係,下載//github.com/SonarOpenCommunity/sonar-cxx/releases對應的插件版本到~/sonarqube/extensions/plugins下即可

2.4 啟動

cd ~/sonarqube/bin/linux-x86-64
./sonar.sh 

啟動後登陸 //ip:9000可驗證是否啟動成功,默認密碼是admin/admin
image

2.5 gitlab插件安裝

7.6版本的需要安裝gitlab插件來和gitlab聯動,直接在2.4中的頁面安裝即可:
image

2.6 創建項目

image
image
最終得到:
image
主要是為了獲得這個login的token。

3. Gitlab-CI配置

在我們要進行檢查的項目下,創建.gitlab-ci.yaml:
其他項目替換projectKey,和login的token即可

before_script:
##設置環境變量
  - export PATH=$PATH 

## 定義有哪些stages 
stages:
  - analysis
  - build
  - test
  - deploy
  
sonarcheck:
  except:
    - schedules
  ### 指定只在PR、master和創建tag的時候運行    
  only:
    - merge_requests
    - master
    - tags
  stage: analysis
  script:
   - source ~/.bashrc
   - export PATH=/home/uniubi/software/sonar-scanner-4.6.0.2311-linux/bin:$PATH ### sonar-scanner的路徑
   - sonar-scanner -Dsonar.projectKey=demo -Dsonar.sources=. -Dsonar.host.url=//XXX:9000 -Dsonar.login=b7db4dc570ab507c272557c2d0cec6487dbcc8a9 -Dsonar.gitlab.commit_sha=$CI_BUILD_REF -Dsonar.gitlab.ref_name=$CI_BUILD_REF_NAME -Dsonar.gitlab.project_id=$CI_PROJECT_PATH -Dsonar.language=c++ -Dsonar.sourceEncoding=UTF-8 -Dsonar.gitlab.max_blocker_issues_gate=-1 -Dsonar.gitlab.max_critical_issues_gate=-1 -Dsonar.gitlab.query_max_retry=50 -Dsonar.gitlab.query_wait=1000
  ###允許失敗,可根據自己項目需要設置 
  allow_failure: true
  ###對應gitlab-runner的tags
  tags:
    - cppcheck

在發起PR後,我們就可以看到:
image
點擊stage可以看到sonarqube的打印:
image
登陸sonarqube的web界面,可以看到詳細的報告:
image

4. 進階配置

4.1 規則配置

完整的規則很多,不一定每一條都適用於我們的項目,我們可以禁用和啟用一些規則來形成適合自己的規則:
image

4.2 閾值設置

閾值是用來判定靜態檢查是否失敗的設置,比如重複度。
image

4.3 設置自動將掃描結果以評論形式寫到gitlab

一個比較有用的功能是,掃描完成後,以評論形式發送到gitlab的Merge request, 有助於幫助進行Code review。
首先我們可以創建一個專門用於發送這類消息的gitlab賬號,這樣以免和我們自己發的評論弄混。當然這個賬號需要有這個項目的評論權限。
在創建好賬號後,通過該賬號創建Access Token:
image
注意保存好這個token
登陸sonarqube頁面,設置gitlab:
image
經過這樣得設置,我們再觸發這個靜態檢查,就能看到結果以評論的形式展現了,發起者就是我們上面建立的賬號:
image
image

結語

通過sonarqube和gitlab聯動,可以自動的幫我們完成一些靜態檢查,規避常見的漏洞,也能減少代碼重複率。

Tags: