从零打造属于自己的CI/CD Jenkins+Apifox (二)

前面章节讲解

jenkins简单配置以及发送邮件

这章节讲解 邮件内如何展示报告附件

号外、号外

邮件模版更新啦!好看的邮件模版总能让开发人员眼前一亮,建议使用以下模版。

1、报告模版如下:

<!DOCTYPE html>    
<html>    
<head>    
<meta charset="UTF-8">    
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
</head>    
    
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
    offset="0">    
    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
        <tr>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下是${PROJECT_NAME }项目构建信息</br> 
            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称: ${PROJECT_NAME}</li>    
                    <li>构建编号: 第${BUILD_NUMBER}次构建</li>    
                    <li>触发原因: ${CAUSE}</li>    
                    <li>构建状态: ${BUILD_STATUS}</li>
                    <li>构建日期: ${BUILD_TIMESTAMP}</li>   
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>测试报告: <a href="${PROJECT_URL}apifox-reports">${PROJECT_URL}apifox-reports</a></li>
                </ul> 

            <tr> 
            <td><br />    
            <b><font color="#0B610B">用例执行结果:</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
            </tr>    
            <tr>    
                <td> 
                 <ul> 
                     <li><font color="orange">用例结果: ${STATUS}</font></li>
                </ul>    
            </td>    
        </tr>  

            <tr> 
            <td><br /> 
            <b><font color="#0B610B">环境信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
            </tr>    
            <tr>    
                <td> 
                 <ul> 
                     <li>测试环境地址: <a href="${URL}">${URL}</a></li>    
                     <li>测试环境账号: ${USER}</li>    
                     <li>测试环境密码: ${PWD}</li>  
                </ul>    
            </td>    
        </tr>    
    </table> 
    <h3><font color="##CC0000">API测试报告详情见附件,拜~</font></h3>
</body>
</html>

2、邮件内容变量参数说明

${ENV, var="JOB_NAME"}: 当前job名; 
${BUILD_NUMBER}: 当前job的第N次构建 
${PROJECT_NAME}: 项目名称;
${BUILD_STATUS}: 构建状态;
${BUILD_TIMESTAMP}: 构建时间,需要添加timestamper插件 
${CAUSE}: 触发原因;
${BUILD_URL}: 构建地址;
${PROJECT_URL}:报告地址;
以上变量名称是Jenkins自带的。

${STATUS}: 用例执行状态;
${URL}: 环境地址;
${USER}: 环境账号;
${PWD}: 环境密码;

以上报告模版增加了测试环境内容展示,该环境变量是自定义的变量名称,并不是Jenkins自带的;

需要在 jenkins_home 项目内创建 txt文档

比如:/Users/xxxx/data/jenkins_home/workspace/项目名称/build_status.txt

内容如下:

STATUS=Failed #用例执行结果展示
URL=http://xx.xx.xx.xx:xxxx #测试环境地址
USER=xxxxx #测试环境账号
PWD=xxxxx #测试环境密码

配置增加构建步骤

选择:注入环境变量(Injecting environment variables)

属性文件路径内填写txt文档名称即可

邮件内增加报告附件

1、配置构建后操作 选择Editable Email Notification

在Attachments输入框内配置相对路径的报告地址和报告名称

 2、点击Advanced Settings在Triggers点击addTriggers选择Always

3、点击高级后,Recipient List内填写收件人邮箱地址后,点击应用保存

4、再次构建后,查看邮箱,邮件内是否收到附件

配置企业微信提醒

1、下载插件

Manage Jenkins->Plugin Manager选择Availble,输入框内填写:Qy Wechat Notification 并勾选框框,点击 install without restart 下载成功后,在installed内查看

创建企微群管理机器人,获取Webhook地址

2、配置构建后操作->选择【企业微信通知】

Webhook地址填写:机器人生成的Token

3、点击立即构建。企业微信内查看执行结果

自定义配置企业微信提醒通知

1、可以简单的在 Jenkins 中安装企业微信插件,直接配置,就可以直接通知

2、为了实际的需求可能要通知部分人或者通知内容要更改,这个时候我们可以自己手写一个python脚本文件,根据需求放在 Build 前后执行就OK了。

创建 Python 脚本如下

