Jenkins:为Jenkins流水线实现自动化通知
Jenkins流水线步骤状态推送Teams频道的最佳实现方案
下面是几个经过实践验证的最佳方案,你可以根据团队的技术栈和需求选择:
方案一:使用Jenkins Microsoft Teams官方插件
这是最直接的方案,利用Jenkins官方维护的插件实现通知,配置成本低。
步骤:
- 在Jenkins插件市场安装
Microsoft Teams Notification插件 - 在Teams目标频道中创建传入Webhook,复制生成的Webhook URL
- 在Jenkins系统配置中,添加Teams服务端点,填入Webhook URL
- 在流水线中调用
teamsSendNotification方法,在每个部署步骤的开始、成功、失败阶段发送通知
流水线示例:
pipeline { agent any stages { stage('部署环境准备') { steps { script { // 发送步骤启动通知 teamsSendNotification( title: "部署步骤启动: 环境准备", text: "流水线 `${env.JOB_NAME}` 开始执行环境准备步骤,构建号: ${env.BUILD_NUMBER}", color: "0078D7" // 蓝色标识进行中 ) // 实际部署操作 sh "echo 执行环境准备操作..." // 发送步骤成功通知 teamsSendNotification( title: "部署步骤完成: 环境准备", text: "流水线 `${env.JOB_NAME}` 环境准备步骤执行成功,构建号: ${env.BUILD_NUMBER}", color: "00CC66" // 绿色标识成功 ) } } post { failure { // 步骤失败时发送通知 teamsSendNotification( title: "部署步骤失败: 环境准备", text: "流水线 `${env.JOB_NAME}` 环境准备步骤执行失败,构建号: ${env.BUILD_NUMBER}\n失败原因: ${currentBuild.currentResult}", color: "FF4444" // 红色标识失败 ) } } } // 其他部署步骤可复用上述逻辑 } }
优缺点:
- 优点:配置简单,官方维护稳定,无需自行处理HTTP请求
- 缺点:消息格式定制化程度有限,复杂卡片(如带按钮、图片)需要额外配置
方案二:直接调用Teams Incoming Webhook API
如果需要高度自定义通知内容,或者不想依赖插件,可以直接通过HTTP请求调用Teams的Webhook API。
步骤:
- 在Teams目标频道创建传入Webhook,复制Webhook URL
- 在Jenkins中把Webhook URL存入凭据存储(避免硬编码)
- 在流水线中封装通知函数,通过
curl或httpRequest步骤发送JSON格式的消息卡片
流水线示例:
pipeline { agent any environment { // 从Jenkins凭据中获取Webhook地址 TEAMS_WEBHOOK_URL = credentials('teams-deploy-webhook') } stages { stage('应用部署') { steps { script { // 发送启动通知 sendTeamsNotification("部署步骤启动: 应用部署", "流水线 `${env.JOB_NAME}` 开始部署应用,构建号: ${env.BUILD_NUMBER}", "0078D7") // 实际部署操作 sh "echo 执行应用部署..." // 发送成功通知 sendTeamsNotification("部署步骤完成: 应用部署", "流水线 `${env.JOB_NAME}` 应用部署成功,构建号: ${env.BUILD_NUMBER}", "00CC66") } } post { failure { // 失败时发送通知 sendTeamsNotification("部署步骤失败: 应用部署", "流水线 `${env.JOB_NAME}` 应用部署失败,构建号: ${env.BUILD_NUMBER}\n失败原因: ${currentBuild.currentResult}", "FF4444") } } } } } // 封装通知函数 def sendTeamsNotification(String title, String text, String color) { def messageCard = """ { "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "${color}", "summary": "${title}", "sections": [ { "activityTitle": "${title}", "activitySubtitle": "${text}", "markdown": true } ] } """ // 用curl发送请求 sh """ curl -H "Content-Type: application/json" -d '${messageCard}' ${TEAMS_WEBHOOK_URL} """ }
优缺点:
- 优点:完全自定义消息格式,支持复杂Teams卡片(如添加操作按钮、图片、多段落内容),无插件依赖
- 缺点:需要自行处理HTTP请求逻辑,出错时排查成本略高
方案三:封装Jenkins共享库(适合多流水线场景)
如果团队有多个部署流水线,建议把Teams通知逻辑封装到Jenkins共享库中,实现代码复用,统一维护通知规则。
步骤:
- 搭建Jenkins共享库(将代码托管到Git仓库)
- 在共享库的
vars目录下创建sendTeamsNotification.groovy文件,写入通知逻辑 - 在Jenkins系统配置中添加共享库
- 各个流水线中引入共享库,直接调用通知函数
共享库文件示例(vars/sendTeamsNotification.groovy):
def call(Map params) { def title = params.title def text = params.text def color = params.color ?: "0078D7" def webhookUrl = env.TEAMS_WEBHOOK_URL def messageCard = """ { "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "${color}", "summary": "${title}", "sections": [ { "activityTitle": "${title}", "activitySubtitle": "${text}", "markdown": true } ] } """ sh """ curl -H "Content-Type: application/json" -d '${messageCard}' ${webhookUrl} """ }
流水线调用示例:
// 引入共享库 @Library('jenkins-shared-libs') _ pipeline { agent any environment { TEAMS_WEBHOOK_URL = credentials('teams-deploy-webhook') } stages { stage('数据库升级') { steps { script { sendTeamsNotification( title: "部署步骤启动: 数据库升级", text: "流水线 `${env.JOB_NAME}` 开始数据库升级,构建号: ${env.BUILD_NUMBER}", color: "0078D7" ) sh "echo 执行数据库升级操作..." sendTeamsNotification( title: "部署步骤完成: 数据库升级", text: "流水线 `${env.JOB_NAME}` 数据库升级成功,构建号: ${env.BUILD_NUMBER}", color: "00CC66" ) } } post { failure { sendTeamsNotification( title: "部署步骤失败: 数据库升级", text: "流水线 `${env.JOB_NAME}` 数据库升级失败,构建号: ${env.BUILD_NUMBER}\n失败原因: ${currentBuild.currentResult}", color: "FF4444" ) } } } } }
优缺点:
- 优点:通知逻辑统一维护,多流水线复用,减少重复代码,便于后续扩展
- 缺点:需要搭建和维护共享库,适合有一定Jenkins运维经验的团队
内容的提问来源于stack exchange,提问作者OCGeek
相关产品推荐
相关产品推荐

