其他博文連接
- Ubuntu Server 16.04LTS 搭建GitLab服務器
- ubuntu server 16.04 使用docker搭建jenkins和sonarqube
- Gitlab配置Gitlab-Runner實現簡單的CI/CD
- Gitlab CI集成sonarqube實現靜態代碼檢查
- gitlab CI中單元測試與集成測試的研究與實踐
- GitLab持續集成持續部署(CI&CD)
文章目錄
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:鏈接