要解決的問題
jenkins自動構建完成后,希望能通過sonar靜態代碼檢查生成一份報告,給與開發人員對當前代碼的做一個質量評估和修改意見
1.安裝並配置sonar服務器
懶得說,跟着官方文檔走就行,這邊主要的開發語言是.net core 和 typescript,所以在sonar server中的應用市場搜索對應語言安裝就完事
安裝參考地址:https://docs.sonarqube.org/display/SONAR/Setup+and+Upgrade
2.jenkins機器下載sonar掃描器
.net core 掃描器:https://docs.sonarqube.org/display/SCAN/Scanning+on+Linux+or+macOS+with+Scanner+4.0.x
typescript 掃描器:https://docs.sonarqube.org/display/PLUG/SonarTS
路徑地址替換自己的
.net core :/opt/sonar-scanner-netcore/sonar-scanner-3.1.0.1141/conf
默認掃描器:/opt/sonar-scanner/conf
該路徑下有配置文件:sonar-scanner.properties
修改該配置文件中的sonar.host.url=http://192.168.1.133:9000 為自己的sonar server服務器地址。
3.創建jenkins構建任務
選擇創建流水線任務,也就是pipeline。因為我們有一個自動化流程管理工具,所以job的觸發構建動作是在自動化工具中實現的。這里只是怎么調用sonar-scanner。
自動化流程工具傳遞參數(需要掃描的站點名稱,類型),進入jenkins的sonar掃描任務,
腳本做這么幾個事情:
1.根據傳入的站點名稱,獲取當前站點名稱在jenkins的配置,然后從配置文件中獲取源代碼地址,
2.拉取源代碼
3.sonar-scanner。
jenkins 內部對象api文檔地址:http://javadoc.jenkins-ci.org/allclasses-noframe.html
jenkins pipeline參考地址:https://jenkins.io/doc/book/pipeline/syntax/
pipeline script腳本如下:
//@NonCPS 標記當前方法的返回值不需要序列話,因為 def job,這里的job對象不能被序列化。
@NonCPS
def getUrl(){
def job=jenkins.model.Jenkins.getInstanceOrNull().getItem("${site_name}");
if(job==null){
throw new hudson.AbortException("not found jenkins job ${site_name}")
}
def jobScmUrl=job.getScm().getUserRemoteConfigs().get(0).getUrl();
//獲得站點的git源代碼地址
return jobScmUrl;
}
node {
//typescript掃描器需要運行tsc命令,但是我們的項目是全局安裝的typescript,所以這里要指定NODE_PATH
environment {
NODE_PATH = '/usr/local/node/lib/node_modules';
}
stage('checkout') {
deleteDir();//刪除當前構建的workspace
def scmUrl=getUrl();
// git 拉取代碼到workspace,指定分支為master,並指定git使用的SSH證書id(3e6da11b-9f1d-42e2-8cb0-e8616ec0709e)
def scmOut=checkout([
$class: 'GitSCM',
branches: [[name: 'master']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: '3e6da11b-9f1d-42e2-8cb0-e8616ec0709e',
url: scmUrl]]]);
}
if("${language}" == "netcore"){
//如果是.net core 類型的站點
stage('sonar-begin') {
sh script: "dotnet /opt/sonar-scanner-netcore/SonarScanner.MSBuild.dll begin /k:\"${site_name}\" /d:sonar.exclusions=/**/*.js"
}
stage('sonar-build') {
sh script: 'dotnet build';
}
stage('sonar-end') {
sh script: 'dotnet /opt/sonar-scanner-netcore/SonarScanner.MSBuild.dll end';
}
} else if("${language}" == "nodejs"){
stage('sonar-scanner') {
sh script: 'echo "------------$NODE_PATH"'
sh script: "sh /opt/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=${site_name} -Dsonar.sources=."
}
}
else{
echo 'not support language ${language}';
throw new hudson.AbortException("not support language ${language}")
}
}
4.成果展示