Linux机器通过Docker-Compose安装Jenkins发送Allure报告

目录

一、安装Docker

二、安装Docker Compose

三、准备测试用例

四、配置docker-compose.yml

五、启动Jenkins

六、配置Jenkins和Allure插件

七、创建含pytest的Jenkins任务

八、项目结果通知

1.通过企业微信通知

2.通过邮件通知

九、配置域名DNS解析


最近小编接到一个任务用来监测和巡检网络入口是否正常,下面是我实现的思路图:

下面是我要实现的具体步骤:

一、安装Docker

在CentOS上,首先更新包管理工具并安装所需的包。

sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

接下来,添加Docker的官方仓库,然后安装Docker。

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io

在执行这步骤的时候可能会出现下载Docker不成功,我后面采用aliyun下载的并设置了自己的代理。

启动Docker服务,并设置为开机自启。

sudo systemctl start docker
sudo systemctl enable docker

二、安装Docker Compose

需要下载Docker Compose的当前稳定版本。检查Docker Compose GitHub仓库上的最新版本。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

这里最开始下载存在问题,我是登录仓库后下载对应的文件后,通过scp命令上传到/usr/local/bin目录下,并重命名为docker-compose

chmod +x docker-compose-linux-x86_64

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

验证安装是否成功。

docker-compose --version

三、准备测试用例

准备用pytest编写的测试用例。例如,创建一个简单的测试文件test_example.py

# test_example.py

def test_example():
    assert 1 == 1

def test_example_fail():
    assert 1 == 2

四、配置docker-compose.yml

创建docker-compose.yml文件来定义Jenkins服务。此配置将Jenkins作为服务运行,并准备了用于持久化数据和与宿主机的Docker守护进程通信的卷。因为我需要用到python脚本,采用pytest框架,这里我构建了python镜像。

version: '3.9'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    network_mode: "host"
    user: root
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/compose/jenkins/jenkins_data:/var/jenkins_home
      - /root/compose/jenkins/pythonProject:/var/jenkins_home/pythonProject
      - /root/compose/jenkins/apache-maven-3.9.8:/usr/local/apache-maven/apache-maven-3.9.8
      - /root/compose/jenkins/jdk-11.0.23:/usr/local/jdk-11.0.23
      - /root/compose/jenkins/conf/profile:/root/.bashrc
    environment:
      - TZ=Asia/Shanghai


  python:
    image: python:3.10
    container_name: python
    volumes:
      - /root/compose/jenkins/pythonProject:/usr/src
    working_dir: /usr/src
    command: bash -c "pip install -r requirements.txt && tail -f /dev/null"

五、启动Jenkins

运行以下命令在后台启动Jenkins服务:

docker-compose up -d

 我配置了portainer可视化界面,可看到启动后的镜像信息:

六、配置Jenkins和Allure插件

1.访问http:<机器名称>:8080进行Jenkins的初始化配置。

2.安装Allure Jenkins插件:进入管理--》插件管理,在“可选插件”标签页搜索“Allure Jenkins Plugin”进行安装。

3.重启Jenkins以应用安装的插件。

七、创建含pytest的Jenkins任务

1.在Jenkins中创建一个新的“自由风格的软件项目”。

2.在“源代码管理”部分,配置你的项目库(如果你的测试用例放在Git等版本控制系统中)。

3.在“构建”部分,添加“执行shell”步骤,填写命令来安装pytest和allure-pytest,并执行测试用例。

python3 -m ensurepip --upgrade  # 确保pip3安装/更新
pip3 install pytest
pip3 install allure-pytest
python3 -m pytest --alluredir=allure-results test_example.py

后续网络入口特别多的情况下,执行一次会耗时2h,时间成本太高,修改shell语句:

cd /var/jenkins_home/pythonProject
#可以先安装pytest-xdist插件
pip3 install pytest-xdist
#通过requirements.txt文件包含全部的依赖插件
pip3 freeze > requirements.txt

