Jenkins集成SonarQube:https://blog.csdn.net/qq_39680564/article/details/108533596
一、思路
上篇文档解决了 Jenkins
集成 SonarQube
平台的问题,使用了两天发现 Jenkins
每次扫描完,都需要开发手动点击 Sonar
链接,跳转到 Sonar
平台上,才能知道扫描出了多少代码的问题,如下图:
项目构建完如果没有报错的话,开发很少会去 Sonar
平台上看问题, 所以想出了钉钉机器人自定义通知这么一个方法,可以在 Jenkins
扫描后,直接将结果通过钉钉机器人的 Webhook
发到钉钉群里面,自动化通知扫描结果,然后可以通过点击群通知链接,跳转到 Sonar
平台。实现效果如下图:
二、实现步骤
2.1 钉钉机器人设置
关键词加上 BUG
、漏洞
。然后复制出 Webhook
的 token
值。
2.2 Shell脚本
# 调用查询异常状态接口函数,该接口是在SonarQube平台直接爬的
function issues() {
curl -sH "Content-Length:0" -X GET "http://192.168.1.22:29000/api/issues/search?resolved=false&facets=severities%2Ctypes&componentKeys=$1"
}
# 类型
for i in {0..2}
do
a=`issues $1 | jq '.facets[1].values['${i}'].val'`
if [ ${a} = '"BUG"' ]
then
BUG=$(echo "BUG:`issues $1 | jq '.facets[1].values['${i}'].count'`个")
N_BUG=`issues $1 | jq '.facets[1].values['${i}'].count'`
fi
if [ ${a} = '"VULNERABILITY"' ]
then
VULNERABILITY=$(echo "漏洞:`issues $1 | jq '.facets[1].values['${i}'].count'`个")
N_VULNERABILITY=`issues $1 | jq '.facets[1].values['${i}'].count'`
fi
if [ ${a} = '"CODE_SMELL"' ]
then
CODE_SMELL=$(echo "异味:`issues $1 | jq '.facets[1].values['${i}'].count'`个")
fi
done
# 严重程度
for i in {0..4}
do
b=`issues $1 | jq '.facets[0].values['${i}'].val'`
if [ ${b} = '"MINOR"' ]
then
MINOR=$(echo "次要:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
fi
if [ ${b} = '"MAJOR"' ]
then
MAJOR=$(echo "主要:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
fi
if [ ${b} = '"CRITICAL"' ]
then
CRITICAL=$(echo "严重:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
fi
if [ ${b} = '"INFO"' ]
then
INFO=$(echo "提示:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
fi
if [ ${b} = '"BLOCKER"' ]
then
BLOCKER=$(echo "阻断:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
fi
done
#echo ${BUG},${VULNERABILITY},${CODE_SMELL} "{" ${BLOCKER},${CRITICAL},${MAJOR},${MINOR},${INFO} "}"
# 钉钉机器人提醒
function alarmdingding(){
apiurl="https://oapi.dingtalk.com/robot/send?access_token=b03xxxxxxxxxxxxxf8a3f"
/bin/curl ${apiurl} \
-X POST -H "Content-Type: application/json" \
-d '{"msgtype": "link","link": {"text": "'$1'项目检测结果:'${BUG}','${VULNERABILITY}','${CODE_SMELL}' { '${BLOCKER}','${CRITICAL}','${MAJOR}','${MINOR}','${INFO}' }","title": "代码扫描报告 ","picUrl": "https://app.asiayd.com/pic/sonar.jpg","messageUrl": "http://192.168.1.22:29000/dashboard?id='$1'"}}'
}
#echo ${N_BUG} ${N_VULNERABILITY}
# 判断BUG数与漏洞数是否都为0,如果都为0就没必要发钉钉通知了。
if [[ ${N_BUG} -ne "0" ]] || [[ ${N_VULNERABILITY} -ne "0" ]]
then
alarmdingding $1
fi
2.3 Jenkins配置
Jenkins
在构建后添加一个脚本执行命令即可