写点什么

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

用户头像
夏兮。
关注
发布于: 2021 年 02 月 16 日

part 1:基础配置

一.背景介绍



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



三.GitLab-CI&GitLab-Runner


在我们的项目中使用 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.


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.*$/      script:    - ./gradlew sonarqube -Dsonar.branch.name=${CI_COMMIT_REF_NAME} -x test 
复制代码


五.结果展示



part 2:CI 配置优化

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

sonar_ci.sh script


#! /usr/bin/env bashset -e
mr_scan() { ./gradlew sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.login=$SONAR_LOGIN -Dsonar.branch.name=merge-$CI_COMMIT_SHA -Dsonar.branch.target=develop -x test sleep 5s status=$( curl -X GET "$SONAR_HOST/api/qualitygates/project_status?projectKey=int***&branch=merge-$CI_COMMIT_SHA" | awk -F '"' '{print $6}' ) echo "Project status: $status" if [ "$status" == "ERROR" ]; then exit 1 fi}
dev_scan() { ./gradlew sonarqube -Dsonar.host.url=$SONAR_HOST -Dsonar.login=$SONAR_LOGIN -Dsonar.branch.name=$CI_COMMIT_REF_NAME -Dsonar.branch.target=master -x test sleep 5s status=$( curl -X GET "$SONAR_HOST/api/qualitygates/project_status?projectKey=int***&branch=$CI_COMMIT_REF_NAME" | awk -F '"' '{print $6}' ) echo "Project status: $status" if [ "$status" == "ERROR" ]; then exit 1 fi}
if [ "$1" == "mr_scan" ]; then mr_scanelif [ "$1" == "dev_scan" ]; then dev_scanelse 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


发布于: 2021 年 02 月 16 日阅读数: 19
用户头像

夏兮。

关注

星辰大海... 2018.03.21 加入

测试开发工程师 热爱技术,热爱生活

评论

发布
暂无评论
SonarQube&Gitlab-CI 实现静态代码分析