无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
相关产品推荐
相关产品推荐

