持续集成八 企业微信通知构建结果

构建结果的通知

自动化测试结果的通知

目标:将此次构建的内容包括提交人,提交内容(代码管理是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)

 


效果图:

 

 

 

 



posted @ 2020-09-03 19:04  二到不知处  阅读(204)  评论(0编辑  收藏  举报