Gitlab集成Sonarqube自动检测代码并发送报告给提交者

Gitlab集成Sonarqube自动检测代码并发送报告给提交者

 

使用gitlab-ci、sonarqube、sonar-scanner 实现如下功能

1.一旦提交代码就进行代码质量检测

2. 发送检测报告邮件给提交者

先来看下最终结果,邮件中有检测报告,具体bug等详细情况可点击邮件中的 url 跳转到检测结果进行查看

Gitlab集成Sonarqube自动检测代码并发送报告给提交者

 sonarqube中的概况

 Gitlab集成Sonarqube自动检测代码并发送报告给提交者

 Sonarqube中代码bug等具体信息

Gitlab集成Sonarqube自动检测代码并发送报告给提交者

 Gitlab-ci 结果

Gitlab集成Sonarqube自动检测代码并发送报告给提交者

如果这也是你想实现的功能的话,那么请往下看,否则就不需要浪费时间了

Jenkins结合sonarqube可参考 https://www.cnblogs.com/Sunzz/p/10075791.html

环境说明

Gitlab 服务器:

centso: 7.4            gitlab: 12.2.3

jdk: 11.0.3             Scanner:  4.0.0.1744    

python: 3.6.8

Sonarqube 服务器:

centso: 7.4     docker: 19.03.13

jdk: 11.0.3      sonarqube: 7.9.4

postgres:13

 转载请在文章开头附上原文链接地址https://www.cnblogs.com/Sunzz/p/13731675.html 

 gitlab、gitlab-runner、jdk 安装与配置请自行解决

sonarqube 安装与配置

首先安装PostgreSQL

因为不支持mysql了,oracle和SqlServer又不想用。

docker pull postgres

 启动并设置用户名和密码 均为 sonarqube 

docker run --name=postgresql -p 5432:5432 -e POSTGRES_DB=sonarqube \
 -e POSTGRES_USER=sonarqube -e POSTGRES_PASSWORD=sonarqube -d postgres

相关系统参数设置

(1)编辑 /etc/security/limits.conf,新增如下两项。sonarqube为用户名,待会会新增这个用户

sonarqube soft nofile 65536
sonarqube hard nofile 65536

(2) 设置 max_map_count

sysctl -w vm.max_map_count=262144
sysctl -p

下载并配置sonarqube

新建sonarqube用户

useradd sonarqube

切换至sonarqube

su - sonarqube

sonarqube官网下载:

wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.4.zip -d /opt/

 sonarqube配置:

sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonarqube
sonar.web.port=9000

 注意: 如果不是yum安装jdk的话,还需要改 wrapper.conf 中的 wrapper.java.command配置

下载插件,达到所有分支均可扫描

wget https://github.com/mc1arke/sonarqube-community-branch-plugin/releases/download/1.3.2/sonarqube-community-branch-plugin-1.3.2.jar
cp sonarqube-community-branch-plugin-1.3.2.jar /opt/sonarqube-7.9.4/extensions/plugins/
cp sonarqube-community-branch-plugin-1.3.2.jar /opt/sonarqube-7.9.4/lib/common/

启动sonarqube,不能以root用户启动,我这里使用的是sonarqube用户

/opt/sonarqube-7.9.4/bin/linux-x86-64/sonar.sh start

sonar-scanner 安装与配置

官网下载:

wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip

解压并配置

unzip sonar-scanner-cli-4.0.0.1744-linux.zip -d  /opt/

编辑 /opt/sonar-scanner-4.0.0.1744-linux/conf/sonar-scanner.properties

Gitlab集成Sonarqube自动检测代码并发送报告给提交者
sonar.host.url=https://your-sonarqube.com  # sonarqube 的url
sonar.login=admin     # sonarqube 的用户名和密码
sonar.password=admin
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=.
sonar.java.binaries=.
Gitlab集成Sonarqube自动检测代码并发送报告给提交者

配置环境变量

新增文件 /etc/profile.d/sonar-scanner.sh,内容如下

export PATH=$PATH:/opt/sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner
source  /etc/profile.d/sonar-scanner.sh

检查是否安装成功

