如何通过Curl向Slack频道发送自定义Jenkins通知?
搞定Curl发送Slack版本通知的小问题
嘿,我看你在尝试用curl给团队Slack频道发版本和S3链接的通知,脚本里有几个容易踩的小坑,我帮你梳理并修正,还优化了消息的可读性,让团队成员看起来更舒服~
先说说你当前脚本的几个问题
- JSON引号嵌套混乱:你写的payload里引号混用,导致JSON格式不合法,Slack根本无法识别;
- curl参数冲突:同时用了
--data-urlencode和-d,这两个参数不能同时使用,选其一即可; - 消息可读性差:直接把版本号和链接堆在一起,团队成员阅读费劲,不如用Slack支持的格式美化下。
修正后的完整脚本(推荐用这个,格式更专业)
# 定义版本变量 version=1.2.4 bundleversion=1.3.4.5 # 替换成你的实际S3链接 S3_LINK="https://your-bucket.s3.amazonaws.com/path/to/your-asset" # 用Slack的Blocks组件构造结构化消息,可读性拉满 SLACK_MSG=$(cat <<EOF { "text": "📢 新版本发布通知", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*版本详情*\n> 应用版本: \`$version\`\n> Bundle版本: \`$bundleversion\`" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "*下载地址*\n> S3直接访问: <$S3_LINK|点击跳转>" } } ] } EOF ) # 发送到你的Slack Webhook地址(替换成团队频道的专属Webhook) curl -H "Content-type: application/json" -X POST -d "$SLACK_MSG" "https://hooks.slack.com/services/XXX/XXX/XXX"
为啥这么写?给你拆解说清楚:
- Slack Webhook URL:这个必须替换成你团队频道的专属地址,去Slack的「Incoming Webhooks」应用里创建就能拿到,还能提前测试连通性;
- Blocks组件:Slack官方推荐的结构化消息方式,分块展示信息,比纯文本清爽太多,支持标题、分段、格式化文本;
- here-doc写法:用
<<EOF包裹JSON,避免了引号转义的麻烦,变量直接用$version就能嵌入,省心; - Markdown美化:用
*加粗标题、`包裹版本号(像代码一样醒目)、<链接|显示文本>把S3地址转成可点击的按钮,团队成员一点就跳。
要是嫌复杂,给你个简化版
如果不需要这么规整的结构,纯文本版本也能用,只是可读性稍差:
version=1.2.4 bundleversion=1.3.4.5 S3_LINK="https://your-bucket.s3.amazonaws.com/path/to/your-asset" SLACK_MSG='{ "text": "📢 新版本发布啦!\n- 应用版本: *'"$version"'*\n- Bundle版本: *'"$bundleversion"'*\n- S3下载链接: <'"$S3_LINK"'|点击直接访问>" }' curl -H "Content-type: application/json" -X POST -d "$SLACK_MSG" "https://hooks.slack.com/services/XXX/XXX/XXX"
最后给你几个排查小技巧
- 发送失败先查Webhook地址对不对,Slack的Webhook页面有测试按钮,先测通再写脚本;
- 验证JSON格式:装个
jq工具,用echo "$SLACK_MSG" | jq .检查,有语法错误会直接提示; - 看请求日志:curl加
-v参数,比如curl -v -H ...,能看到请求的详细过程,方便找问题。
内容的提问来源于stack exchange,提问作者kalyan




