Jenkins邮件与通知配置 - 第一时间掌握构建状态

Jenkins邮件与通知配置

一、前言

构建完成了,但你不知道?部署失败了,但你没看到?这些问题都可以通过通知来解决。及时的通知是CI/CD流程中不可或缺的一环——它让你第一时间知道构建状态,快速响应问题。本文将介绍Jenkins中各种通知方式的配置。

二、邮件通知

邮件是最基础也是最通用的通知方式。

2.1 配置SMTP服务器

进入 Manage Jenkins → System,找到"Extended E-mail Notification"和"Email Notification"部分。

QQ邮箱配置示例

SMTP服务器: smtp.qq.com
SMTP端口: 465 (SSL) 或 587 (TLS)
用户名: your-email@qq.com
密码: 你的QQ邮箱授权码(不是QQ密码!)

获取QQ邮箱授权码:
1. 登录QQ邮箱 → 设置 → 账户
2. 找到POP3/SMTP服务,点击开启
3. 按提示用手机发短信获取授权码

163邮箱配置

SMTP服务器: smtp.163.com
SMTP端口: 465 (SSL)
用户名: your-email@163.com
密码: 163邮箱授权码

企业微信/钉钉邮箱

SMTP服务器: smtp.exmail.qq.com
SMTP端口: 465 (SSL)

勾选"Test configuration by sending test e-mail",填入收件邮箱,点击Test测试是否配置成功。

2.2 Extended Email插件(推荐)

安装 Email Extension Plugin,功能比Jenkins自带的邮件通知强大很多。

在Pipeline中使用:

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
    
    post {
        success {
            emailext(
                subject: "✅ 构建成功: ${JOB_NAME} #${BUILD_NUMBER}",
                body: """
                <h2>构建成功</h2>
                <p>项目: ${JOB_NAME}</p>
                <p>构建号: #${BUILD_NUMBER}</p>
                <p>持续时间: ${currentBuild.durationString}</p>
                <p><a href="${BUILD_URL}">查看构建详情</a></p>
                """,
                to: 'team@company.com',
                mimeType: 'text/html'
            )
        }
        
        failure {
            emailext(
                subject: "❌ 构建失败: ${JOB_NAME} #${BUILD_NUMBER}",
                body: """
                <h2>构建失败</h2>
                <p>项目: ${JOB_NAME}</p>
                <p>构建号: #${BUILD_NUMBER}</p>
                <p>请尽快检查!</p>
                <p><a href="${BUILD_URL}console">查看控制台日志</a></p>
                """,
                to: 'team@company.com',
                mimeType: 'text/html'
            )
        }
    }
}

2.3 邮件模板

可以创建自定义邮件模板,让通知更美观。在Jenkins Home目录下创建模板文件:

<!-- $JENKINS_HOME/email-templates/build-status.groovy -->
<html>
<body>
<table width="100%" cellpadding="10">
  <tr>
    <td style="background: <%= build.result == 'SUCCESS' ? '#4CAF50' : '#f44336' %>; color: white;">
      <h2><%= build.result == 'SUCCESS' ? '✅ 构建成功' : '❌ 构建失败' %></h2>
    </td>
  </tr>
</table>
<table cellpadding="5">
  <tr><td><b>项目</b></td><td>${project.name}</td></tr>
  <tr><td><b>构建号</b></td><td>#${build.number}</td></tr>
  <tr><td><b>分支</b></td><td>${env.BRANCH_NAME}</td></tr>
  <tr><td><b>持续时间</b></td><td>${build.durationString}</td></tr>
  <tr><td><b>触发者</b></td><td>${build.causes[0].shortDescription}</td></tr>
</table>
<p><a href="${build.url}">查看构建详情</a> | 
   <a href="${build.url}console">查看控制台日志</a></p>
</body>
</html>

三、钉钉通知

钉钉是国内最常用的企业通讯工具之一,Jenkins可以通过Webhook发送钉钉通知。

3.1 创建钉钉机器人

步骤:

  • 1. 打开钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义
  • 2. 机器人名称:Jenkins构建通知
  • 3. 安全设置:选择"加签"方式,复制签名(SEC开头的字符串)
  • 4. 复制Webhook URL

3.2 使用DingTalk插件

安装 DingTalk Plugin,然后配置:

进入 Manage Jenkins → System,找到"DingTalk"部分:

  • 添加机器人,填写Webhook URL和签名
  • 配置通知策略(何时发送通知)

在Pipeline中使用:

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
    
    post {
        success {
            dingtalk(
                robot: 'jenkins-robot',
                type: 'MARKDOWN',
                title: '构建成功',
                text: [
                    "### ✅ 构建成功",
                    "- 项目: ${JOB_NAME}",
                    "- 构建号: #${BUILD_NUMBER}",
                    "- 持续时间: ${currentBuild.durationString}",
                    "- [查看详情](${BUILD_URL})"
                ]
            )
        }
        failure {
            dingtalk(
                robot: 'jenkins-robot',
                type: 'MARKDOWN',
                title: '构建失败',
                text: [
                    "### ❌ 构建失败",
                    "- 项目: ${JOB_NAME}",
                    "- 构建号: #${BUILD_NUMBER}",
                    "- [查看日志](${BUILD_URL}console)"
                ],
                atAll: false
            )
        }
    }
}

3.3 手动发送钉钉消息

