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: 465 或 TLS: 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) 设计一个“发布完成”通知模板,包含制品地址、环境、回滚指引链接。