从零打造属于自己的CI/CD Jenkins+Requests+Html

前提

UI自动化框架使用 Python+requests+Pymysql+openpyxl 模块组成
使用 Docker 搭建本地 Jenkins 或者 线上服务
注册 Gltlab 账号,并创建一个项目,这里我的项目名是 api-auto-test(下面简称接口自动化测试)

代码上传到Gitlab仓库内

Jenkins配置相关操作

下载相关插件
GitLab、Generic Webhook Trigger、Git Parameter,安装完插件重启系统:
从零打造属于自己的CI/CD Jenkins+Requests+Html_第1张图片
配置 GitLab 凭据

系统配置->Manage Credentials

从零打造属于自己的CI/CD Jenkins+Requests+Html_第2张图片
从零打造属于自己的CI/CD Jenkins+Requests+Html_第3张图片

Gitlab API 如何获取呢!请看下图

从零打造属于自己的CI/CD Jenkins+Requests+Html_第4张图片

点击 创建个人访问令牌

会生成一串 ID,点击 复制

从零打造属于自己的CI/CD Jenkins+Requests+Html_第5张图片

粘贴到 Gitlab 凭证内

从零打造属于自己的CI/CD Jenkins+Requests+Html_第6张图片

点击 Create

从零打造属于自己的CI/CD Jenkins+Requests+Html_第7张图片
配置 Gitlab 链接

系统管理->Configure System

从零打造属于自己的CI/CD Jenkins+Requests+Html_第8张图片
Connection name:名称随意写
Gitlab host URL:gitlab地址
Credentials:选择已添加的 Gitlab 凭证
点击 Test Connttion 返回 Success 表示链接成功
配置 Gitlab 账号密码

系统配置->Manage Credentials

从零打造属于自己的CI/CD Jenkins+Requests+Html_第9张图片
类型选择:Username with password
用户名/密码:填写 gitlab的登录用户名和密码

Jenkins内创建任务

从零打造属于自己的CI/CD Jenkins+Requests+Html_第10张图片
任务内配置 General
从零打造属于自己的CI/CD Jenkins+Requests+Html_第11张图片
GitLab connection:自动选择 Gitlab 链接名称
源码管理配置Git
从零打造属于自己的CI/CD Jenkins+Requests+Html_第12张图片
Repository URL: 填写 gitlab 仓库地址
Credentials: 选择已添加的 gitlab 账号密码链接
高级:
Name:填写 origin
Refspec: 填写+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*(通配符)
Branches to build: 填写 */main

Gitlab 仓库地址获取⬇️

从零打造属于自己的CI/CD Jenkins+Requests+Html_第13张图片

Jenkins 构建拉取仓库代码

构建成功,代码拉取成功

从零打造属于自己的CI/CD Jenkins+Requests+Html_第14张图片

Jenkins内构建测试用例

从零打造属于自己的CI/CD Jenkins+Requests+Html_第15张图片

构建成功,查看详情

从零打造属于自己的CI/CD Jenkins+Requests+Html_第16张图片

Jenkins内展示HTML报告

要知道HTML报告名称是使用什么组成的
比如报告名称:2023-03-02_13:02_接口自动化测试报告.html

那Jenkins内如何写呢

任务->构建后操作->选择 Publish HTML reports

从零打造属于自己的CI/CD Jenkins+Requests+Html_第17张图片
HTML directory to archive:报告存放路径(按照实际情况填写)
Index page[s]:拼接类型的报告名称
Report title:jenkins内展示的报告名称

${BUILD_TIMESTAMP} 变量如何获取呢!请看下图

系统配置-> Configure System 找到Build Timestamp 直接引用变量名就ok啦!(需要下载时间插件)

从零打造属于自己的CI/CD Jenkins+Requests+Html_第18张图片
进行构建,查看报告
从零打造属于自己的CI/CD Jenkins+Requests+Html_第19张图片
查看报告详情
从零打造属于自己的CI/CD Jenkins+Requests+Html_第20张图片

如果出现报告样式丢失,在构建后操作内选择 Groovy Postbuild 填写以下 代码

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
System.setProperty("org.apache.commons.jelly.tags.fmt.timeZone","Asia/Shanghai")

Jenkins 发送邮件并展示附件

任务->构建后操作->Editable Email Notification

