Files
smart-management-auto-test/zhyy/library/CommonFun/handle_jenkins.py
qiaoxinjiu 6994b185a3 addproject
2026-01-22 19:10:37 +08:00

257 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding:utf-8 -*-
import sys
import xml.etree.ElementTree as ET
WORKSPACE = sys.argv[1]
sys.path.append(WORKSPACE)
import json
import requests
import os
import re
from bs4 import BeautifulSoup
from html.parser import HTMLParser
handle_parser = HTMLParser()
BUILD_INFO = {}
class handle_to_jenkins():
'''
处理关于jenkins的执行相关方法
'''
def __init__(self):
self.dict_info = {}
self.list_info = []
def GetJenkinsVar(self, key):
'''
获取jenkins上获得的参数信息
'''
try:
value = os.environ.get(key)
except Exception:
value = os.environ.get(key.upper())
if (not value):
value = ''
return value
def kw_to_get_dd_token(self, environment):
"""
功能: 根据传入环境获取不同的token信息
"""
sim = "40696c86-264a-4222-a40c-cfd64a05dffd"
product = "40696c86-264a-4222-a40c-cfd64a05dffd"
if environment.lower() == "sim" or environment.lower() == "qa":
return sim
else:
return product
def send_message_by_dingding(self, data, environment="qa"):
'''
发送钉钉消息
'''
token = self.kw_to_get_dd_token(environment=environment)
# web_hook = "https://oapi.dingtalk.com/robot/send?access_token={}".format(token)
web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/{}".format(token)
headers = {"Content-Type": "application/json"}
json_data = json.dumps(data)
rsp = requests.post(url=web_hook, data=json_data, headers=headers)
return rsp
# print(data)
def send_feishu(self,inferfaces):
'''
发送飞书
:return:
'''
at_user_list = [{"tag": "at", "user_id": "{}".format("7020366259502153730")}]
message_data = {"msg_type": "post", "content": {
"post": {"zh_cn": {"title": "有存在的接口未实现自动化哦",
"content": [[{"tag": "text", "text": "问题数据:"}],
[{"tag": "text", "text": "{}".format(inferfaces)}],
at_user_list]}}}}
web_hook = "https://open.feishu.cn/open-apis/bot/v2/hook/40696c86-264a-4222-a40c-cfd64a05dffd"
headers = {"Content-Type": "application/json"}
json_data = json.dumps(message_data)
print(json_data)
rsp = requests.post(url=web_hook, data=json_data, headers=headers)
return rsp
def handle_send_message(self,root):
'''
处理对应所有人根据job名称匹配来发送@的消息
'''
list_name_phone = {"陈江": "13458500234", "张楠": "", "罗志鹏": "",
"蒲思宇": "", "陈洁": "15328118883", "刘涛婷": "18328504751", "谯新久": "18202810506"}
job_name = self.GetJenkinsVar("JOB_TO_NAME")
job_url = self.GetJenkinsVar("JOB_TO_URL")
enviroment = self.GetJenkinsVar("JOB_ENVIRONMENT")
# job_name = "123"
# job_url = "http://10.250.200.1:8080/jenkins/job/QA%E7%8E%AF%E5%A2%83%E5%B7%A1%E6%A3%80/2387/robot/report/report.html"
# enviroment = "PRODUCT"
dict_info = self.get_fail_test_case(son_node=root)
BUILD_INFO = dict_info.get("BUILD_INFO")
fail_info = dict_info.get("INFO")
list_phone = []
if BUILD_INFO:
for key, value in BUILD_INFO.items():
list_phone.append(list_name_phone.get(key))
print(list_phone)
print("+++++++{0}+++++{1}".format(job_name, job_url))
if re.search("PRODUCT", enviroment):
# message_data = {"msg_type": "text", "content": {
# "text": "线上巡检:线上环境出现了问题,请点击进行查看{0},以下是错误日志:{1}".format(job_url + "robot/report/report.html",fail_info)},
# "at": {"atMobiles": list_phone}}
at_user_list = [{"tag": "at", "user_id": "{}".format("7020366258071715842")}]
message_data = {"msg_type": "post", "content": {
"post": {"zh_cn": {"title": "线上环境巡检",
"content": [[{"tag": "text", "text": "线上环境出现了问题:"}],
[{"tag": "a", "text": "点击查看","href":"".format(job_url + "robot/report/report.html")}],
at_user_list]}}}}
print(message_data)
self.send_message_by_dingding(message_data,environment="product")
return enviroment
if re.search("QA", enviroment) or re.search("SIM", enviroment):
message_data = {"msg_type": "text", "content": {
"text": "{0}环境构建出问题了哦,请点击进行查看{1},以下是错误日志:{2}".format(enviroment, job_url + "robot/report/report.html",fail_info)},
"at": {"atMobiles": list_phone}}
print(message_data)
self.send_message_by_dingding(message_data)
return enviroment
for key, value in list_name_phone.items():
if re.search(key, job_name):
message_data = {"msg_type": "text", "content": {
"text": "亲爱的{0}同学,你的独立环境构建出问题了哦,请点击进行查看{1}".format(key, job_url + "robot/report/report.html")},
"at": {"atMobiles": [value]}}
self.send_message_by_dingding(message_data)
return value
else:
return "这个job:{}没有找到人".format(job_name)
def get_fail_test_case(self,son_node, father_node=None, grandpa_node=None):
"""
功能遍历xml文件的所有节点搜索构建失败的用例信息
"""
children_node = son_node.getchildren()
if len(children_node) == 0:
# if son_node.tag == 'doc':
# print(son_node.text)
# if son_node.tag == 'msg' and son_node.attrib['level'] == 'FAIL':
# # print(son_node.text)
# # print(son_node.attrib['timestamp'])
# print(children_node)
if son_node.tag == 'status' and son_node.attrib['status'] == 'FAIL' and 'critical' in son_node.attrib:
# print(father_node.attrib["name"])
tag = self.find_tags(father_node)
# a = self.find_error(father_node)
# print(a)
info_error = self.check_log_info(son_node.text)
INFO = "用例名称:" + father_node.attrib["name"] +"。人员:" + tag + "。失败日志:" + str(info_error)
run_time = son_node.attrib['endtime']
# print(info_error)
# print(son_node.text)
# self.check_log_info(text=son_node.text)
run_time = "{}-{}-{} {}".format(run_time[0:4], run_time[4:6], run_time[6:8], run_time[9:17])
reason = son_node.text.replace('"', '\\"')
# 满足构建时间,同时数据库中没有数据,才入库
# print(run_time)
if tag in BUILD_INFO:
BUILD_INFO[tag] += 1
else:
BUILD_INFO[tag] = 1
# print(BUILD_INFO)
# print(tag)
self.list_info.append(INFO)
self.dict_info["BUILD_INFO"] = BUILD_INFO
self.dict_info["INFO"] = self.list_info
# print(tag)
run_time = run_time
author = tag
case_name = father_node.attrib['name']
file_path = grandpa_node.attrib['source']
reason = reason[0:4500]
return self.dict_info
for child in children_node:
self.dict_info = self.get_fail_test_case(child, son_node, father_node)
return self.dict_info
def check_log_info(self,text):
'''
过滤精确日志信息
'''
soup = BeautifulSoup(text, features="lxml")
list_info = []
for a in soup.find_all(name='span'):
dict_info = {}
if a.text == "Old message:":
dict_info["old_message"] = a.nextSibling
list_info.append(dict_info)
elif a.text == "New message:":
dict_info["new_message"] = a.nextSibling
list_info.append(dict_info)
# print(a.nextSibling)
if list_info:
return list_info
else:
return text
def find_tags(self,root):
"""
功能在xml文件中搜索失败用对应的作者
"""
children_node = root.getchildren()
for child in children_node:
if child.tag == 'tags':
tags = child.getchildren()
for tag in tags:
if 'qa-' in tag.text.lower():
return tag.text[3:len(tag.text)]
return "无作者标签"
def find_error(self,root):
"""
功能在xml文件中查询失败日志
"""
children_node = root.getchildren()
for child in children_node:
if child.tag == 'kw':
msgs = child.getchildren()
for msg in msgs:
a = msg.tag
# t = msg.attrib['level']
l = msg.text
# print(msg.attrib['timestamp'])
if msg.tag == 'msg' and msg.attrib['level'] == 'FAIL':
print(msg.attrib)
s = msg.text
return msg.text
return ""
def run(self):
'''
运行入口
'''
# FILE_PATH = "D:/output2.xml"
FILE_PATH = os.path.abspath(os.path.join(WORKSPACE, 'Report/out/output.xml'))
root = ET.parse(FILE_PATH).getroot()
# self.get_fail_test_case(son_node=root)
self.handle_send_message(root=root)
if __name__ == '__main__':
test = handle_to_jenkins()
# FILE_PATH = "D:/output1.xml"
# FILE_PATH = os.path.abspath(os.path.join(WORKSPACE, 'Report/out/output.xml'))
# root = ET.parse(FILE_PATH).getroot()
# print(test.get_fail_test_case(son_node=root))
test.run()
# test.handle_send_message(root=root)