#上面两个步骤可以提前在jenkins容器内执行,这里可不执行

pytest -n 8 test_redirects.py --alluredir "allure-results" --clean-alluredir

4.运行Jenkins任务并查看Allure报告

但是最开始这里执行会报错,pip和python不存在,采用新的方式在docker容器内下载python3

首先以root用户权限进入到jenkins容器内:

docker exec -itu root jenkins /bin/bash

 执行命令:

apt-get update
#直接容器中安装 wget 
apt install -y wget

#先安装依赖
apt  -y install gcc automake autoconf libtool make
apt -y install make*
apt  -y install zlib*
apt -y install openssl libssl-dev
apt  install -y build-essential
apt  install sudo
sudo apt-get update
sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libffi-dev
sudo apt-get install libxpm-dev libxext-dev 
sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev 

#下载python
wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz

#解压下载的python包
tar -zvxf Python-3.12.1.tgz

#进入目录
cd /var/jenkins_home

#修改目录名称
mv Python-3.12.1 python3

#进入到python3目录
cd python3

#执行命令
./configure --prefix=/var/jenkins_home/python3

#make编译安装
./configure --prefix=/var/jenkins_home/python3 --with-ssl

#这时候可能会提示执行命令:
./configure --enable-optimizations
make
make install

#添加python3软链接
which python3

ln -s /var/jenkins_home/python3/bin/python3.12 /usr/local/bin/python3

#添加pip3软链接
ln -s /var/jenkins_home/python3/bin/pip3 /usr/local/bin/pip3

#检查是否安装成功
python3 --version
pip3 --version

运行刚刚配置的Jenkins任务。构建完成后,Jenkins将会显示一个“Allure报告”的链接,点击它即可查看详细的测试报告。

通过上述步骤就可以在CentOS系统上,通过docker-compose安装Jenkins,并通过Jenkins运行pytest编写的Python测试用例,并生成Allure测试报告了。

八、项目结果通知

1.通过企业微信通知

可在“执行shell”中加入语句:

curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yourkey \
   -H 'Content-Type: application/json' \
   -d '
   {
    "msgtype": "markdown",
    "markdown": {
        "content": "# 基建消防队 <font color=\"warning\"></font>\n
        > ### 级别状态: <font color=\"green\">S1 Recovered</font>\n
        > ### 规则标题: <font color=\"comment\">监控对象失联</font>\n
        > ### 规则备注: <font color=\"comment\">检查categraf到n9e链路是否正常</font>\n
        > ### 负责人: <font color=\"comment\">@xxx</font>\n
        > [查看详细报告](填写报告链接地址)"
    },
    "mentioned_list":["@all"]
   }'

在后面监测过程中想要报告展示的信息更全面,包含总测试案例、通过案例和通过率等字段的展示,可以更直观的看出报告详情。为了实现此功能,首先编写了python测试脚本result.py:

import json

#需注意这里的地址一定是容器内的地址!
with open('/path/to/report/directory/widgets/summary.json', 'r') as f:
    summary = json.load(f)

total_cases = summary['statistic']['total']
passed_cases = summary['statistic']['passed']
pass_rate = passed_cases / total_cases * 100

print(f"总测试案例:{total_cases}")
print(f"通过案例:{passed_cases}")
print(f"通过率:{pass_rate:.2f}%")

其次在构建项目中修改原有的"执行shell"脚本,这是我第一次写的脚本

# 运行Python脚本,捕获输出
output=$(python /var/jenkins_home/pythonProject/result.py)

# 使用curl发送企业微信消息
curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yourkey \
   -H 'Content-Type: application/json' \
   -d '
   {
    "msgtype": "markdown",
    "markdown": {
        "content": "# 基建消防队 <font color=\"warning\"></font>\n
        > ### 级别状态: <font color=\"green\">S1 Recovered</font>\n
        > ### 规则标题: <font color=\"comment\">网络入口监测</font>\n
        > ### 规则备注: <font color=\"comment\">检查网络入口是否正常通信</font>\n
        > ### 负责人: <font color=\"comment\">@xxx/font>\n
        > ### 报告详情: <font color=\"comment\">'$output'</font>
        > [查看详细报告](填写你的报告链接地址)"
    },
    "mentioned_list":["@all"]
   }'

