跳到主要内容

SonarQube快速搭建

快速搭建

docker pull sonarqube:community
docker run --name sonarqube -p 9000:9000 -d sonarqube:community

访问 http://127.0.0.1:9000

默认账号密码都是admin,第一次登陆后会要求强制要求修改12位长度的密码。

备注
# 查看当前sonarqube的版本
curl -X GET "http://localhost:9000/api/system/status" | jq .version

中文语言包

image-20250622下午71707568

备注

如果网络有问题,也可以手动下载安装

github地址:https://github.com/xuhuisheng/sonar-l10n-zh

下载后放到 ${sonarqube_path}/extensions/plugins/ 目录下即可,如 /opt/sonarqube/extensions/plugins/sonar-l10n-zh-plugin-25.6.jar

测试使用

新建项目,按照他的要求执行特定命令就可以了👌

Snipaste_2025-06-22_19-39-09

结合gitleaks的扫描结果

信息

部分情况下,sonarqube的敏感信息探测能力不足,可以引入gitleaks进行完善。

gitleaks规则地址:https://github.com/gitleaks/gitleaks/blob/master/config/gitleaks.toml

有需要补充的如银行卡号、身份证号、手机号,又懒得写正则的,可以直接让AI补充规则

gitleaks探测命令:

./gitleaks --config gitleaks.toml dir ./ --report-path "report.json"

report.json 转换为符合sonarqube格式的 sonarqube-report.json 文件的py脚本

import json
import os

def convert_to_sonarqube_format(input_file, output_file):
# 读取原始report.json文件
with open(input_file, 'r', encoding='utf-8') as f:
report_data = json.load(f)

# 创建SonarQube格式的数据结构
sonarqube_data = {
"issues": []
}

# 遍历原始报告中的每个问题
for issue in report_data:
# 将RuleID中的连字符转换为下划线,以符合SonarQube规范
rule_id = issue["RuleID"].replace("-", "_")

# 创建SonarQube格式的问题
sonarqube_issue = {
"engineId": "GitLeaks", # 分析器ID
"ruleId": rule_id, # 规则ID
"severity": "CRITICAL", # 严重程度
"type": "VULNERABILITY", # 问题类型
"primaryLocation": {
"message": issue["Description"], # 问题描述
"filePath": issue["File"], # 文件路径
"textRange": {
"startLine": issue["StartLine"], # 起始行
"endLine": issue["EndLine"] # 结束行
}
},
"effortMinutes": 30 # 修复所需时间(分钟)
}

# 添加到SonarQube数据中
sonarqube_data["issues"].append(sonarqube_issue)

# 写入SonarQube格式的输出文件
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(sonarqube_data, f, indent=2)

print(f"转换完成!已将 {len(report_data)} 个问题转换为SonarQube格式并保存到 {output_file}")

def main():
# 设置输入和输出文件路径
script_dir = os.path.dirname(os.path.abspath(__file__))
input_file = os.path.join(script_dir, "report.json")
output_file = os.path.join(script_dir, "sonarqube-report.json")

# 执行转换
convert_to_sonarqube_format(input_file, output_file)

if __name__ == "__main__":
main()

sonarqube-report.json 导入到sonarqube中

sonar-scanner \
-Dsonar.projectKey=Test \ # 换成自己的
-Dsonar.sources=. \
-Dsonar.host.url=http://127.0.0.1:9000 \
-Dsonar.login=sqp_a29fad6e5bc7f0c4f592b96397fb5a74eccdf509 \ # 换成自己的
-Dsonar.externalIssuesReportPaths=sonarqube-report.json