不安装插件,用Shell脚本直接发送:

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
    
    post {
        always {
            script {
                def status = currentBuild.currentResult == 'SUCCESS' ? '✅ 成功' : '❌ 失败'
                def webhookUrl = 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
                
                sh """
                curl -s '${webhookUrl}' \\
                  -H 'Content-Type: application/json' \\
                  -d '{
                    "msgtype": "markdown",
                    "markdown": {
                      "title": "Jenkins构建通知",
                      "text": "### Jenkins构建${status}\\n\\n- 项目: ${JOB_NAME}\\n- 构建号: #${BUILD_NUMBER}\\n- [查看详情](${BUILD_URL})"
                    }
                  }'
                """
            }
        }
    }
}

四、企业微信通知

和钉钉类似,企业微信也支持Webhook机器人。

4.1 创建企业微信机器人

  • 1. 打开企业微信群 → 添加群机器人
  • 2. 复制Webhook URL

4.2 发送企业微信通知

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
    
    post {
        always {
            script {
                def status = currentBuild.currentResult == 'SUCCESS' ? '✅ 成功' : '❌ 失败'
                def webhookUrl = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY'
                
                sh """
                curl -s '${webhookUrl}' \\
                  -H 'Content-Type: application/json' \\
                  -d '{
                    "msgtype": "markdown",
                    "markdown": {
                      "content": "### Jenkins构建${status}\\n> 项目: ${JOB_NAME}\\n> 构建号: #${BUILD_NUMBER}\\n> [查看详情](${BUILD_URL})"
                    }
                  }'
                """
            }
        }
    }
}

五、Slack通知

如果你的团队使用Slack,可以集成Slack通知。

安装 Slack Notification Plugin

pipeline {
    agent any
    
    post {
        success {
            slackSend(
                color: 'good',
                message: "✅ 构建成功: ${JOB_NAME} #${BUILD_NUMBER} (${currentBuild.durationString})"
            )
        }
        failure {
            slackSend(
                color: 'danger',
                message: "❌ 构建失败: ${JOB_NAME} #${BUILD_NUMBER} - ${BUILD_URL}console"
            )
        }
    }
}

六、飞书通知

飞书也支持Webhook机器人通知:

pipeline {
    agent any
    
    post {
        always {
            script {
                def status = currentBuild.currentResult == 'SUCCESS' ? '✅ 成功' : '❌ 失败'
                def color = currentBuild.currentResult == 'SUCCESS' ? 'green' : 'red'
                def webhookUrl = 'https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_HOOK_ID'
                
                sh """
                curl -s -X POST '${webhookUrl}' \\
                  -H 'Content-Type: application/json' \\
                  -d '{
                    "msg_type": "interactive",
                    "card": {
                      "header": {
                        "title": {
                          "tag": "plain_text",
                          "content": "Jenkins构建通知"
                        },
                        "template": "${color}"
                      },
                      "elements": [
                        {
                          "tag": "div",
                          "text": {
                            "tag": "lark_md",
                            "content": "**状态**: ${status}\\n**项目**: ${JOB_NAME}\\n**构建号**: #${BUILD_NUMBER}\\n**持续时间**: ${currentBuild.durationString}"
                          }
                        },
                        {
                          "tag": "action",
                          "actions": [
                            {
                              "tag": "button",
                              "text": {
                                "tag": "plain_text",
                                "content": "查看详情"
                              },
                              "url": "${BUILD_URL}",
                              "type": "primary"
                            }
                          ]
                        }
                      ]
                    }
                  }'
                """
            }
        }
    }
}

七、HTTP通知(通用方式)

如果你的通知系统不在上面列出的,可以用HTTP请求的方式发送通知:

pipeline {
    agent any
    
    post {
        always {
            script {
                def payload = """
                {
                    "project": "${JOB_NAME}",
                    "build_number": "${BUILD_NUMBER}",
                    "status": "${currentBuild.currentResult}",
                    "duration": "${currentBuild.durationString}",
                    "url": "${BUILD_URL}",
                    "branch": "${env.BRANCH_NAME ?: 'N/A'}"
                }
                """
                
                // 发送到自定义通知系统
                sh "curl -s -X POST https://notify.company.com/jenkins \
                  -H 'Content-Type: application/json' \
                  -d '${payload}'"
            }
        }
    }
}

八、构建状态徽章

可以在项目README中显示Jenkins构建状态徽章:

# Markdown格式
![Jenkins Build Status](http://jenkins-server:8080/buildStatus/icon?job=your-job-name)

# 带分支参数
![Jenkins Build Status](http://jenkins-server:8080/buildStatus/icon?job=your-job-name&branch=main)

九、通知最佳实践

  • 不要过度通知:每次构建都发通知会让团队疲劳,只在失败和首次成功时通知
  • 通知包含关键信息:项目名、构建号、状态、持续时间、链接
  • 失败通知要醒目:用红色标记、@相关人员
  • 提供快速操作链接:直接链接到构建日志,方便排查
  • 按团队分组通知:不同项目的通知发到不同的群
  • 区分环境:生产部署失败的通知要更紧急
// 只在状态变化时通知
post {
    changed {
        script {
            if (currentBuild.currentResult == 'SUCCESS') {
                // 之前失败现在成功了
                emailext subject: "🎉 构建恢复正常: ${JOB_NAME}",
                    body: "之前失败的构建现在成功了!",
                    to: 'team@company.com'
            }
        }
    }
}

十、总结

本文详细介绍了Jenkins的各种通知方式:

  • 邮件通知:最通用,Extended Email插件功能强大
  • 钉钉通知:国内最常用,支持Markdown格式
  • 企业微信通知:类似钉钉,Webhook方式
  • Slack通知:海外团队首选
  • 飞书通知:支持丰富的卡片消息
  • 通用HTTP通知:适合自定义通知系统
  • 构建徽章:在README中展示构建状态

选择适合你团队的通知方式,让CI/CD流程透明可控!

发表回复

后才能评论