当前位置: 首页 > news >正文

批量跑脚本后自定义消息内容发送至钉钉--自定义发送到钉钉的消息内容


import requests
import json
import os
import time
import sys


def send_dingtalk_message(webhook_url, success_count, fail_count, fail_module, job_name, build_number, build_user, build_url):
"""
发送Markdown格式的钉钉通知消息,支持更丰富的排版样式
"""
# 获取当前时间
end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 计算总脚本数和成功率
total_scripts = success_count + fail_count
success_rate = f"{(success_count / total_scripts * 100):.1f}%" if total_scripts > 0 else "0%"

# 根据结果设置状态标识和颜色
if fail_count == 0:
status_text = "构建成功"
status_color = "green" # 绿色表示成功
status_emoji = "✅"
else:
status_text = "构建失败"
status_color = "red" # 红色表示失败
status_emoji = "❌"

# 构造Markdown内容(支持标题、加粗、颜色、列表等格式)
markdown_content = f"""
test

### {status_emoji} Jenkins构建通知 [{job_name}]

> **状态**:<font color="{status_color}">{status_text}</font>
> **构建编号**:#{build_number}

| 信息类型 | 详情 |
|----------------|--------------------------|
| 📌 项目名称 | {job_name} |
| 👤 构建人员 | {build_user} |
| ⏰ 结束时间 | {end_time} |
| 🖥 构建环境 | 老版本-预发布环境 |
| 🔗 报告链接 | [查看详细日志]({build_url})|

#### 构建结果统计
- 📈 总脚本数:{total_scripts} 个
- ✅ 成功脚本:{success_count} 个
- ❌ 失败脚本:{fail_count} 个
- ❌ 失败脚本:{fail_module}
- 📊 成功率:<font color="blue">{success_rate}</font>
""".strip() # 去除首尾空行

# 构造Markdown类型消息
message = {
"msgtype": "markdown",
"markdown": {
"title": f"Jenkins构建通知 - {job_name} #{build_number}", # 消息标题(通知栏显示)
"text": markdown_content
},
"at": {
"isAtAll": False # 不@所有人,如需@特定人可添加"atMobiles": ["手机号"]
}
}

headers = {"Content-Type": "application/json"}
# VPN代理
proxies = {"https": None}

try:
response = requests.post(
webhook_url,
headers=headers,
data=json.dumps(message),
proxies=proxies,
timeout=10
)
'''response.raise_for_status() 是一个 “主动报错” 的方法,用于显式检查 HTTP 请求是否成功,
避免错误的响应被静默处理。在需要确保请求成功的场景(如接口调用、数据爬取)中非常实用'''
response.raise_for_status()

result = response.json()
if result.get("errcode") == 0:
print("钉钉通知发送成功")
else:
print(f"钉钉通知发送失败: {result.get('errmsg')}")
return result

except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
return None


if __name__ == "__main__":
# 从环境变量获取构建信息
job_name = os.getenv("JOB_NAME", "未知项目")
build_number = os.getenv("BUILD_NUMBER", "0")
build_user = os.getenv("BUILD_USER", "debug")
# build_url = os.getenv("BUILD_URL", "#)
build_url = f'http://192.168.3.165:8080/jenkins/job/ceshi//{build_number}/console'

# jenkins-test钉钉内部群通知-0001
webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=9ac34e44f528d56d6cbd7d4a50ac6a25e8264750bd7401a3543a43c816c1816f"

# 初始化计数
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from case.game_scrip import success_count, fail_count, fail_files
success_count = success_count
fail_count = fail_count
fail_module = fail_files

send_dingtalk_message(webhook_url, success_count, fail_count, fail_module, job_name, build_number, build_user, build_url)
http://www.hskmm.com/?act=detail&tid=37305

相关文章:

  • 2025年10月国内北京黄金回收公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 在IntelliJ IDEA中采用Git
  • 国产化Excel开发组件Spire.XLS教程:在Python中将Pandas DataFrame导出到Excel的详细教程
  • 2025 年化工塑料桶生产厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 主流CI/CD工具选型指南:助力企业实现高效交付
  • 通过openwrt唤醒pc电脑
  • 图表控件Aspose.Diagram教程:在C#中将VSD转换为PDF
  • Gitee:中国开发者生态的数字化转型引擎
  • Windows 11 24H2 堆栈防护:从功能解析到实战配置
  • 2025年轴流风机品牌前十强排名及选购指南
  • 支持HART通信协议输入的16位DAC芯片TPC2201
  • 2025年陕西省基本农田调整技术服务品牌排名前十权威解析
  • 2025年陕西省基本农田调整技术服务公司排名前十权威解析
  • 2025.10.23 VP Record
  • 2025年英国留学服务商排行榜:Top 10权威推荐与选择指南
  • 2025年市面上信号灯品牌口碑推荐榜单:十大优质厂家综合评测
  • 2025年高压电缆品牌哪家好?鑫佰亿线缆权威推荐与选择指南
  • 2025年高压电缆品牌哪家好:鑫佰亿线缆全面评测与权威推荐
  • 2025年高压电缆品牌哪家好:鑫佰亿线缆权威推荐与选择指南
  • 硬件编写_基于STM32单片机的汽车急控优秀的系统
  • 升级windows 11 25h2的步骤(xjl456852原创)
  • 华为FusionCompute超融合上传ISO镜像方法教程
  • QMPlay 编译
  • 2025 氧气/氮气/工业/氩气/高纯/液态/气体公司推荐榜:港骅 5 星领跑,黄骅及周边全品类供应,这些细分领域服务商更懂生产需求
  • 【转载】cap,pcap文件中的ipv4数据包转成ipv6数据包
  • Linux 命令 - 教程
  • Java基础全面复盘:从入门到进阶的核心要点梳理
  • 【STM32H743IIT6 系列】通过 LTDC接口驱动的 TFTLCD(RGB屏)显示
  • 报表过滤框设置默认组织提示死循环
  • 第九章-NOP Team dmz-C