SonarQube&Gitlab-CI 实现静态代码分析

part 1:基础配置
一.背景介绍


image.png

SonarQube® is an automatic code review tool to detect bugs, vulnerabilities and code smells in your code.
Sonar 为代码的质量管理提供了一个平台,对传统的代码静态检测如 PMD、FindBugs 等工具进行整合,可以说是目前最强大的代码质量管理工具之一。SonarQube支持25+语言,可以跟CI/CD集成。
二.SonarQube平台搭建
1.使用docker拉取镜像
docker pull postgres //拉取数据库
docker pull sonarqube //拉取sonarqube
2.启动服务
docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d postgres //启动数据库
docker run -d --name sonarqube
-p 9000:9000
-e sonar.jdbc.username=sonar
-e sonar.jdbc.password=sonar
-e sonar.jdbc.url=jdbc:postgresql://localhost/sonar
sonarqube //启动sonarqube
如果需要特殊的配置可以选择绑定挂载卷,命令如下
docker run -d --name sonarqube
-p 9000:9000
-v /path/to/conf:/opt/sonarqube/conf
-v /path/to/data:/opt/sonarqube/data
-v /path/to/logs:/opt/sonarqube/logs
-v /path/to/extensions:/opt/sonarqube/extensions
sonarqube
3.访问sonarqube
本地搭建的访问: https://localhost:9000 账号:admin,密码:admin

image.png

三.GitLab-CI&GitLab-Runner
image.png

在我们的项目中使用GitLab进行源码控制,GitLab-CI就是一套配合GitLab使用的持续集成系统。GitLab-Runner是配合GitLab-CI进行使用的。在gitlab中每个project都会配置ci的脚本。也就是当有develop pull了代码到repo,gitlab会通知gitlab-ci,gitlab-ci又会通知到相对应的Runner,这时候Runner会去执行相对应的script。
gitlab runner 可以配置多个,在不同的机器上也可以在同一个机器配置多个runner.
SonarQube&Gitlab-CI 实现静态代码分析_第1张图片
image.png

gitlab-runner安装:https://docs.gitlab.com/runner/install/linux-repository.html

四.Gradle项目配置
build.gradle配置
plugins {
id "org.sonarqube" version "2.7"
}
subprojects {
apply plugin: "org.sonarqube"
sonarqube {
properties {
property "java-module.sonar.sources", "."
property "sonar.java.binaries", "/bin"
property "sonar.sourceEncoding", "UTF-8"
property "java-module.sonar.tests", "."
}
}
}
sonarqube {
properties {
property "sonar.host.url", "https://****"
property "sonar.verbose", "true"
property "sonar.login", ""
property "sonar.sourceEncoding", "UTF-8"
property "sonar.modules", "java-module"
property "sonar.projectKey", "int
"
property "sonar.projectName", "Int
*"
}
}
本地执行命令: gradle sonar
与CI集成,.gitlab-ci.yml配置
sonarqube:
stage: sonarqube
tags:
- shell
only:
- develop
- /^release.
{CI_COMMIT_REF_NAME} -x test
五.结果展示

SonarQube&Gitlab-CI 实现静态代码分析_第2张图片
image.png

part 2:ci配置优化
当项目刚引入sonar往往会有很多的issues,而developer有不会一次性的消化掉这些issues。对于ci我们不希望有新的issues,此时希望有新的issues的时候pipeline会失败。这时候我们可以通过api取回scan的结果。
sonar_ci.sh script

! /usr/bin/env bash

set -e

mr_scan() {
./gradlew sonarqube -Dsonar.host.url=SONAR_LOGIN -Dsonar.branch.name=merge-( curl -X GET "CI_COMMIT_SHA" | awk -F '"' '{print status"
if [ "$status" == "ERROR" ]; then
exit 1
fi
}

dev_scan() {
./gradlew sonarqube -Dsonar.host.url=SONAR_LOGIN -Dsonar.branch.name=( curl -X GET "CI_COMMIT_REF_NAME" | awk -F '"' '{print status"
if [ "$status" == "ERROR" ]; then
exit 1
fi
}

if [ "1" == "dev_scan" ]; then
dev_scan
else
echo -e "Usage: \n mr_scan \n dev_scan"
fi

.gitlab-ci.yml script

sonarqube-mr:
stage: sonarqube-mr
tags:
- shell
only:
- merge_requests
script:
- ./ci/sonar_ci.sh mr_scan

参考:
https://hub.docker.com/_/sonarqube/
https://docs.gitlab.com/ee/ci/yaml/README.html
https://plugins.gradle.org/plugin/org.sonarqube

你可能感兴趣的:(SonarQube&Gitlab-CI 实现静态代码分析)