Gitlab整合Sonarqube自動檢測程式碼併發送報告給提交者
使用gitlab-ci、sonarqube、sonar-scanner 實現如下功能
1.一旦提交程式碼就進行程式碼質量檢測
2. 傳送檢測報告郵件給提交者
先來看下最終結果,郵件中有檢測報告,具體bug等詳細情況可點選郵件中的 url 跳轉到檢測結果進行檢視
sonarqube中的概況
Sonarqube中程式碼bug等具體資訊
Gitlab-ci 結果
如果這也是你想實現的功能的話,那麼請往下看,否則就不需要浪費時間了
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
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=.
配置環境變數
新增檔案 /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檔案
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
引數說明:
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
程式碼如下
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;">
本次掃描程式碼行數: <span style="color:blue">{lines} </span>,
bugs: <span style="color:red">{bugs}</span>,
Vulnerabilities: <span style="color:red">{vulnerabilities}</span>,
Code Smells: <span style="color:red">{code_smells}</span>
</li>
<li style="font-weight:bold;margin-top: 10px;">
URL地址:
<a style="font-weight:bold;"
href={project_url}>{project_url}
</a>
</li>
</ul>
<h4>二、資訊詳情</h4>
<ul>
<li style="font-weight:bold;">
綜合等級: {sqale_rating}
</li>
<li style="font-weight:bold;">
各語言掃描行數: {ncloc_language_distribution}
</li>
<li style="font-weight:bold;">
程式碼重複率: {duplicated_lines_density}
</li>
<li style="font-weight:bold;">
安全等級: {security_rating}
</li>
<li style="font-weight:bold;">
可靠等級: {reliability_rating}
</li>
<li style="font-weight:bold;">
註釋行密度: {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 = "[email protected]"
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()
方法二:查sonarqube資料庫獲取資料
建議用方法一,方法二太挫了
用sonar-scanner掃描程式碼之後,去查sonarqube的資料庫然後在把資料拼湊成郵件進行傳送,
由於7.9已經不支援mysql,我這裡用的postgresql,其他資料庫改下Python所用模組和連線就行,sql語句應該不需要改動就可使用
編輯 sonarqube.py
View Codetable.html , table.html需要和sonarqube.py放在同一個目錄下
View Code方法二郵件如下圖
原文連結:
https://www.cnblogs.com/Sunzz/p/13731675.html