sonar-scanner -v
INFO: Scanner configuration file: /opt/sonar-scanner/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarQube Scanner 4.0.0.1744
INFO: Java 11.0.3 AdoptOpenJDK (64-bit)
INFO: Linux 3.10.0-693.el7.x86_64 amd64

gitlab-ci 配置 

目的就是一旦用户提交代码,触发代码扫描并发送邮件给代码提交者。

 在项目中新增  .gitlab-ci.yml 文件

Gitlab集成Sonarqube自动检测代码并发送报告给提交者
stages:
  - sonarqube_scan
  - sendmail

sonarqube_scan_job:
  stage: sonarqube_scan
  script:
    - sonar-scanner -Dsonar.projectName=$CI_PROJECT_NAME -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.branch.name=${CI_COMMIT_REF_NAME} -Dsonar.language=java -Dsonar.host.url=https://your-sonarqube.com  -Dsonar.login=admin -Dsonar.password=admin
  tags:
    - sonar-scanner
  when: always

sendmail_job:
  stage: sendmail
  script:
    - echo $GITLAB_USER_EMAIL
    - echo $CI_PROJECT_NAME
    - echo $CI_COMMIT_REF_NAME
    - python3 /opt/sonarqube_api.py $CI_PROJECT_NAME $CI_COMMIT_REF_NAME $GITLAB_USER_EMAIL
    
  tags:
    - sonar-scanner
Gitlab集成Sonarqube自动检测代码并发送报告给提交者

参数说明:

tag: gitlab-runner中的tag,  我配置的tag是sonar-scanner

$CI_PROJECT_NAME: gitlab内置参数,为项目名称

$GITLAB_USER_EMAIL: gitlab内置参数,提交者的邮箱,传递给Python,为了后边发邮件用

$CI_COMMIT_REF_NAME: gitlab内置参数,本次提交的分支

-Dsonar.projectName=$CI_PROJECT_NAME  为在sonarqube中项目的名称

-Dsonar.projectKey=$CI_PROJECT_NAME    为在sonarqube中项目的唯一标识

-Dsonar.host.url=https://your-sonarqube.com  sonarqube的url

-Dsonar.login=admin -Dsonar.password=admin  sonarqube的用户名和密码配置

发送邮件配置

方法一: 调用Sonarqube Api

代码如下

Gitlab集成Sonarqube自动检测代码并发送报告给提交者
import sys
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from sonarqube import SonarQubeClient


def sendmail(subject, msg, toaddrs, fromaddr, smtpserver, password):
    mail_msg = MIMEMultipart()
    mail_msg['Subject'] = subject
    mail_msg['From'] = fromaddr
    mail_msg['To'] = ','.join(toaddrs)
    mail_msg.attach(MIMEText(msg, 'html', 'utf-8'))
    try:
        s = smtplib.SMTP_SSL(smtpserver)
        s.connect(smtpserver, 465)  # 连接smtp服务器
        s.login(fromaddr, password)  # 登录邮箱
        s.sendmail(fromaddr, toaddrs, mail_msg.as_string())  # 发送邮件
        s.quit()
        print("send successful!")
    except Exception as e:
        print(e)
        print("Failed to send ")


def getSonarqubeInfo(branch="master", component=None, url=None, username=None, password=None):
    sonar = SonarQubeClient(sonarqube_url=url)
    sonar.auth.authenticate_user(login=username, username=username, password=password)
    component_data = sonar.measures.get_component_with_specified_measures(
        component=component,
        branch=branch,
        fields="metrics,periods",
        metricKeys="""
        code_smells,bugs,coverage,duplicated_lines_density,ncloc,
        security_rating,reliability_rating,vulnerabilities,comment_lines_density,
        ncloc_language_distribution,alert_status,sqale_rating
        """
    )
    result_dict = {}
    for info_dict in component_data["component"]["measures"]:
        result_dict[info_dict["metric"]] = info_dict["value"]
    # print(result_dict)
    return result_dict