从零打造属于自己的CI/CD Jenkins+Requests+Html_第21张图片
从零打造属于自己的CI/CD Jenkins+Requests+Html_第22张图片
Project Recipient List:填写收件人邮箱
Content Type:选择HTML类型
Default Subject:填写 邮件名称
Attachments:填写绝对报告路径地址
Default Content:填写以下报告样式
    
    
    
    
${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志    
    
    
    
        
            本邮件由系统自动发出,无需回复!
各位同事,大家好,以下为${PROJECT_NAME }项目构建信息
构建结果 - ${BUILD_STATUS}

构建信息
构建成功,邮箱查看邮件

Jenkins集成 群机器人自定义发送构建信息

创建 脚本 如下:

import requests
import json
import urllib3
import sys
import re
from datetime import datetime


urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class InformRobot:
    def __init__(self):
        self.sess = requests.session()
        self.test_case_quantity_rate = ""
        self.test_use_case_pass = ""
        self.test_use_case_fail = ""
        self.test_use_case_skip = ""
        self.test_case_run_time = ""


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

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

            "markdown": {
                "content": f"### 提醒!  {job_name}  接口自动化测试反馈  \n "
                           f">项目名称:DSP测试环境  \n"
                           f">测试用例总数: {self.test_case_quantity_rate}  \n"
                           f">测试用例通过: {self.test_use_case_pass}  \n"
                           f">测试用例失败: {self.test_use_case_fail}  \n"
                           f">测试用例跳过: {self.test_use_case_skip}  \n"
                           f">测试用例运行时间: {self.test_case_run_time}s  \n"
                           f">测试报告链接:[点击报告查看详情]({reports_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()

        case_quantity_rate = re.findall('\d+', str(re.findall('"testAll":(.*?),', report))) # 获取用例总数
        use_case_pass = re.findall('\d+', str(re.findall('"testPass":(.*?),',report))) # 获取用例通过
        use_case_fail = re.findall('\d+', str(re.findall('"testFail":(.*?),',report))) # 获取用例失败
        use_case_skip = re.findall('\d+', str(re.findall('"testSkip":(.*?),',report))) # 获取用例跳过
        test_case_run_time = re.findall('\d+', str(re.findall('"totalTime":(.*?),',report))) # 获取用例运行时间



        self.test_case_quantity_rate = case_quantity_rate[0] # 获取用例总数
        self.test_use_case_pass = use_case_pass[0]  # 获取用例通过
        self.test_use_case_fail = use_case_fail[0]  # 获取用例失败
        self.test_use_case_skip = use_case_skip[0]  # 获取用例跳过
        self.test_case_run_time = test_case_run_time[0] # 获取用例运行时间



if __name__ == '__main__':

    #===============================jenkins内执行====================================#
    datetime = datetime.now().strftime('%Y-%m-%d_%H:%M') # 获取本地时间
    print(datetime)

    reports_url = 'http://127.0.0.1:2587/{}_接口自动化测试报告.html'.format(datetime) #报告对外访问
    print(reports_url)

    webhook_url = sys.argv[1] #必填参数
    job_name = sys.argv[2] #必填参数
    principal = sys.argv[3] #必填参数

    path = "/var/jenkins_home/workspace/{}/reports/{}_接口自动化测试报告.html".format(job_name,datetime) #报告路径

    info_robot = InformRobot()
    info_robot.result_pass_rate(path)
    info_robot_res = info_robot.markdown_robot(webhook_url,job_name)
    print(info_robot_res)

    info_robot.sess.close()
任务->Build Steps 在已有的shell内填写以下内容
# 自定义企业微信通知
python3 "webhook/webhook.py" ${webhook_url} ${JOB_NAME} ${principal}
任务-构建环境->选择 将环境变量注入构建过程 填写以下内容
从零打造属于自己的CI/CD Jenkins+Requests+Html_第23张图片

点击 应用 并保存

Jenkins容器内配置 nginx

参考:从零打造属于自己的CI/CD Jenkins+Apifox (四)

⚠️注意:nginx只能监听一个报告路径对应的一个端口,所有 需要重新运行Jenkins镜像,并填写多个端口。

路径:vi /etc/nginx/nginx.conf,配置后记得重启nginx
从零打造属于自己的CI/CD Jenkins+Requests+Html_第24张图片

构建成功,企业微信内查看报告

点击报告链接

从零打造属于自己的CI/CD Jenkins+Requests+Html_第25张图片

Jenkins 集成 Webhook

任务->构建触发器 勾选 Build when a change is pushed to GitLab. GitLab CI Service URL: http://127.0.0.1:8089/project/gitlab-api-auto-test

从零打造属于自己的CI/CD Jenkins+Requests+Html_第26张图片
进入 Gitlab 仓库内 选择设置 点击 Webhooks
从零打造属于自己的CI/CD Jenkins+Requests+Html_第27张图片
从零打造属于自己的CI/CD Jenkins+Requests+Html_第28张图片
网址:粘贴 URL
Secret token:粘贴 生成的密码
触发来源 全部勾选

你可能感兴趣的:(Jenkins持续集成,git,jenkins)