import requests
import json
import urllib3
import sys
import re

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class InformRobot:
    def __init__(self):
        self.sess = requests.session()
        self.test_case_passing_rate = ""
        self.test_case_fail_rate = ""
        self.avg_api_response_rate = ""
        self.test_case_untested_rate = ""
        self.test_case_quantity_rate = ""

    def markdown_robot(
            self, webhook_url, report_url, principal, job_name,test_environment, STATUS
    ):
        """
        实现企业微信通知
        :param webhook_url: 企业微信token
        :param report_url: 报告地址
        :param principal: 负责人名称
        :param job_name: 项目名称
        :param test_environment:环境名称
        :return:
        """
        data = {

        "msgtype": "markdown",  # 消息类型,此时固定为markdown

            "markdown": {
                "content": f"### 提醒! <font color=\"info\"> {job_name} </font> 接口自动化测试反馈  \n "
                           f">项目名称:{test_environment} \n" +
                           f">测试用例结果:<font color=\"info\"> {STATUS} </font> \n" +
                           f">测试用例总数:<font color=\"info\"> {self.test_case_quantity_rate} </font> \n" +
                           f">平均接口请求耗时:<font color=\"info\"> {self.avg_api_response_rate} </font> \n" +
                           f">测试用例通过率:<font color=\"info\"> {self.test_case_passing_rate} </font> \n" +
                           f">测试用例失败率:<font color=\"#FF0000\"> {self.test_case_fail_rate} </font> \n" +
                           f">测试用例未测率:<font color=\"#FFCC33\"> {self.test_case_untested_rate} </font> \n" +
                           f">测试报告链接:[点击查看报告详情]({report_url}) \n" +
                           f">测试负责人:{principal}"
            }
        }
        re_post = self.sess.post(webhook_url, data=json.dumps(data), verify=False)
        print(re_post.content, data)
        return re_post

    def result_pass_rate(self, html_path):
        with open(html_path, "r", encoding="utf-8") as f:
            report = f.read()

        pass_rate = re.search('<div class="col-md-4 text-label">通过率</div>\n\ +<div class="col-md-8">(.*?)</div>',
                              report)

        fail_rate = re.search('<div class="col-md-4 text-label">失败率</div>\n\ +<div class="col-md-8">(.*?)</div>',
                              report)
        avg_api_response_time = re.search('<div class="col-md-4 text-label">平均接口请求耗时</div>\n\ +<div class="col-md-8">(.*?)</div>',
                                          report)

        case_untested_rate = re.search('<div class="col-md-4 text-label">未测率</div>\n\ +<div class="col-md-8">(.*?)</div>',report)
        case_quantity_rate = re.search('<div class="col-md-4 text-label">循环数</div>\n\ +<div class="col-md-4">(.*?)</div>',report)



        self.test_case_fail_rate = fail_rate.group(1) #用例失败率
        self.test_case_passing_rate = pass_rate.group(1) #用例通过率
        self.avg_api_response_rate = avg_api_response_time.group(1) #平均接口请求耗时
        self.test_case_untested_rate = case_untested_rate.group(1) #用例未测率
        self.test_case_quantity_rate = case_quantity_rate.group(1) #用例数量


if __name__ == '__main__':
    webhook_url = sys.argv[1]
    report_url = sys.argv[2]
    principal = sys.argv[3]
    job_name = sys.argv[4]
    test_environment = sys.argv[5]
    STATUS = sys.argv[6]
    build_number = sys.argv[7]

    path = "/var/jenkins_home/workspace/{}/apifox-reports/test-dsp-apifox_{}.html".format(job_name,build_number)

    info_robot = InformRobot()
    info_robot.result_pass_rate(path)
    info_robot_res = info_robot.markdown_robot(webhook_url, report_url, principal, job_name, test_environment, STATUS)
    print(info_robot_res)

    info_robot.sess.close()

把 Python 脚本放到 工作空间内,比如:/Users/xxxx/data/jenkins_home/workspace/check-apifox/下面

安装 Python3 环境

因为 Jenkins 是用镜像运行的,所以需要在 Jenkins 容器内安装 Python3 环境,跟着下面步骤一一执行吧!

1、从服务器拉取可用的包到容器内

进入 Jenkins容器内,使用 docker exec -it 容器ID /bin/bash 查看当前操作系统cat /etc/issue