def main():
    url = "https://your-sonarqube.com"
    username = "admin"
    password = "admin"
    branch = sys.argv[2]
    project = sys.argv[1]
    project_url = "{}/dashboard?id={}&branch={}".format(url, project, branch)
    user_email = sys.argv[3]
    sonarqube_data = getSonarqubeInfo(branch=branch, component=project, url=url, username=username, password=password)
    html_text = """
<!DOCTYPE html>
<html lang="en">
<head>
    <title></title>
    <meta charset="utf-8">
</head>
<body>
<div class="page" style="margin-left: 30px">
    <h3>{user_mail}, 你好</h3>
    <h3> 本次提交代码检查结果如下</h3>
    <h3> 项目名称:{project} </h3>
    <h3> 分支:{branch} </h3>
    <h4>一、总体情况</h4>
    <ul>
        <li style="font-weight:bold;">
            本次扫描代码行数: &nbsp; <span style="color:blue">{lines} </span>,
            bugs: &nbsp;<span style="color:red">{bugs}</span>,
            Vulnerabilities: &nbsp;<span style="color:red">{vulnerabilities}</span>,
            Code Smells: &nbsp; <span style="color:red">{code_smells}</span>
        </li>
        <li style="font-weight:bold;margin-top: 10px;">
            URL地址:&nbsp;
            <a style="font-weight:bold;"
               href={project_url}>{project_url}
            </a>
        </li>
    </ul>
    <h4>二、信息详情</h4>
    <ul>
        <li style="font-weight:bold;">
           综合等级: &nbsp; {sqale_rating}
        </li>
        <li style="font-weight:bold;">
            各语言扫描行数: &nbsp;{ncloc_language_distribution}
        </li>
        <li style="font-weight:bold;">
            代码重复率: &nbsp;{duplicated_lines_density}
        </li>
        <li style="font-weight:bold;">
            安全等级: &nbsp; {security_rating}
        </li>
        <li style="font-weight:bold;">
            可靠等级: &nbsp; {reliability_rating}
        </li>
        <li style="font-weight:bold;">
            注释行密度: &nbsp;{comment_lines_density}
        </li>
    </ul>
</div>
</body>
</html>
""".format(project_url=project_url,
           user_mail=user_email,
           project=project,
           branch=branch,
           lines=sonarqube_data["ncloc"],
           bugs=sonarqube_data["bugs"],
           vulnerabilities=sonarqube_data["vulnerabilities"],
           code_smells=sonarqube_data["code_smells"],
           ncloc_language_distribution=sonarqube_data["ncloc_language_distribution"],
           duplicated_lines_density=sonarqube_data["duplicated_lines_density"],
           reliability_rating=sonarqube_data["reliability_rating"],
           security_rating=sonarqube_data["security_rating"],
           comment_lines_density=sonarqube_data["comment_lines_density"],
           sqale_rating=sonarqube_data["sqale_rating"]
           )
    fromaddr = "gitlab@xxx.com"
    smtpserver = "smtpdm-ap-southeast-1.aliyun.com"
    toaddrs = [user_email, ]
    subject = "Gitlab代码质量检测"
    password = "xxxx"
    msg = html_text
    # print(msg)
    sendmail(subject, msg, toaddrs, fromaddr, smtpserver, password)


if __name__ == '__main__':
    main()
Gitlab集成Sonarqube自动检测代码并发送报告给提交者

方法二:查sonarqube数据库获取数据

建议用方法一,方法二太挫了

用sonar-scanner扫描代码之后,去查sonarqube的数据库然后在把数据拼凑成邮件进行发送,

由于7.9已经不支持mysql,我这里用的postgresql,其他数据库改下Python所用模块和连接就行,sql语句应该不需要改动就可使用

 编辑 sonarqube.py

Gitlab集成Sonarqube自动检测代码并发送报告给提交者 View Code

table.html , table.html需要和sonarqube.py放在同一个目录下

Gitlab集成Sonarqube自动检测代码并发送报告给提交者 View Code

方法二邮件如下图

Gitlab集成Sonarqube自动检测代码并发送报告给提交者 

原文链接:

https://www.cnblogs.com/Sunzz/p/13731675.html

上一篇:SonarQube 多分支功能使用(社区版)


下一篇:javaScript01-引入