上述脚本执行项目后在群里发送的样式为:

 

实在是太丑了,有没有!!

后面为了优化此报告,经历了不断的修改,最后给出正确的代码!

修改result.py脚本内容为:

import json

report_path = '/var/jenkins_home/pythonProject/allure-report/widgets/summary.json'
with open(report_path, 'r') as f:
    summary = json.load(f)

total_cases = summary['statistic']['total']
passed_cases = summary['statistic']['passed']
pass_rate = passed_cases / total_cases * 100


# 构建markdown格式的消息
markdown_message = f"""
> ### 总测试案例:<font color=\\\"orange\\\">{total_cases}</font>
> ### 通过案例:<font color=\\\"green\\\">{passed_cases}</font>
> ### 通过率:<font color=\\\"green\\\">{pass_rate:.2f}%</font>
"""

print(markdown_message.strip())

 修改shell脚本内容为:

# 运行Python脚本,捕获输出
output=$(python /var/jenkins_home/pythonProject/result.py)

# 使用curl发送企业微信消息,注意在此处使用双引号以允许变量展开
curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=yourkey \
   -H 'Content-Type: application/json' \
   -d "
   {
    \"msgtype\": \"markdown\",
    \"markdown\": {
        \"content\": \"# 基建消防队 <font color=\\\"warning\\\"></font>
        > ### 级别状态: <font color=\\\"red\\\">S1 Recovered</font>
        > ### 规则标题: <font color=\\\"comment\\\">网络入口监测</font>
        > ### 规则备注: <font color=\\\"comment\\\">检查网络入口是否正常通信</font>
        > ### 负责人: <font color=\\\"comment\\\">@xxx</font>
        > ${output}
        > [查看详细报告](填写你的报告链接地址)\"
    },
    \"mentioned_list\":[\"@all\"]
   }"

 

这样报告明显好看多了呢~ 

后面接口越来越多的情况下,有些接口第一次调用是失败的,但是发现当有测试case执行失败时,竟然影响到了整个项目的构建结果,这个肯定是不合理的。需要修改shell脚本解决此问题:

cd /var/jenkins_home/pythonProject

pytest -v -n 8 test_networkMonitor.py --alluredir "allure-results" --clean-alluredir || true

加入“|| true”判断会保证,不管pytest结果如何,脚本的执行都会继续进行,从而避免因测试失败而影响到最后的构建结果。 

2.通过邮件通知

(1)系统管理-->全局凭据配置-->设置发送邮件的用户名和密码作为全局凭据

(2)系统管理-->系统设置-->Extended E-mail Notification-->设置相关参数

 (3)系统管理-->系统设置-->邮件通知-->设置相应参数

(4)你的项目-->构建后操作-->Editable Email Notification-->设置相应参数

 这样就可以实现邮件发送啦~


九、配置域名DNS解析

最开始的思路是通过部署nginx,编写了docker-compose.yml文件

version: '3.9'
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins
    network_mode: "host"
    user: root
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/compose/jenkins/jenkins_data:/var/jenkins_home
      - /root/compose/jenkins/pythonProject:/var/jenkins_home/pythonProject
      - /root/compose/jenkins/apache-maven-3.9.8:/usr/local/apache-maven/apache-maven-3.9.8
      - /root/compose/jenkins/jdk-11.0.23:/usr/local/jdk-11.0.23
      - /root/compose/jenkins/conf/profile:/root/.bashrc
    environment:
      - TZ=Asia/Shanghai
   

  nginx:
    image: nginx
    container_name: nginx
    restart: always
    user: root
    ports:
      - "80:80"
    volumes:
      - /root/compose/jenkins/nginx:/etc/nginx/conf.d
    depends_on:
      - jenkins

