持续集成八 企业微信通知构建结果
构建结果的通知
自动化测试结果的通知
目标:将此次构建的内容包括提交人,提交内容(代码管理是git) 构建结果推送至企业微信群
第一步获取到提交人&提交内容 没有内建函数,从网上找的一个方案
https://github.com/daniel-beck/changelog-environment-plugin
下载这个插件,根目录执行mvn verify 生成的插件上传到jenkins
参考文档:https://www.tuicool.com/articles/zQbeuir
对构建任务 添加构建环境
提交人:%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)
效果图: