这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
在我们实际中,会遇到这样的需求:
代码提交,触发后端sonar测试,测试完成,jenkins触发依赖任务,
执行python脚本,达到预期,调用上线任务模块,进行上线,达不到预期,钉钉群通知。
那么我们看下这样的需求,需要如何去实现。
我们配置下配置sonar测试任务
下载SonarQube。去官网下载即可。
在sonar.properties 配置mysql数据库的
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
创建数据库 CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
创建用户分配权限:
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%' IDENTIFIED BY 'sonar' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar' WITH GRANT OPTION;
FLUSH PRIVILEGES;
在数据库表执行上面
需要有java环境配置
sonarQube 默认端口在9000
如果java 需要依赖maven 需要配置maven 环境
执行
mvn sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=047cf5b2c769ff9e0a3291521dbb8db2d620c031
我们在jenkins配置
构建环境
Prepare SonarQube Scanner environment
构建:
配置
sonar.projectKey=testmvndemo\
sonar.projectName=testmvndemo\
sonar.projectVersion=1.1\
sonar.sources=.\
sonar.java.binaries=C:\\Program Files (x86)\\Jenkins\\liwanlei\\liwanlei\\src\\main\\java\\com\\example\\sell\\demo
对配置测试任务进行调试,
我们去实现扫描不达标后钉钉通知的代码
import requests,json,jenkins
def sendding(Dingtalk_access_token, content,title):
url = Dingtalk_access_token
pagrem = { "msgtype": "link", "link": {
'title':title, "text": content,
'messageUrl':'http://localhost:9000/dashboard?id=testmvndemo'
}, "isAtAll": True
}
headers = {
'Content-Type': 'application/json'
}
requests.post(url, data=json.dumps(pagrem), headers=headers)
yanzhongbiaozhun=0
def huitui():
huiguntongzhi='回退机器人url'
url = 'http://localhost:9000/api/issues/search?componentKeys
=testmvndemo&s=FILE_LINE&resolved=false&types=BUG&ps=
100&facets=severities%2Ctypes&additionalFields=_all'
resopnse = requests.get(url).text
result = json.loads(resopnse)
zhuyao=0
yanzhong=0
code_reslut=[]
for item in result['issues']:
if item['severity']=='MAJOR':
zhuyao+=1
code_reslut.append({'文件':item['component'],
"异常信息":item['message']})
elif item['severity']=='CRITICAL':
yanzhong+=1
code_reslut.append({'文件': item['component'],
"异常信息": item['message']})
else: passif yanzhong>=yanzhongbiaozhun:
sendresuly={'严重bug':yanzhong,'主要bug':zhuyao,
"结果概览":code_reslut}
sendding(huiguntongzhi,content=sendresuly,title="回滚通知")
else:
conde=jenkins.Jenkins(url="http://localhost:8080",
username='liwanlei',password="liwanlei")
conde.build_job("后端上线")
def xinxitongji():
dingdingurl='钉钉url'
url='http://localhost:9000/api/measures/search?projectKeys=
testmvndemo&metricKeys=alert_status%2Cbugs%2Creliability_rating%2
Cvulnerabilities%2Csecurity_rating%2Ccode_smells%2Csqale_rating%
2Cduplicated_lines_density%2Ccoverage%2Cncloc%2Cncloc_language_distribution'
resopnse = requests.get(url).text
result = json.loads(resopnse)
bug=0
code=0
fugai=0
chongf=0
for item in result['measures']:
if item['metric']=="bugs":
bug=item['value']
elif item['metric']=='code_smells':
code=item['value']
elif item['metric']=='coverage':
fugai=item['value']
elif item['metric']==['duplicated_lines_density']:
chongf=item['value']
else: pass
code_reslut={'bug数量':bug,"可能存在问题代码":code,
"覆盖率":fugai,"重复代码":chongf}
sendding(dingdingurl, content=code_reslut, title="代码覆盖率统计")
if __name__=="__main__":
huitui()
xinxitongji()
选择:Build after other projects are built,选择依赖的项目,稳定后调用
构建:
python sonar.py