Gitlab CI集成sonarqube實現靜態代碼檢查

其他博文連接

Gitlab CI集成sonarqube實現靜態代碼檢查

配置說明

Gitlab

  • 系統:Ubuntu 16.04 Server
  • 內存:4G
  • IP:192.168.23.100
  • Dokcer Version : 18.09.0

Gitlab Runner

  • 系統:Ubuntu 16.04 Server
  • 內存:4G
  • IP:192.168.23.102
  • Dokcer Version : 18.09.0

Sonarqube

  • 系統:Ubuntu 16.04 Server
  • 內存:4G
  • IP:192.168.23.101
  • Dokcer Version : 18.09.0

Sonarqube搭建

創建一個簡單的SpringBoot應用

SpringBoot應用的創建過程不描述了,可以直接看代碼。

配置sonarqube

  • 引入gradle依賴
    這裏加入一個新的.gradle文件sonarqube.gradle作爲sonarqube的相關配置,如下圖所示
// file coding UTF-8

// 拆分 sonarqube,目前來看 sonarqube必須用jdk8,而我們的項目卻使用的jdk7,甚至jdk6

// 使用方法:
//  gradle test
//  gradle -b sonarqube.gradle sonarqube

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // 需要jdk1.8以上,配置gradle的運行環境爲1.8即可,與項目編譯等級無關
        // 1.1 及以下版本,要求jdk6+、gradle2, 同時也受服務器版本限制, sonar7要求jdk8+
        // 1.2 及以上版本,要求jdk8+、gradle4+, 同時也受服務器版本限制
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.5"

    }

    configurations.all {

        // 如果沒有 'buildscript' 聲明,應將 'configurations.all' 至於頂層

        // for ideaUI 新版本支持手動刷新依賴包,在gradle標籤頁右鍵菜單中,點擊'refresh dependencies'
        // for other  手動刷新依賴包,執行 "gradle build --refresh-dependencies"

        // for SNAPSHOT(changing), SNAPSHOT versions are treated as "changing" by default (if Maven repo is used)
        resolutionStrategy.cacheChangingModulesFor(0, 'seconds')
        // for +(加號,dynamic)
        resolutionStrategy.cacheDynamicVersionsFor(0, 'seconds')
    }
}

apply plugin: "org.sonarqube"

sonarqube {
    properties {
        property "sonar.host.url", "http://192.168.23.101:9000"
        property "sonar.scm.provider", "git"
        property "sonar.projectName", Helper.readParam("artifactId")
        property "sonar.projectKey", Helper.readParam("artifactId")
        property "sonar.projectVersion", Helper.readParam("mainVersion")
        property "sonar.language", "java"
        property "sonar.sourceEncoding", Helper.readSourceFileEncoding()
        property "sonar.sources", "src/main/java"
        property "sonar.tests", "src/test/java"
        property "sonar.java.source", Helper.readParam("sourceCompatibility")
        property "sonar.java.binaries", "build/classes/java/main/"
        property "sonar.java.test.binaries", "build/classes/java/test/"
        property "sonar.login","admin"
        property "sonar.password","admin"

        property "sonar.java.coveragePlugin", "jacoco"
        property "sonar.jacoco.reportPaths", "$buildDir/jacoco/test.exec"
    }

}


class Helper {

    def static readSourceFileEncoding() {
        def fileEncoding = readParam("encoding")
        if (fileEncoding == null) {
            fileEncoding = "UTF-8"
        }
        return fileEncoding
    }

    def static readParam(String paramKey) {
        new File("build.gradle").withReader("UTF-8", ({ reader ->
            while (reader.ready()) {
                def line = reader.readLine()
                if (line.contains("${paramKey} =")) {

                    def paramValue = line.substring(line.indexOf("${paramKey} =") + "${paramKey} =".length() + 1, line.length())
                    paramValue = paramValue.trim()

                    if (paramValue.startsWith("\"")
                            || paramValue.startsWith("'")) {
                        paramValue = paramValue.substring(1, paramValue.length())

                    }
                    if (paramValue.endsWith("\"")
                            || paramValue.endsWith("'")) {
                        paramValue = paramValue.substring(0, paramValue.length() - 1)
                    }
                    return paramValue
                }
            }
            return null
        } as Closure<String>))

    }
}
  • build.gradle修改如下
plugins {
    id 'org.springframework.boot' version '2.1.5.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'
//jacoco是單元測試檢查工具
apply plugin: "jacoco"
group 'org.virtuex'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    //log4j2jar包
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
  • .gitlab-ci.yml腳本修改如下
image: virtuex/base_java_env:gradle-4.10.2-openjdk-7-openjdk-8-docker-18

stages:
  - build
  - test

before_script:
  - echo "Reset JDK..."
  - export JAVA_HOME=$JAVA8_HOME
  - export PATH=${JAVA_HOME}/bin:$PATH

build_job:
  stage: build
  script:
    - echo "Release build..."
    - gradle build

test_job:
  stage: test
  script:
    - echo "Tests run..."
    - gradle test
    - gradle jacocoTestReport
    - gradle -b sonarqube.gradle sonarqube -Dsonar.analysis.mode="${MODE}" -Dsonar.gitlab.project_id=$CI_PROJECT_PATH -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME

因爲我提供的默認鏡像中的Jdk默認是1.7的,這裏的sonar要求1.8,所以在before_script中修改下jdk的版本

運行結果

以上代碼修改完成後,提交代碼到gitlab,等待一段時間後(建議使用maven私服,否則依賴下載會很慢)即可看到構建成功,結果如下圖所示:
在這裏插入圖片描述
在sonarqube的Project中可以看到剛纔提交的項目:
在這裏插入圖片描述

靜態代碼檢查

在sonarqube的管理頁面,點擊對應的項目,即可查看到詳情。點擊進入詳情後,能看到sonar掃描到的代碼缺陷以及修改建議
在這裏插入圖片描述

這裏只有一些簡單的示例,如果需要其他高級功能可以自行參考官方文檔或者給我留言

示例代碼

請前往github:鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章