You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无Slack权限时,如何通过Webhook从Jenkins发送构建通知?

使用Webhook从Jenkins向Slack发送自定义通知(无需Slack Notifier插件权限)

刚好之前帮同事解决过类似的需求——不用依赖官方插件,只要手里有Slack的Webhook URL,直接用Jenkins自带的工具发HTTP请求就能发送包含你要的所有信息的通知。下面分两种最常用的Jenkins项目类型给你详细说:

一、Pipeline项目(推荐,更灵活可控)

Pipeline是现在Jenkins的主流用法,用Groovy脚本可以很方便地获取构建上下文信息,然后构造Slack需要的JSON格式消息发送出去。

步骤1:安全存储Webhook URL

先把Slack的Webhook URL存到Jenkins的凭据里(避免明文暴露):

  • 进入Jenkins首页 → 凭据 → 系统 → 全局凭据 → 添加凭据
  • 选择「Secret text」类型,把Webhook URL粘贴进去,设置一个ID(比如slack_webhook_url),保存。

步骤2:编写Jenkinsfile脚本

下面是完整的示例脚本,包含了你要的所有字段,还做了异常场景处理(比如定时任务触发时没有用户的情况):

pipeline {
    agent any
    // 从凭据里读取Webhook URL
    environment {
        SLACK_WEBHOOK = credentials('slack_webhook_url')
    }
    stages {
        stage('你的构建阶段') {
            steps {
                // 这里替换成你实际的构建命令,比如mvn、npm、docker build等
                sh 'echo "执行构建任务..."'
            }
        }
    }
    // 不管构建成功/失败,都发送通知
    post {
        always {
            script {
                // 1. 获取触发用户:处理手动触发、定时任务、其他触发方式
                def triggerUser = "未知触发源"
                def buildCauses = currentBuild.getBuildCauses()
                if (buildCauses.size() > 0) {
                    // 手动触发的情况
                    if (buildCauses[0].userId) {
                        triggerUser = buildCauses[0].userId
                    }
                    // 定时任务/其他系统触发的情况
                    else if (buildCauses[0].shortDescription) {
                        triggerUser = buildCauses[0].shortDescription
                    }
                }

                // 2. 获取构建状态和错误原因
                def buildStatus = currentBuild.result ?: "SUCCESS"
                def errorReason = ""
                if (buildStatus == "FAILURE") {
                    // 取最后50行日志作为错误原因,可根据需要调整行数
                    errorReason = currentBuild.rawBuild.getLog(50).join("\n")
                }

                // 3. 构造Slack消息的JSON Payload
                def slackPayload = """
                {
                    "text": "📢 Jenkins构建通知",
                    "attachments": [
                        {
                            "color": "${buildStatus == 'SUCCESS' ? 'good' : 'danger'}",
                            "fields": [
                                {
                                    "title": "任务名称",
                                    "value": "${env.JOB_NAME}",
                                    "short": true
                                },
                                {
                                    "title": "构建链接",
                                    "value": "<${env.BUILD_URL}|点击查看详情>",
                                    "short": true
                                },
                                {
                                    "title": "触发用户",
                                    "value": "${triggerUser}",
                                    "short": true
                                },
                                {
                                    "title": "构建状态",
                                    "value": "*${buildStatus}*",
                                    "short": true
                                }
                                ${errorReason ? ',{"title": "错误原因","value": "```' + errorReason + '```"}' : ''}
                            ]
                        }
                    ]
                }
                """.trim()

                // 4. 发送请求到Slack Webhook
                sh """
                    curl -X POST -H 'Content-type: application/json' --data '$slackPayload' $SLACK_WEBHOOK
                """
            }
        }
    }
}

关键点说明:

  • 用post { always {} }确保不管构建结果如何都发送通知;
  • Slack的attachments可以让消息排版更美观,color字段用绿色(good)标记成功,红色(danger)标记失败;
  • 错误原因用Slack的代码块格式(```包裹),日志显示更清晰;
  • 处理了不同触发源的用户显示问题,避免出现空白。

二、自由风格项目

如果你的项目还是用自由风格,也可以通过构建后步骤的shell命令实现:

步骤1:同样存储Webhook URL到凭据

和Pipeline的步骤1一样,把Webhook URL存为Secret text凭据,然后在项目配置里引用这个凭据(在「构建环境」里勾选「使用秘密文本或文件」,选择对应的凭据,设置环境变量名比如SLACK_WEBHOOK)。

步骤2:添加构建后执行shell脚本

在「构建后操作」里添加「Execute shell」,粘贴下面的脚本(Linux环境,Windows环境可以改成batch命令,逻辑类似):

#!/bin/bash

# 1. 处理触发用户:如果是定时任务,BUILD_USER_ID为空,显示"定时任务触发"
TRIGGER_USER=${BUILD_USER_ID:-"定时任务触发"}

# 2. 获取构建状态和错误原因
BUILD_STATUS=${BUILD_STATUS:-SUCCESS}
ERROR_REASON=""
if [ "$BUILD_STATUS" = "FAILURE" ]; then
    # 取最后50行日志作为错误原因
    ERROR_REASON=$(tail -50 "$BUILD_LOG_FILE")
fi

# 3. 构造JSON Payload
PAYLOAD=$(cat <<EOF
{
    "text": "📢 Jenkins构建通知",
    "attachments": [
        {
            "color": "$([ "$BUILD_STATUS" = "SUCCESS" ] && echo "good" || echo "danger")",
            "fields": [
                {
                    "title": "任务名称",
                    "value": "$JOB_NAME",
                    "short": true
                },
                {
                    "title": "构建链接",
                    "value": "<$BUILD_URL|点击查看详情>",
                    "short": true
                },
                {
                    "title": "触发用户",
                    "value": "$TRIGGER_USER",
                    "short": true
                },
                {
                    "title": "构建状态",
                    "value": "*$BUILD_STATUS*",
                    "short": true
                }
                $( [ -n "$ERROR_REASON" ] && echo ',{"title": "错误原因","value": "```'"$ERROR_REASON"'```"}' )
            ]
        }
    ]
}
EOF
)

# 4. 发送请求到Slack
curl -X POST -H "Content-Type: application/json" -d "$PAYLOAD" "$SLACK_WEBHOOK"

注意事项:

  • 如果Jenkins节点无法直接访问Slack的Webhook地址,需要给curl加代理参数:curl -X POST --proxy http://你的代理地址:端口 ...;
  • 如果日志里有特殊字符(比如双引号、换行),可能需要用sed做转义处理,避免JSON格式错误;
  • 自由风格里的BUILD_STATUS可以通过「Conditional BuildStep」插件来判断,或者直接用Jenkins的内置环境变量。

内容的提问来源于stack exchange,提问作者Firdaus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:03:45