十二、Jenkins构建完成发送飞书消息通知

news2024/11/11 8:13:54

十二、Jenkins构建完成发送飞书消息通知

1. 创建一个飞书webhook 群机器人

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
得到一个飞书webhook地址:
https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e

2. send_notice.py上传到jenkins服务器目录

send_notice.py最后面

在这里插入图片描述

代码send_notice.py中拿到Jenkins 引用变量参数,放到https://www.sojson.com/ 进行格式压缩

#Jenkins 引用变量参数 windows
argv_dic1={
        'BUILD_URL': '%BUILD_URL%',
        'JOB_NAME': '%JOB_NAME%[dev]',
        'BUILD_NUMBER': '%BUILD_NUMBER%',
        'SCM_CHANGELOG': '%SCM_CHANGELOG%',
        'SERVES_URL': 'http://192.168.1.22:8067,http://192.168.1.21:60081',
        'Package_URL': '%JOB_URL%ws/dist/*zip*/dist.zip',
        'WEBHOOK': 'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e',
        'version_file': r'%WORKSPACE%\public\version.txt',
        'BUILD_TIME':'%BUILD_TIMESTAMP%'
}

#Jenkins 引用变量参数 linux
argv_dic2={
	'BUILD_URL': '$BUILD_URL',
	'JOB_NAME': '$JOB_NAME[dev]',
	'BUILD_NUMBER': '$BUILD_NUMBER',
	'SCM_CHANGELOG': '$SCM_CHANGELOG',
	'SERVES_URL': 'http://192.168.1.22:8067,http://192.168.1.21:60081',
	'Package_URL': '${JOB_URL}ws/risk-pro/dist/*zip*/dist.zip',
	'WEBHOOK': 'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e',
	'version_file': r'${WORKSPACE}\risk-pro\public\version.txt',
	'BUILD_TIME': '${BUILD_TIMESTAMP}'
    }

在这里插入图片描述
得到一行参数,放到Jenkins中引用

{'BUILD_URL':'$BUILD_URL','JOB_NAME':'$JOB_NAME[dev]','BUILD_NUMBER':'$BUILD_NUMBER','SCM_CHANGELOG':'$SCM_CHANGELOG','SERVES_URL':'http://192.168.1.22:8067,http://192.168.1.21:60081','Package_URL':'${JOB_URL}ws/risk-pro/dist/*zip*/dist.zip','WEBHOOK':'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e','version_file':r'${WORKSPACE}\risk-pro\public\version.txt','BUILD_TIME':'${BUILD_TIMESTAMP}'}

3. Jenkins执行send_notice.py

【 Jenkins为linux服务器】Build Steps使用执行shell
在这里插入图片描述

notice="{'BUILD_URL':'$BUILD_URL','JOB_NAME':'$JOB_NAME[dev]','BUILD_NUMBER':'$BUILD_NUMBER','SCM_CHANGELOG':'$SCM_CHANGELOG','SERVES_URL':'http://192.168.1.202:8067,http://124.71.179.135:60081','Package_URL':'${JOB_URL}ws/risk-pro/dist/*zip*/dist.zip','WEBHOOK':'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e','version_file':r'${WORKSPACE}\risk-pro\public\version.txt','BUILD_TIME':'${BUILD_TIMESTAMP}'}"
python3 /usr/local/python3/jks/send_notice.py "$notice"

【 Jenkins为windows服务器】Build Steps使用执行shell
在这里插入图片描述

set notice="{'BUILD_URL':'%BUILD_URL%','JOB_NAME':'%JOB_NAME%[dev]','BUILD_NUMBER':'%BUILD_NUMBER%','SCM_CHANGELOG':'%SCM_CHANGELOG%','SERVES_URL':'http://192.168.1.22:8067,http://192.168.1.21:60081','Package_URL':'%JOB_URL%ws/dist/*zip*/dist.zip','WEBHOOK':'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e','version_file':r'%WORKSPACE%\public\version.txt','BUILD_TIME':'%BUILD_TIMESTAMP%'}"
python D:\anaconda\jks\send_notice.py %notice%

4. 飞书收到构建通知消息

在这里插入图片描述

5. send_notice.py 代码

send_notice.py 代码 需要上传Jenkins服务器

# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
File    : send_notice.py
Time    : 2023/4/6 15:19
author  : mojin
Email   : 397135766@qq.com
-------------------------------------------------------------------------------
"""



import requests
import sys

#测试参数
argv_dic={
        'BUILD_URL': 'http://192.168.1.234:8081/job/oprm/job/test20211026/132/',
        'JOB_NAME': 'test20211026[dev]',
        'BUILD_NUMBER': '132',
        'SCM_CHANGELOG': '统计数据置空(at 2023-04-13 09:14:38 via mojin)\n详情记录显示评价昵称(at 2023-04-13 10:31:57 via mojin)\n将Map<String, List<JzwRiskTagsIndexTemplate>>转为Map<String, List<JzwListTagObjVo>> 2个map的key相同 只是value中list对象的类型需要进行转换(at 2023-04-13 12:30:08 via mojin)\n',
        'SERVES_URL': 'http://192.168.1.22:8067,http://192.168.1.21:60081',
        'Package_URL': 'http://192.168.1.234:8081/job/oprm/job/test20211026/ws/dist/*zip*/dist.zip',
        'WEBHOOK': 'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e',
        'version_file': r'E:\Python\python3\zentao_report\new_version\version.txt',
        'BUILD_TIME':'2023-06-28 02:44:37'
}

#Jenkins 引用变量参数 windows
argv_dic1={
        'BUILD_URL': '%BUILD_URL%',
        'JOB_NAME': '%JOB_NAME%[dev]',
        'BUILD_NUMBER': '%BUILD_NUMBER%',
        'SCM_CHANGELOG': '%SCM_CHANGELOG%',
        'SERVES_URL': 'http://192.168.1.22:8067,http://192.168.1.21:60081',
        'Package_URL': '%JOB_URL%ws/dist/*zip*/dist.zip',
        'WEBHOOK': 'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e',
        'version_file': r'%WORKSPACE%\public\version.txt',
        'BUILD_TIME':'%BUILD_TIMESTAMP%'
}

#Jenkins 引用变量参数 linux
argv_dic2={
	'BUILD_URL': '$BUILD_URL',
	'JOB_NAME': '$JOB_NAME[dev]',
	'BUILD_NUMBER': '$BUILD_NUMBER',
	'SCM_CHANGELOG': '$SCM_CHANGELOG',
	'SERVES_URL': 'http://192.168.1.22:8067,http://192.168.1.21:60081',
	'Package_URL': '${JOB_URL}ws/risk-pro/dist/*zip*/dist.zip',
	'WEBHOOK': 'https://open.feishu.cn/open-apis/bot/v2/hook/2d0b6357-333a-4077-9fcd-61e361a3e51e',
	'version_file': r'${WORKSPACE}\risk-pro\public\version.txt',
	'BUILD_TIME': '${BUILD_TIMESTAMP}'
    }



class SendNotice():
    def __init__(self):
        self.INFO = eval(sys.argv[1])
        #self.INFO = argv_dic
        self.JOB_URL = self.INFO['BUILD_URL']  #项目地址路径
        self.JOB_NAME = self.INFO['JOB_NAME']  #项目名称
        self.BUILD_NUMBER = self.INFO['BUILD_NUMBER'] #构建次数
        self.BUILD_TIME = self.INFO['BUILD_TIME']  # 构建时间


        try:
            self.CHANGES = ''
            CHANGES_SINCE_LAST_SUCCESS= self.INFO['SCM_CHANGELOG'] # 变更内容
            #CHANGES_SINCE_LAST_SUCCESS=CHANGES_SINCE_LAST_SUCCESS.replace('[','').replace(']','')
            n=1
            for i in CHANGES_SINCE_LAST_SUCCESS.split('\n'):
                if i!='':
                    #self.CHANGES=self.CHANGES+f'{n}.{i}\n'
                    self.CHANGES = self.CHANGES + '{}.{}\n'.format(n, i)

                    n+=1
            if self.CHANGES!='':
                #self.CHANGES = f'变更记录:(AFS)\n{self.CHANGES}'
                self.CHANGES = '变更记录:(AFS\n {}'.format(self.CHANGES)
            else:

                self.CHANGES = '变更记录:(AFS)\n本次没有发生变化'


        except:
            self.CHANGES ='变更记录:(AFS)\n本次没有发生变化'

        try:
            self.SERVES_URL = self.INFO['SERVES_URL']
            self.URL_all='服务地址:(AFS)\n'
            n=1
            for URL in self.SERVES_URL.split(','):
                if URL != '':
                    self.URL_all=self.URL_all+'{}.{}\n'.format(n,URL)
                    n += 1
        except:
            self.URL_all=''

        self.Package_URL = self.INFO['Package_URL'] #打包的链接

        #self.currenttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        self.url = self.INFO['WEBHOOK'] #飞书 webhook地址
        self.version_file =self.INFO['version_file']
        try:
            with open(self.version_file, "r") as f:
                self.version_txt = f.read()
                print('读取到的版本号:{}'.format(self.version_txt))
        except Exception as e:
            print('没有读取到老版本号,出现异常({})'.format(e))
            self.version_txt = 'v.{}.{}'.format(self.BUILD_NUMBER,self.BUILD_TIME.replace(' ', '').replace('-', '').replace(':', ''))
            print('生成一个版本号[{}]'.format(self.version_txt))

        self.method = 'post'
        self.headers = {
            'Content-Type': 'application/json'
        }
        self.json = {
            "msg_type": "interactive",
            "card": {
                "config": {
                    "wide_screen_mode": True,
                    "enable_forward": True
                },
                "elements": [{
                    "tag": "div",
                    "text": {
                        "content": "项目名称:{}\n".format(self.JOB_NAME)+
                                   "构建编号:第{}次构建\n".format(self.BUILD_NUMBER)+
                                   "构建时间:{}\n".format(self.BUILD_TIME)+
                                   "版本信息:{}\n".format(self.version_txt)+
                                   "{}\n".format(self.URL_all)+
                                   "{}\n".format(self.CHANGES),
                        "tag": "lark_md"
                    }
                }, {
                    "actions": [{
                        "tag": "button",
                        "text": {
                            "content": "查看报告",
                            "tag": "lark_md"
                        },
                        "url": self.JOB_URL,
                        "type": "default",
                        "value": {}
                    },
                        {
                            "tag": "button",
                            "text": {
                                "content": "下载包",
                                "tag": "lark_md"
                            },
                            "url": self.Package_URL,
                            "type": "default",
                            "value": {}
                        }
                    ],
                    "tag": "action"
                }],
                "header": {
                    "title": {
                        "content": self.JOB_NAME + " 构建报告",
                        "tag": "plain_text"
                    }
                }
            }
        }

    def send_feishu(self):

        requests.request(method=self.method, url=self.url, headers=self.headers, json=self.json)

if __name__ == '__main__':
    SendNotice().send_feishu()




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动硬盘中安装Ubuntu 20.04系统——立省99%的问题

目录 关于我为什么要在移动硬盘中装系统 准备工作 开始安装 磁盘分区 创建虚拟机 关于我为什么要在移动硬盘中装系统 (6条消息) 笔记本安装双系统ubuntu时踩的坑——戴尔_放风筝的猪的博客-CSDN博客 准备工作 1.移动硬盘 2.Ubuntu镜像 3.VMware虚拟机 Ubuntu镜像可以从…

Linux查看版本号,lsb_releasa过时了,得用uname -a

突然想查看Linux版本号了 然后终端输入lsb_release,结果给我报错No LSB modules are available. 然后网上一查发现Linux 版本是 Ubuntu 11.1.0 或更高版本,则 lsb_release 命令可能已经被弃用。 这是由于 lsb-release 命令已经不再维护,并且由于安全问题而被移除。 因此,对于…

基于matlab使用迭代最近点算法组合多个点云以重建三维场景(附源码)

一、前言 此示例演示如何使用迭代最近点 &#xff08;ICP&#xff09; 算法组合多个点云以重建三维场景。 此示例将使用 Kinect 捕获的点云集合拼接在一起&#xff0c;以构建场景的更大三维视图。该示例将 ICP 应用于两个连续的点云。这种类型的重建可用于开发对象的 3D 模型…

关于Realvnc远程Aero效果异常解决方案

默认安装realvnc server后&#xff0c;远程时如下图所示&#xff0c;windows areo效果丢失且提示“配色方案已经更改为windows 7 basic”&#xff1b; 解决方案&#xff1a;取消勾选&#xff0c;user mirror drive to capture screen 在远程时效果恢复如下&#xff1a;

类中的函数重载

函数重载回顾 函数重载的本质为相互独立的不同函数 C 中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的成员函数可以进行重载 构造函数的重载 普通成员函数的重载 静态成员函数的重载 问题 全局…

微软发布「升级版」多模态大模型 Kosmos-2!新增局部理解能力,解锁实体级交互

夕小瑶科技说 原创 作者 | 小戏、ZenMoore 三个多月前&#xff0c;微软亚洲研究院在论文《Language Is Not All You Need: Aligning Perception with Language Models》中发布了一个强大的多模态大模型 Kosmos-1&#xff0c;成功将感知与语言对齐&#xff0c;在 ChatGPT 的多…

C#串口通信从入门到精通(26)——多个串口多个线程发送数据和接收数据

前言 我们在开发串口程序的过程中有时候会遇到多个串口,并且多个串口也需要在多个线程进行操作,本文就来讲解如何实现多个串口在多线程下的安全发送与接收。 1、操作界面与测试过程 我们首先使用虚拟串口助手虚拟COM1、COM2这一对串口;COM3、COM4这一对串口,然后使用代码…

小黑子—MySQL数据库:第二章 - 进阶篇

MySQL数据库入门2.0 MySQL进阶篇1. MySQL体系结构2. 存储引擎2.1 InnoDB 存储引擎2.2 MyISAM 存储引擎2.3 Memory 存储引擎2.4 存储引擎选择2.5 MySQL安装Linux版本 3. 索引3.1 索引结构3.1.1 B tree3.1.2 B tree3.1.3 Hash 3.2 索引分类3.2.1 思考题 3.3 索引语法3.4 SQL性能分…

docker jenkins 安装

使用 Docker 安装 Jenkins 并实现项目自动化部署-阿里云开发者社区 (aliyun.com)https://developer.aliyun.com/article/892646#slide-1运行镜像命令&#xff1a; docker run \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -d \ -v /home/admin/SoftWare/volume/jenkin…

CSS 内容盒子

这章比较重要&#xff0c;会不断更新❗ 文章目录 内容盒子开发者工具的使用border 边框padding 内边距margin 外边距盒子整体尺寸元素默认样式与CSS重置元素分类块级标记行级标记行内块标记 display样式内容溢出裁剪掉溢出部分滚动条 圆角边框 border-radius 内容盒子 提示&am…

云原生之使用Docker部署Firefox浏览器

云原生之使用Docker部署Firefox浏览器 一、Firefox浏览器介绍1.1 Firefox简介1.2 Firefox特点 二、本次实践介绍2.1 本地环境规划2.2 本次实践简介 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Firefox镜像五、部署Firefox5…

M7615DNA M7455DNF M7675DXF安装网络打印驱动方法

注意&#xff1a;网络驱动安装首先需要把打印机接入到网络设备上&#xff0c;例如接到路由器或者交换机。 1、访问联想官方网站下载驱动或者使用机器随机自带光盘。 2、下载驱动后解压&#xff0c;如图&#xff1a; 3、运行解压后驱动包内的install文件夹里的相应打印机型号&am…

【云原生】软件架构的演进以及各个架构的优缺点

文章目录 1. 什么是软件架构?2. 单机架构3. 应用数据分离架构4. 应用服务集群架构5. 读写分离架构6. 冷热分离架构7.垂直分库架构8. 微服务架构9. 容器编排架构10. 小结 1. 什么是软件架构? 软件架构是指在设计和构建软件系统时&#xff0c;对系统的组织结构、组件、模块、接…

数据竞赛复现代码的 Docker 镜像制作指南

文章目录 一、前言二、主要内容1. Docker Desktop&#xff1f;2. VMware17 CentOS Linux Xshell 三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 主要的要求&#xff1a; 通过 Dockerfile 文件创建 Docker 镜像&#xff0c;数据…

Python初学-记录与Java基本语法不同的地方

这里写目录标题 条件与循环If条件语句for循环while循环 数学复数随机数 序列字符串列表与元组一些方法&#xff1a; 字典 条件与循环 If条件语句 在python里基础结构为if&#xff0c;elif&#xff0c;else&#xff0c;并且执行语句是在冒号后面的&#xff0c;Java是if&#x…

(小程序)基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板

(小程序)基于uniappvite4vue3搭建跨端项目|uni-appuview-plus模板 版本信息&#xff1a; HBuilderX: 3.8.4 Vite: 4.2.1 uView-Plus: 3.1.31一、创建uniappvue3项目&#xff1a; 点击编辑器的文件 > 新建 > 项目&#xff08;快捷键CtrlN&#xff09; 2.选择uni-app项目&…

一点基础、但一直没分清的概念2023/06/28

文章目录 1.export和export default的区别2.npm和cnpm的区别3.npm run dev/serve的区别4.slice、splice和split的区别 1.export和export default的区别 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输…

【Windows】Windows 如何查看已连接过WiFi的密码

文章目录 方式一、使用命令行查看方式二、使用PowerShell 查看方式三、使用网络适配查看 方式一、使用命令行查看 CtrlShiftEsc 打开任务管理器 打开新建任务对话框 在任务管理器界面&#xff0c;找到第一个菜单文件(F)点击运行新任务(N)。 新建cmd任务 打开(O):cmd     …

SpringBoot+VUE实现文件导入并将其保存到Liunx系统

SpringBootVUE实现文件导入 一、需求二、前端代码实现2.1 显示实现2.1.1 a标签实现2.1.1.1 上传标签实现2.1.1.2 查看标签实现 2.2 上传文件和文件查看界面实现2.2.1 上传文件界面2.2.1.1 上传文件界面展示部分2.2.1.1 上传文件界面逻辑部分 2.2.2 查看文件界面2.2.2.1 查看文件…

一步一步学OAK之二: RGB相机控制

今天我们来实现 RGB相机的控制程序&#xff0c;用来控制彩色相机的曝光、灵敏度、白平衡、亮度/色度降噪、 设备端裁剪、相机触发器等。 目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 全局变量Setup 5: 定义clamp函数Setup 6: 创建pipelineSetup 7:…