Gitlab CI集成sonarqube实现静态代码检查

文章目录

  • Gitlab CI集成sonarqube实现静态代码检查
    • 配置说明
      • Gitlab
      • Gitlab Runner
      • Sonarqube
    • Sonarqube搭建
    • 创建一个简单的SpringBoot应用
    • 配置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搭建

  • 请参考ubuntu server 16.04 使用docker搭建jenkins和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))

    }
}
  • 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私服,否则依赖下载会很慢)即可看到构建成功,结果如下图所示:
Gitlab CI集成sonarqube实现静态代码检查_第1张图片
在sonarqube的Project中可以看到刚才提交的项目:
Gitlab CI集成sonarqube实现静态代码检查_第2张图片

静态代码检查

在sonarqube的管理页面,点击对应的项目,即可查看到详情。点击进入详情后,能看到sonar扫描到的代码缺陷以及修改建议
Gitlab CI集成sonarqube实现静态代码检查_第3张图片

这里只有一些简单的示例,如果需要其他高级功能可以自行参考官方文档或者给我留言

示例代码

请前往github:链接

你可能感兴趣的:(CI/CD)