18.6.6 通知与协作插件

本节聚焦 Jenkins 通知与协作插件的选型与落地实践,目标是让构建、测试、发布结果可被及时感知并推动协作闭环。通知插件承担“事件触发—消息投递—责任人确认”的链路,需要与流水线状态、环境、变更信息深度结合,避免信息噪音与误报。

通知体系原理草图(流程与回写):

文章图片

常用插件类型与适用场景:
- Email Extension:用于邮件通知、失败告警与发布报告,支持模板与条件化发送,适合正式发布与审计留痕。
- Slack/Mattermost/钉钉/企业微信/飞书:面向即时协作,适合构建失败、回滚、发布完成等高频事件推送。
- Jira/GitHub/GitLab:将构建状态回写到 Issue/PR/MR,支持自动评论与状态标识,形成研发协作闭环。
- Office 365 Connector/Teams:企业办公协作通知与审批流触达。

安装与启用(以 Email Extension + 钉钉为例)#

插件安装(CLI 或 Web):

# Jenkins CLI 安装插件(需要管理员权限)
JENKINS_URL="http://jenkins.example.com"
java -jar jenkins-cli.jar -s $JENKINS_URL -auth admin:password install-plugin email-ext dingtalk
# 安装后重启
java -jar jenkins-cli.jar -s $JENKINS_URL -auth admin:password safe-restart

全局配置(邮件):
- 系统管理 → 系统配置 → E-mail Notification
- 系统管理 → 系统配置 → Extended E-mail Notification
关键项示例:

SMTP server: smtp.example.com
Default user e-mail suffix: @example.com
Advanced: Use SMTP Authentication -> user/pass
Use SSL: 465TLS: 587
Default Subject: [Jenkins] ${JOB_NAME} #${BUILD_NUMBER} - ${BUILD_STATUS}

钉钉机器人配置示例(系统管理 → 系统配置 → DingTalk):

机器人 Webhook: https://oapi.dingtalk.com/robot/send?access_token=xxx
签名密钥: xxxx(如启用签名)

Pipeline 示例(成功/失败/不稳定通知 + 责任人定位)#

示例说明:将通知逻辑放在 post 块,失败优先定向给触发人;成功仅摘要推送到群。

pipeline {
  agent any
  environment {
    APP = "order-service"
    ENV = "prod"
  }
  stages {
    stage('Build') {
      steps {
        sh 'mvn -q -DskipTests package'
      }
    }
    stage('Test') {
      steps {
        sh 'mvn -q test'
      }
    }
  }
  post {
    success {
      emailext(
        to: "release@example.com",
        subject: "[SUCCESS] ${env.JOB_NAME} #${env.BUILD_NUMBER}",
        body: """构建成功
APP: ${env.APP}
ENV: ${env.ENV}
BRANCH: ${env.BRANCH_NAME}
COMMIT: ${env.GIT_COMMIT}
URL: ${env.BUILD_URL}
"""
      )
      dingtalk(
        robot: 'dingtalk-ops',
        type: 'MARKDOWN',
        title: "✅ 构建成功 ${env.JOB_NAME} #${env.BUILD_NUMBER}",
        text: """- APP: ${env.APP}
- ENV: ${env.ENV}
- BRANCH: ${env.BRANCH_NAME}
- COMMIT: ${env.GIT_COMMIT}
- URL: ${env.BUILD_URL}
"""
      )
    }
    failure {
      // 失败优先通知触发人 + 责任人
      emailext(
        recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']],
        subject: "[FAILURE] ${env.JOB_NAME} #${env.BUILD_NUMBER}",
        body: """构建失败
APP: ${env.APP}
ENV: ${env.ENV}
BRANCH: ${env.BRANCH_NAME}
COMMIT: ${env.GIT_COMMIT}
LOG: ${env.BUILD_URL}console
"""
      )
      dingtalk(
        robot: 'dingtalk-ops',
        type: 'MARKDOWN',
        title: "❌ 构建失败 ${env.JOB_NAME} #${env.BUILD_NUMBER}",
        text: """@all
- APP: ${env.APP}
- ENV: ${env.ENV}
- BRANCH: ${env.BRANCH_NAME}
- COMMIT: ${env.GIT_COMMIT}
- LOG: ${env.BUILD_URL}console
"""
      )
    }
    unstable {
      dingtalk(
        robot: 'dingtalk-ops',
        type: 'MARKDOWN',
        title: "⚠️ 构建不稳定 ${env.JOB_NAME} #${env.BUILD_NUMBER}",
        text: "- 请检查测试用例失败或质量门禁"
      )
    }
    always {
      // 将通知逻辑封装成共享库函数更易统一管理
      echo "通知处理完成"
    }
  }
}

关键命令与变量解释:

${BUILD_URL}       当前构建的 URL,建议用于日志跳转
${BRANCH_NAME}     构建分支名,便于识别主干/功能分支
${GIT_COMMIT}      提交哈希,用于回溯变更
DevelopersRecipientProvider  最近提交者
RequesterRecipientProvider   构建触发者

典型场景:回写 GitLab 状态#

目的:构建结果回写到 Merge Request,形成研发闭环。

post {
  success {
    gitlabCommitStatus(name: 'jenkins-ci', state: 'success')
  }
  failure {
    gitlabCommitStatus(name: 'jenkins-ci', state: 'failed')
  }
}

典型场景:消息模板化(共享库示例)#

共享库文件:vars/notify.groovy

def send(result, msg) {
  dingtalk(robot: 'dingtalk-ops', type: 'MARKDOWN',
           title: "${result} ${env.JOB_NAME} #${env.BUILD_NUMBER}",
           text: msg)
}
return this

Pipeline 使用:

post {
  failure {
    notify.send("❌ FAILURE", """- APP: ${env.APP}
- URL: ${env.BUILD_URL}
""")
  }
}

排错与诊断#

1) 邮件无法发送

# 查看 Jenkins 日志
tail -f /var/log/jenkins/jenkins.log

# 常见错误:535 Authentication failed
# 处理:核对 SMTP 账号密码,邮箱开启 SMTP/授权码

2) 钉钉/飞书通知无响应

检查项:
- Webhook 是否正确,是否启用签名
- 机器人安全设置是否限制 IP
- Jenkins 节点是否能访问外网

3) 通知过载/刷屏

建议:
- 仅对 main/master/release 分支发送成功通知
- 失败通知只发责任人与值班群
- 引入告警聚合或静默时间窗口

练习#

1) 配置 Email Extension,要求失败邮件包含日志链接与提交人。
2) 在 Pipeline 中仅对 main 分支发送成功通知,其它分支只在失败时通知。
3) 将通知逻辑封装成共享库函数,统一模板并在两个流水线中复用。
4) 设计一个“发布完成”通知模板,包含制品地址、环境、回滚指引链接。