首頁 > 軟體

在Jenkins中使用sonar進行靜態程式碼檢查

2020-06-16 16:51:30

要解決的問題

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.成果展示


設定Sonar、Jenkins進行持續審查 https://www.linuxidc.com/Linux/2016-08/133877.htm
sonarQube程式碼品質管理工具環境籌建筆記 https://www.linuxidc.com/Linux/2016-08/133878.htm
SonarQube程式碼品質管理平台安裝與使用  https://www.linuxidc.com/Linux/2016-08/133879.htm
SonarQube升級過程記錄  https://www.linuxidc.com/Linux/2016-08/133880.htm
Ubuntu 16.04下安裝設定SonarQube+MySQL  https://www.linuxidc.com/Linux/2017-05/143860.htm
Fedora 21上搭建Jenkins+SonarQube的Maven專案自動化測試平台  https://www.linuxidc.com/Linux/2017-02/140780.htm
使用 Sonar 進行程式碼品質管理  https://www.linuxidc.com/Linux/2016-08/133876.htm
Red Hat Enterprise Linux 6.5 安裝 Sonar  https://www.linuxidc.com/Linux/2017-12/149927.htm

Sonar 的詳細介紹請點這裡
Sonar 的下載地址請點這裡

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-05/152541.htm


IT145.com E-mail:sddin#qq.com