如何在Jenkins多分支流水线中实现Microsoft Teams用户@提及通知
解决Jenkins Office365 Connector插件在Teams中有效提及用户的问题
我之前也碰到过这个问题!Teams里的@提及可不是随便打个@就行的,它需要遵循特定的格式才能触发通知,咱们来一步步解决:
为什么你的@不生效?
Teams的消息系统不会识别纯文本的@${user},它需要明确的用户标识(比如用户主体名称UPN或者Teams用户ID)配合特定的语法,才能定位到用户并推送通知。
方法一:用插件内置的mentions参数(最简单)
Office365 Connector插件其实自带了提及功能,你不需要在message里手动写@,而是单独配置mentions参数。关键是要传入用户的**UPN(比如user@yourdomain.com)**或者Teams用户ID,而不是单纯的用户名。
示例代码:
office365ConnectorSend( message: "Started ${env.JOB_NAME} ${env.BUILD_NUMBER} committed by [View on Jenkins](${env.BUILD_URL})", webhookUrl: url, mentions: [ [ id: "user@yourdomain.com", // 替换成用户的UPN或Teams用户ID mentionType: "person", text: "@${user}" // 消息中显示的提及文本 ] ] )
注意事项:
- UPN是最可靠的标识(通常是用户的邮箱),可以从Azure AD或用户的Teams个人资料里找到(更多选项>查看组织资料>用户主体名称)。
- 如果你的Jenkins里
${user}是用户名而不是UPN,可能需要做一个映射(比如用字典把用户名转换成对应的UPN)。
方法二:构造自适应卡片(更灵活)
如果需要更复杂的消息排版,可以直接构造Teams自适应卡片,在卡片里嵌入提及元素。这种方式能实现更多自定义样式,同时保证提及生效。
示例代码:
// 构造提及对象 def userMention = [ type: "Mention", text: "<at>${user}</at>", mentioned: [ id: "user@yourdomain.com", // 用户的UPN或Teams用户ID name: "${user}" ] ] // 构造自适应卡片 def adaptiveCard = [ type: "AdaptiveCard", version: "1.0", body: [ [ type: "TextBlock", text: "Started ${env.JOB_NAME} ${env.BUILD_NUMBER} committed by ${userMention.text} [View on Jenkins](${env.BUILD_URL})", wrap: true ] ], msteams: [ entities: [userMention] ] ] // 发送卡片 office365ConnectorSend( webhookUrl: url, body: new groovy.json.JsonBuilder(adaptiveCard).toString(), contentType: "application/json" )
这个方法里,我们把提及对象加入到msteams.entities数组中,同时在文本里用<at>标签包裹用户名,Teams就能正确识别并触发用户的通知提醒了。
内容的提问来源于stack exchange,提问作者Nick Otten
相关产品推荐
相关产品推荐