这里查到的是Debian系统(不是ubuntu, 也不是centos),这里yum是没有的,所以不能用yum安装了,这里用apt-get代替yum

先执行更新命令:apt-get update

出现报错,问题原因:权限不足,请使用 root 用户

解决方法如下:使用以下命令重新进入容器:docker exec -u 0 -it 容器ID /bin/bash

备注:-u 0 表示 root 权限

注意:从服务器拉取可用的包完成后,手动重启Docker、Jenkins

2、容器内部安装 Python3

1.先安装依赖

apt-get -y install gcc automake autoconf libtool make 
apt-get -y install make*
apt-get -y install zlib*
apt-get -y install openssl libssl-dev
apt-get install sudo 
 
注意:以上依赖下载过程较慢,耐心等待。。。。。。

2.下载 Python3

进入 /usr/local内
root@b8ebff36b8ed:/# cd /usr/local
 
执行 下载python
root@b8ebff36b8ed:/usr/local# wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
出现 bash: wget: command not found
 
下载 wget
root@b8ebff36b8ed:/usr/local# sudo apt-get install wget
 
wget下载完成后,再次执行下载操作
root@b8ebff36b8ed:/usr/local# wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
 
下载完成
root@b8ebff36b8ed:/usr/local# ls
Python-3.8.12.tgz  bin  etc  games  include  lib  man  sbin  share  src
使用 命令 tar -xvf Python-3.8.12.tgz
 
创建  python3 文件夹
mkdir python3
 
切换到解压后的 Python-3.8.12 目录下
cd Python-3.8.12

3.执行如下代码安装

--prefix 选项是配置安装的路径,执行后所有资源文件放在 /usr/local/python3 的路径里。
./configure --prefix=/usr/local/python3 --enable-optimizations
make
make install
注意:以上命令执行过程时间较慢、耐心等待。。。。。

4.创建软链接

root@b8ebff36b8ed:/# ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
root@b8ebff36b8ed:/# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

5.容器内查看Python3环境是否安装成功

Jenkins内添加环境变量和构建命令

1、勾选 將環境變量注入構建過程->属性内容

添加以下内容

webhook_url=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6cf7bafe-56f9-48b0-xxxx-5399xxxx9c2
principal= xxx  # 测试负责人
test_Project_Name=测试环境
DSP_URL=http://xx.xx.xxx.xxx:xxxxx
DSP_USER=xxxx
DSP_PWD=xxxxx

2、添加构建命令

#!/bin/bash
/usr/bin/python3 "webhook.py" ${webhook_url} http://127.0.0.1:80/${JOB_NAME}_${BUILD_NUMBER}.html ${principal}  ${JOB_NAME} ${test_Project_Name}  ${STATUS} ${BUILD_NUMBER}

注意:请按照该顺序添加环境变量,否则会执行失败。

命令添加完成后,点击执行构建。

 出现原因:Jenkins 内虽然安装了Python环境,但是未下载 Python 需要用的模块。

解决方法: Jenkins容器内下载 相关模块。

root@b8ebff36b8ed: pip3 install requests
Collecting requests
  Downloading requests-2.28.1-py3-none-any.whl (62 kB)
     |████████████████████████████████| 62 kB 378 kB/s
Collecting idna<4,>=2.5
  Downloading idna-3.4-py3-none-any.whl (61 kB)
     |████████████████████████████████| 61 kB 64 kB/s
Collecting charset-normalizer<3,>=2
  Downloading charset_normalizer-2.1.1-py3-none-any.whl (39 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.12-py2.py3-none-any.whl (140 kB)
     |████████████████████████████████| 140 kB 296 kB/s
Collecting certifi>=2017.4.17
  Downloading certifi-2022.9.24-py3-none-any.whl (161 kB)
     |████████████████████████████████| 161 kB 165 kB/s
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2022.9.24 charset-normalizer-2.1.1 idna-3.4 requests-2.28.1 urllib3-1.26.12
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.1.1; however, version 22.3.1 is available.
You should consider upgrading via the '/usr/local/python3/bin/python3.8 -m pip install --upgrade pip' command.

3、模版下载完成后,再次点击 立即执行构建

4、 企业微信内查看提醒通知

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值