Jenkins入门教程(十三):配置邮件和通知
及时的构建通知可以帮助团队快速响应问题。本文将详细介绍Jenkins的邮件和各种通知配置,包括完整的设置步骤和Pipeline示例。
配置SMTP服务器
进入系统管理 > 系统配置,找到"邮件通知"部分:
# SMTP服务器配置示例
# Gmail
SMTP服务器: smtp.gmail.com
使用SMTP认证: 勾选
用户名: your-email@gmail.com
密码: your-app-password # 需要使用应用专用密码
使用SSL: 勾选
SMTP端口: 465
# 企业邮箱
SMTP服务器: smtp.example.com
使用SMTP认证: 勾选
用户名: jenkins@example.com
密码: your-password
使用TLS: 勾选
SMTP端口: 587
# 发件人邮箱
系统管理员邮件地址: jenkins@example.com
# 测试配置
点击"通过发送测试邮件测试配置"
Test e-mail recipient: your-email@example.com
点击"Test configuration"
Email Extension插件
Email Extension插件提供了比默认邮件更强大的功能:
# 安装插件
系统管理 > 插件管理 > 搜索 "Email Extension"
# 配置 Extended E-mail Notification
系统管理 > 系统配置 > Extended E-mail Notification
SMTP server: smtp.example.com
SMTP Port: 587
凭据: 添加用户名密码凭据
Use SSL: 根据需要
Default Content Type: HTML (text/html)
Default Recipients: team@example.com
Default Subject: Jenkins Build: $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
Default Content: ${SCRIPT, template="groovy-html.template"}
在Pipeline中发送邮件
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make build'
}
}
stage('Test') {
steps {
sh 'make test'
}
}
}
post {
success {
emailext(
subject: "✅ 构建成功: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: '''
构建成功!
项目: ${PROJECT_NAME}
构建编号: ${BUILD_NUMBER}
构建URL: ${BUILD_URL}
Git提交: ${GIT_COMMIT}
Git分支: ${GIT_BRANCH}
变更记录:
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%m (%a) "}
''',
to: 'team@example.com',
mimeType: 'text/html'
)
}
failure {
emailext(
subject: "❌ 构建失败: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: '''
构建失败!
项目: ${PROJECT_NAME}
构建编号: ${BUILD_NUMBER}
构建URL: ${BUILD_URL}
控制台输出: ${BUILD_URL}console
错误日志:
${BUILD_LOG, maxLines=50, escapeHtml=true}
''',
to: 'team@example.com,${DEFAULT_RECIPIENTS}',
mimeType: 'text/html',
attachLog: true // 附加完整日志
)
}
unstable {
emailext(
subject: "⚠️ 构建不稳定: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: '测试失败,请检查: ${BUILD_URL}',
to: 'team@example.com'
)
}
}
}
邮件模板
# 创建自定义邮件模板
# /var/lib/jenkins/email-templates/build-notification.html
Jenkins 构建通知
${PROJECT_NAME} - Build #${BUILD_NUMBER}
状态 ${BUILD_STATUS}
分支 ${GIT_BRANCH}
提交 ${GIT_COMMIT}
作者 ${GIT_AUTHOR_NAME}
耗时 ${BUILD_DURATION}
# 在Pipeline中使用模板
emailext(
subject: "Build ${BUILD_STATUS}: ${JOB_NAME} #${BUILD_NUMBER}",
body: '${SCRIPT, template="build-notification.html"}',
to: 'team@example.com',
mimeType: 'text/html'
)
Slack通知
# 1. 安装Slack Notification插件
# 2. 创建Slack App并获取Webhook URL
# https://api.slack.com/apps > Create New App
# Incoming Webhooks > Add New Webhook to Workspace
# 选择频道 > 复制Webhook URL
# 3. 配置Jenkins
# 系统管理 > 系统配置 > Slack
Workspace: your-workspace
Credential: 添加Secret text凭据,值为Bot Token或Webhook URL
Default channel: #devops-alerts
# 4. Pipeline中使用
pipeline {
agent any
stages {
stage('Build') {
steps {
slackSend(
channel: '#devops',
color: 'warning',
message: "构建开始: ${env.JOB_NAME} #${env.BUILD_NUMBER}\n${env.BUILD_URL}"
)
sh 'make build'
}
}
}
post {
success {
slackSend(
channel: '#devops',
color: 'good',
message: "✅ 构建成功: ${env.JOB_NAME} #${env.BUILD_NUMBER}\n分支: ${env.GIT_BRANCH}\n${env.BUILD_URL}"
)
}
failure {
slackSend(
channel: '#devops',
color: 'danger',
message: "❌ 构建失败: ${env.JOB_NAME} #${env.BUILD_NUMBER}\n分支: ${env.GIT_BRANCH}\n${env.BUILD_URL}console"
)
}
}
}
// Slack消息颜色
// 'good' - 绿色
// 'warning' - 黄色
// 'danger' - 红色
// '#439FE0' - 自定义颜色
钉钉通知
# 1. 安装DingTalk插件
# 2. 创建钉钉群机器人
# 群设置 > 智能群助手 > 添加机器人 > 自定义机器人
# 安全设置选择"加签",记录签名密钥和Webhook地址
# 3. 配置Jenkins
# 系统管理 > 系统配置 > 钉钉
# 添加机器人,填写Webhook和签名密钥
# 4. Pipeline中使用
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make build'
}
}
}
post {
success {
dingtalk(
robot: 'jenkins-bot',
type: 'MARKDOWN',
title: '构建成功',
text: [
"### ✅ 构建成功",
"- **项目**: ${JOB_NAME}",
"- **构建号**: ${BUILD_NUMBER}",
"- **分支**: ${GIT_BRANCH}",
"- **耗时**: ${currentBuild.durationString}",
"",
"[查看详情](${BUILD_URL})"
]
)
}
failure {
dingtalk(
robot: 'jenkins-bot',
type: 'MARKDOWN',
title: '构建失败',
text: [
"### ❌ 构建失败",
"- **项目**: ${JOB_NAME}",
"- **构建号**: ${BUILD_NUMBER}",
"- **分支**: ${GIT_BRANCH}",
"",
"[查看日志](${BUILD_URL}console)"
],
at: ['13800138000'] // @手机号
)
}
}
}
# 也可以直接调用Webhook API
sh '''
curl -X POST 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "markdown",
"markdown": {
"title": "Jenkins通知",
"text": "### 构建成功\n- 项目: my-job\n- 构建号: 123"
}
}'
'''
企业微信通知
# 1. 安装Qy Wechat Notification插件
# 2. 创建企业微信群机器人
# 群聊 > 添加群机器人 > 新建机器人
# 复制Webhook地址
# 3. 直接在Pipeline中调用
pipeline {
agent any
environment {
WECHAT_WEBHOOK = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx'
}
stages {
stage('Build') {
steps {
sh 'make build'
}
}
}
post {
success {
sh '''
curl -X POST "${WECHAT_WEBHOOK}" \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "markdown",
"markdown": {
"content": "### ✅ 构建成功\n>项目: '"${JOB_NAME}"'\n>构建号: '"${BUILD_NUMBER}"'\n>分支: '"${GIT_BRANCH}"'\n>[查看详情]('"${BUILD_URL}"')"
}
}'
'''
}
failure {
sh '''
curl -X POST "${WECHAT_WEBHOOK}" \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "markdown",
"markdown": {
"content": "### ❌ 构建失败\n>项目: '"${JOB_NAME}"'\n>构建号: '"${BUILD_NUMBER}"'\n><@all>\n>[查看日志]('"${BUILD_URL}console"')"
}
}'
'''
}
}
}
完整通知示例
pipeline {
agent any
options {
timestamps()
}
stages {
stage('Build') {
steps {
sh 'make build'
}
}
stage('Test') {
steps {
sh 'make test'
}
}
stage('Deploy') {
steps {
sh './deploy.sh'
}
}
}
post {
always {
echo "Pipeline完成,状态: ${currentBuild.currentResult}"
}
success {
script {
def message = """
✅ *构建成功*
*项目:* ${env.JOB_NAME}
*构建号:* #${env.BUILD_NUMBER}
*分支:* ${env.GIT_BRANCH}
*提交:* ${env.GIT_COMMIT?.take(7)}
*耗时:* ${currentBuild.durationString.replace(' and counting', '')}
*链接:* ${env.BUILD_URL}
"""
// 发送多个通知
slackSend(color: 'good', message: message)
emailext(
subject: "✅ 构建成功: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: message,
to: 'team@example.com'
)
}
}
failure {
script {
def message = """
❌ *构建失败*
*项目:* ${env.JOB_NAME}
*构建号:* #${env.BUILD_NUMBER}
*分支:* ${env.GIT_BRANCH}
*日志:* ${env.BUILD_URL}console
"""
slackSend(color: 'danger', message: message)
emailext(
subject: "❌ 构建失败: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: message,
to: 'team@example.com',
attachLog: true
)
}
}
}
}
通知最佳实践
- 避免通知疲劳:成功时可选通知,失败时必须通知
- 包含关键信息:项目名、构建号、分支、链接
- 快速恢复时通知:从失败恢复成功时发送通知
- @相关人员:失败时@提交者或负责人
- 使用不同渠道:紧急问题用即时通讯,日常用邮件
总结
本文详细介绍了Jenkins的各种通知方式,包括邮件、Slack、钉钉和企业微信。及时的通知可以帮助团队快速响应问题。
下一篇我们将学习Jenkins的用户权限管理。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