在/root/compose/jenkins/nginx下新增nginx.conf文件,文件内容:

server {
    listen 80;
    server_name 你想要解析的域名;

    location / {
        proxy_pass http://你的机器IP:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

nginx启动之后,输入全新的域名就可以登录了

后续方案升级,端口转发交给docker,域名解析交给运维,不在需要nginx,最终的docker-compose.yml修改为:

version: '3.9'
services:
  jenkins:
    image: jenkins-terra:lts
    container_name: jenkins
    user: root
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/compose/jenkins/jenkins_data:/var/jenkins_home
      - /root/compose/jenkins/pythonProject:/var/jenkins_home/pythonProject
      - /root/compose/jenkins/apache-maven-3.9.8:/usr/local/apache-maven/apache-maven-3.9.8
      - /root/compose/jenkins/jdk-11.0.23:/usr/local/jdk-11.0.23
      - /root/compose/jenkins/conf/profile:/root/.bashrc
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:8080"

你学废了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis 源码分析--SqlSessionFactory

前言&#xff1a; 前文我们简单的回顾了 MyBatis 的基本概念&#xff0c;有聊到核心组件&#xff0c;工作流程等&#xff0c;本篇我们开始深入剖析 MyBatis 的核心源码&#xff0c;欢迎大家持续关注。 Mybatis 知识传送门 初识 MyBatis 【MyBatis 核心概念】 MyBatis 源码解…

深度学习500问——Chapter12:网络搭建及训练(3)

文章目录 12.3.5 Caffe有哪些接口 12.4 网络搭建有什么原则 12.4.1 新手原则 12.4.2 深度优先原则 12.4.3 卷积核size一般为奇数 12.4.4 卷积核不是越大越好 12.5 有哪些经典的网络模型值得我们去学习的 12.6 网络训练有哪些技巧 12.6.1 合适的数据集 12.6.2 合适的预…

【数据库】数据库脚本编写规范(Word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。

[图解]企业应用架构模式2024新译本讲解15-行数据入口

1 00:00:01,060 --> 00:00:02,770 数据算完了 2 00:00:03,070 --> 00:00:07,720 接下来就是我们这一节的主要内容了 3 00:00:08,500 --> 00:00:13,630 应用服务调用第三方的&#xff0c;Email 4 00:00:13,640 --> 00:00:18,280 包括集成应用的接口来发Email 5 …

Springboot获取resources中的文件

1.Springboot以文件的形式获取resources中的文件 import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import org.springframework.util.ResourceUtils; import j…

【Linux】进程信号2——阻塞信号,捕捉信号

1.阻塞信号 1.1. 信号其他相关常见概念 在开始内容之前&#xff0c;先介绍一些信号的专业名词&#xff1a; 实际执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;&#…

Swift Combine — zip和combineLatest的理解与使用

Publisher 上还有一些其他的操作&#xff0c;比如 zip 和 combineLatest&#xff0c;能让我们在时序上对控制多个 Publisher 的结果进行类似 and 和 or 的合并&#xff0c;它们在构建复杂 Publisher 逻辑时也十分有用。 zip Publisher 中的 zip 和 Sequence 的 zip 相类似&am…

【备考指南】CDA Level Ⅰ 最全备考攻略

很多考生朋友在报名前后&#xff0c;一直不知道需要怎么备考&#xff0c;这里给大家盘点一下最全的备考攻略&#xff0c;希望对你有用&#xff1a; 1、需要准备好之后再报名吗&#xff1f; 不需要&#xff0c;CDA认证考试是报名后自行预约考试的&#xff0c;您可以先报名同时…

qml:一个基础的界面设计

文章目录 文章说明效果图重要代码说明组件矩形卡片窗口最大化后组件全部居中菜单栏Repeater实现重复8行图片加载直接加载图片文本转图片FluentUI中可供选择的图标 文章说明 qt6.5.3 qml写的一个界面配置设计软件&#xff0c;目前不含任何c代码&#xff0c;纯qml。windoms风格的…

WebStorm 配置 PlantUML

1. 安装 PlantUML 插件 在 WebStorm 插件市场搜索 PlantUML Integration 并安装&#xff0c;重启 WebStorm 使插件生效。 2. 安装 Graphviz PlantUML 需要 Graphviz 来生成图形。使用 Homebrew 安装 Graphviz&#xff1a; 打开终端&#xff08;Terminal&#xff09;。确保你…

mac 常用工具命令集合

Iterm2 Command T&#xff1a;新建标签 Command W&#xff1a;关闭当前标签 Command ← →&#xff1a;在标签之间切换 Control U&#xff1a;清除当前行 Control A&#xff1a;跳转到行首 Control E&#xff1a;跳转到行尾 Command F&#xff1a;查找 Command …

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 &#xff08;1&#xff09;对称矩…

云渲染可以渲染SketchUp吗?

最近有很多人在问&#xff0c;云渲染可以渲染sketchup吗&#xff1f;答案是可以的&#xff0c;不过只有两三家支持&#xff0c;大部分云渲染是还是不支持的&#xff0c;今天就给大家介绍国内最新支持sketchup渲染的云渲染——炫云云渲染的使用方法。 炫云云渲染目前支持sketchu…

C++开发基础之频繁使用`std::endl`可能导致性能问题

前言 你是否曾经注意过这个问题&#xff0c;频繁使用std::endl可能导致性能问题。在C开发中&#xff0c;许多开发者习惯于使用std::endl来换行输出并刷新缓冲区。然而&#xff0c;这种习惯性操作可能会在高频率输出场景中带来显著的性能瓶颈。接下来&#xff0c;我们将深入探讨…

多模态大模型时代下的文档图像智能分析与处理

0. 前言 随着人工智能技术的不断发展&#xff0c;尤其是深度学习技术的广泛应用&#xff0c;多模态数据处理和大模型训练已成为当下研究的热点之一&#xff0c;这些技术也为文档图像智能处理和分析领域带来了新的发展机遇。 多模态大模型时代下的文档图像智能分析与处理的研究…

怎么使用Consul当配置中心和动态刷新配置

一、背景 由于Eureka官方已经正式宣布&#xff0c;自2.0起不再维护该项目&#xff0c;如果需要使用2.x&#xff0c;自行承担风险。 项目之前使用的Eureka&#xff0c;现在不维护了则需要寻找替代方案。现在Spring Cloud官方推荐Spring Cloud Consul替换Eureka作为注册中心&…

网络协议安全:TCP/IP协议栈的安全问题和解决方案

「作者简介」:北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖Web安全、系统安全等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道TCP/IP每…

openresty(Nginx) 301重定向域名 http访问强制使用https

1 访问http 2 修改配置访问 server {listen 80;server_name example.cn;return 301 https://$server_name$request_uri;access_log /data/logs/czgzzfjgsup_access.log access;error_log /data/logs/czgzzfjg_error.log error;#location / {root /usr/local/open…

领域驱动设计(DDD)微服务架构模式总结

part1. Domain Driven Design(Strategic Design,Tactical Design) Top Down focus on business or activityy domain Ubiquitous Language:统一语言 Tactical Design Tools&#xff1a;战术性设计工具 Implementing Domain Driven Design(Event storming,DDD in code) DDD总结…

大模型基础——从零实现一个Transformer(4)

大模型基础——从零实现一个Transformer(1)-CSDN博客 大模型基础——从零实现一个Transformer(2)-CSDN博客 大模型基础——从零实现一个Transformer(3)-CSDN博客 一、前言 上一篇文章已经把Encoder模块的单个EncodeBlock已经实现了 本文我们继续了解Transformer中剩下的其他…