如何通过Webhook实现Azure Container Registry新镜像推送时向MS Teams频道发通知
报错根因
MS Teams 传入Webhook对请求Payload格式有强制要求,最少需要包含text字段,而Azure Container Registry(ACR)默认触发的Webhook原生Payload不符合Teams的格式规范,因此直接推送会返回Text is missing报错。同时ACR目前暂不支持直接自定义Webhook的Payload结构,必须通过中间转换层处理。
解决方案
你可以通过Azure内置的无服务组件完成Payload转换,无需额外搭建服务,操作步骤如下:
- 第一步:创建格式转换服务,推荐用Azure Function HTTP触发器,核心逻辑示例(Python):
import azure.functions as func import json import requests def main(req: func.HttpRequest) -> func.HttpResponse: # 解析ACR推送的原始事件数据 acr_event = req.get_json() # 按需提取ACR事件字段,可根据需要扩展更多字段 event_action = acr_event['action'] image_repo = acr_event['target']['repository'] image_tag = acr_event['target']['tag'] operator = acr_event['actor']['name'] trigger_time = acr_event['timestamp'] # 构造符合Teams要求的Payload teams_msg = { "text": f"ACR新镜像操作通知:\n操作类型:{event_action}\n镜像仓库:{image_repo}\n镜像标签:{image_tag}\n操作人:{operator}\n触发时间:{trigger_time}" } # 替换为你自己的Teams传入Webhook地址 teams_webhook = "你的Teams Webhook地址" requests.post(teams_webhook, json=teams_msg) return func.HttpResponse("通知已转发", status_code=200)
- 第二步:进入ACR控制台,创建新的Webhook,触发事件选择
push(新镜像推送事件),Webhook地址填写上一步创建的Azure Function触发地址。 - 第三步:测试推送任意镜像到ACR,验证Teams频道是否可以正常收到通知。
自定义Payload扩展方式
你可以直接从ACR的原始事件Payload中提取所有需要的字段,添加到Teams的text字段中即可。如果需要更丰富的卡片样式,也可以将Teams Payload替换为自适应卡片结构,把提取到的ACR字段填充到对应卡片组件中。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

