构建结果的通知
自动化测试结果的通知
目标:将此次构建的内容包括提交人,提交内容(代码管理是git) 构建结果推送至企业微信群
第一步获取到提交人&提交内容 没有内建函数,从网上找的一个方案
下载这个插件,根目录执行mvn verify 生成的插件上传到jenkins
对构建任务 添加构建环境
提交人:%1$s--提交内容:%3$s+++
可能会有多次提交信息 +++ 作为分隔符 后面用作截取
添加构建够操作
Trigger parameterized build on other projects
f_url = ${BUILD_URL}
f_name = ${JOB_NAME}
f_res = Failed
build_remark = ${SCM_CHANGELOG} # SCM_CHANGELOG 为提交信息的参数名
在jenkins添加notice_work_wx 的任务
添加一下参数化构建的几个参数
执行通知的python脚本
@echo off
d:
cd D:/TestPlat/services
python work_wx_notice.py "%f_url%" "%build_remark%" "%f_name%" "%f_res%"
exit 0
python脚本:
# -*- coding:utf-8 -*-
import requests
import json
import sys
# 默认推送地址
notice_test_url = "" # 开发群企业微信机器人通知地址
notice_qun_url = "" # 测试群企业微信机器人通知地址
header = {"content-type": "application/json"}
def work_wx_notice(b_data, b_url=notice_qun_url):
"""企业微信机器人通知"""
try:
res = requests.post(b_url, data=json.dumps(b_data), headers=header)
_dic = json.loads(res.text)
if _dic['errcode'] != 0:
err_notice(res.text)
except Exception as e:
err_notice(e.__str__())
def err_notice(err_msg):
data = {
"msgtype": "markdown",
"markdown": {
"content": "**推送失败**\n详情:" + str(err_msg)
}
}
requests.post(notice_test_url, data=json.dumps(data), headers=header)
if __name__ == "__main__":
build_url = sys.argv[1]
build_remark = sys.argv[2]
build_job_name = sys.argv[3]
build_res = sys.argv[4]
if build_res == "Stable":
result_text = "<font color=\"info\">构建成功</font>"
else:
result_text = "<font color=\"warning\">构建失败,请点击下方链接查看错误详情</font>"
remark = build_remark.split('+++')
build_content = "\n构建内容:\n"
for once in remark:
build_content += ">" + once + "\n"
print(build_content)
notice_data = {
"msgtype": "markdown",
"markdown": {
"content": "### ======构建通知======\n构建项目:" + build_job_name + build_content +
"\n构建结果:" + result_text +
"\n详情请点击:[构建地址](" + build_url + ")"
}
}
print(notice_data)
if build_res != "Stable": # 构建成功,暂不推送,嫌烦
work_wx_notice(notice_data)
# work_wx_notice(notice_data, notice_test_url)
优化一下自动化测试入口脚本
# -*- coding:utf-8 -*-
import requests
import json
import sys
# 获取调用的参数
build_name = sys.argv[1]
father_url = sys.argv[2]
version = sys.argv[3]
build_remark = sys.argv[4].split('+++')
build_url = sys.argv[5]
# 处理提交备注信息
build_content = "\n构建内容:\n"
build_author = "jenkins触发"
i = 1
for once in build_remark:
if i + 1 == build_remark.__len__(): # 取最后一次(即倒数第二条)的提交人作为构建人,
build_author = once.split('--提交内容:')[0]
build_content += ">" + once + "\n"
i += 1
data = {"build_name": build_name, "father_url": father_url, "version": version, "build_author": build_author,
"build_content": build_content, "build_url": build_url}
# 初始化结果
ff = open(r'autoTest' + build_name + '.txt', 'w', encoding='utf-8')
ff.write("1")
ff.close()
# 定义各项目的测试计划地址
url = ''
if build_name == "pollapi":
url = "" # 项目的自动化测试地址
# 调用测试的入口
if url != '':
rel = requests.post(url, data=json.dumps(data))
text = rel.text
# text = rel.text.encode('latin-1').decode('unicode_escape')
print(text)
res = json.loads(text)
else:
print(r"未配置项目的测试计划地址")
res = {}
# 将测试结果是否通过更新到文本,方便jenkins读取
f = open(r'autoTest' + build_name + '.txt', 'w', encoding='utf-8')
if res.keys().__len__() == 0 or res['fail'] > 0:
f.write("1")
else:
f.write("0")
f.close()
优化一下测试结果的更新内容:
from projectMode.models import ProjectMode
import requests
from services.work_wx_notice import work_wx_notice
def update_version(project_id, request, is_test_pass=True):
version_id = ''
if 'version' in request.keys():
version_id = str(request['version'])
if version_id != '':
if is_test_pass:
# 测试通过,更新版本信息
ProjectMode.objects.filter(id=project_id).update(version=version_id)
else:
# 获取回滚地址&当前版本
project_info = ProjectMode.objects.get(id=project_id)
run_version = project_info.version
roll_uri = project_info.rollBackUri
if run_version is not None and run_version != '' and roll_uri != '':
uri = roll_uri.replace("{version}", run_version)
# 回滚操作
requests.get(uri)
# 调用测试失败通知
test_fail_notice(request, run_version)
def test_fail_notice(request, run_version='无原始版本'):
build_job_name = request['build_name']
version_id = str(request['version'])
build_content = request['build_content']
father_url = request['father_url']
build_url = request['build_url']
notice_data = {
"msgtype": "markdown",
"markdown": {
"content": "### ######测试失败通知######\n构建项目:" + build_job_name +
"\n构建版本:**" + version_id + "**;<font color=\"warning\">测试不通过,已被回滚到版本</font>:**" +
str(run_version) + "**" + build_content +
"\n详情请点击:[版本构建地址](" + father_url + ")---[测试结果地址](" + build_url + ")"
}
}
work_wx_notice(notice_data)
效果图: