sonarqube分析azure專案

在使用地端 SonarQube 分析 Azure 專案時,遇到了一些問題,紀錄一下處理的方式備忘

開放主機連線

地端 SonarQube 需要能夠連線到 Azure DevOps,因此需要請網管設定開放連線

Azure DevOps

建立 Personal Access Token

Azure DevOps 需要建立一個 PAT (Personal Access Token) 並且設定正確的權限
Ref:Azure DevOps integration

權限的部分只需要 Code 區塊的 Read / Write,至於為甚麼需要 Write,嗯,官網說的。有人知道可以告訴我

SonarQube

遠端主機設定 Git 代理

因為遠端主機並不能直接連外網,所以需要透過 proxy,這邊是直接設定 git 的 proxy

1
2
3
4
5
6
7
8
9
#設置代理
git config --global http.proxy http://myproxy:8080
git config --global https.proxy http://myproxy:8080
# 查看代理
git config --global --get http.proxy
git config --global --get https.proxy
# 移除代理
git config --global --unset http.proxy
git config --global --unset https.proxy

在這個部分會先透過 git clone 測試一下,網址採用的是 PAT 的方式,這樣是為了可以在 jenkins 去抓 repo

SonarQube 主機需支援專案的 Framework

就是專案用到 .net8,所以需要裝一下,這個看狀況而定
Ref:Download .NET8

SonarQube 主機下載 JDK 17 給分析工具使用

我試過了 sonarscanner.zip 下載執行,但他根本不掃 C# 的檔案;因此分析專案用的是 SonarScanner for .NET

我在這邊選擇的是 dotnet tool install --global dotnet-sonarscanner 這個方式去使用,而該工具目前最新版本需要 JDK 17
Java SE 17 Archive Downloads下載Windows x64 Compressed Archive後,解壓縮到指定目錄,我是解壓縮到D:\java\jdk-17.0.11

Ref:

  1. Introduction to the SonarScanner for .NET
  2. Installing the SonarScanner for .NET

SonarQube 設置 Azure DevOps 資訊

假設你的 azure 組織叫做 MYORG,網址是 https://dev.azure.com/MYORG,就像這樣填寫即可,而剛剛產生的PAT也在這邊填入

設定完成後,可以看到下方按鈕檢查結果是綠色可用的

Jenkins

新增 credentials

密碼填入 PAT,帳號隨意,ID 取名好記的,例如 my-azure-project

建立 Jenkins 專案

參數都是假的,主要就是 azure repo 的網址, credentialsId 用剛剛新增的
Branch 可以用參數化的方式,這樣就可以在 jenkins 上選擇要分析的分支
sonarqube.bat 是分析專案的 bat 檔,後面會提到

1
2
3
4
5
6
7
8
9
10
11
node('windows-node-sonarqube') {
ws('D:\\MyAzureProject') {
stage('git') {
//deleteDir()
checkout([$class: 'GitSCM', branches: [[name: '$Branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'my-azure-project', url: 'https://dev.azure.com/<MYORG>/<MYPROJECT>/_git/<MyPROJECT>']]])
}
stage('analyze macro') {
bat 'D:\\Tool\\art\\sonarqube.bat'
}
}
}

分析專案

建立 SonarQube 分析專案

選擇 From Azure DevOps

然後就挑你的目標專案,很抱歉這邊我碼的亂七八糟,因為是公司專案,但大概意思就是這樣,選擇完畢後右上角會有個 Set up selected repository,點下去到下一步驟

接著就是問怎麼分析,選擇本地

接下的步驟就跟本地專案差不多,就不再贅述

分析指令

這個是分析的指令,為了方便測試寫成 bat,之後可以改成 jenkins groovy script 就把他拆開即可,主要是為了主機上的切換 java 版本而採用這樣的方式,專案的 key 還有參數都是假的,請自行替換,專案 key 可以在 SonarQube 專案頁面看到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
REM 保存现有 PATH
set "ORIGINAL_PATH=%PATH%"

REM 设置新的 Java 路径
set "JAVA_HOME=D:\java\jdk-17.0.11"
set "PATH=%JAVA_HOME%\bin;%PATH%"

REM 验证新的 java 版本
java -version

REM 初始化 SonarQube 分析
dotnet sonarscanner begin /k:"myproject-key" /d:sonar.host.url="http://sonarqube.my.net" /d:sonar.login="sqp_xxxxxxxx" /d:sonar.exclusions="**/*.xml,**/node_modules/**,.sonarqube/**" /d:sonar.inclusions="**/*.cs"

REM 构建项目
dotnet build

REM 结束 SonarQube 分析
dotnet sonarscanner end /d:sonar.login="sqp_xxxxxxxx"

REM 恢复原始 PATH
set "PATH=%ORIGINAL_PATH%"

REM 验证恢复后的 java 版本
java -version

遠端主機複製 submodule

因為專案有 submodule,又因為不能直接連線,我這邊是直接把本地專案的 submodule 複製到遠端主機,雖然不是正確的方式,但是能用