jenkins +sonarqube 对后端代码静态扫描,钉钉群通知执行结果

582 阅读2分钟

这是我参与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

构建:

image.png

配置

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

如果达到预期,发送统计信息,当需要回退,我们回滚通知发送给大家,这里需要设置符合项目回滚的阈值。可以根据实际的项目进行调整

我们看下结果

image.png

当我们需要回退,通知

image.png