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的用户权限管理。

    发表回复

    后才能评论