推荐使用钉钉而非slack发送部署通知,因其生态稳定、加签机制成熟且国内网络兼容性好;需通过加签构造含timestamp、sign的webhook url,并用shell封装curl发送函数实现文本消息与@人员功能。

Linux下用Shell脚本配合curl向钉钉或Slack发部署通知,核心是构造合法HTTP请求,关键是安全配置和消息格式。Slack已逐步弱化Webhook支持,当前更推荐钉钉——生态稳定、文档清晰、加签机制成熟,且国内网络兼容性好。
一、钉钉机器人创建与安全配置
在目标钉钉群中点击右上角「…」→「群机器人」→「添加机器人」→选择「自定义」。安全设置三选一,建议用「加签」方式(比关键词/IP白名单更可靠):
- 记录生成的webhook URL(含access_token)和secret密钥
- 加签需时间戳+密钥生成sign,shell中用openssl实现:
timestamp=$(date +%s%3N)sign=$(echo -n "${timestamp}\n${secret}" | openssl dgst -sha256 -hmac "${secret}" -binary | base64) - 最终请求URL为:
https://oapi.dingtalk.com/robot/send?access_token=xxx×tamp=${timestamp}&sign=${encoded_sign}
二、Shell脚本封装通用发送函数
避免每次重复拼接,把发送逻辑封装成可复用函数。以下为支持文本+@人员的精简版:
#!/bin/bash
send_to_dingding() {
local msg="$1"
local at_mobiles="${2:-}"
local timestamp=$(date +%s%3N)
local secret='SECxxxxxxxxxxxxxxxxxxxxx'
local sign=$(echo -n "${timestamp}\n${secret}" | openssl dgst -sha256 -hmac "${secret}" -binary | base64 | sed 's/+/%2B/g; s/\//%2F/g; s/=/%3D/g')
local webhook="https://oapi.dingtalk.com/robot/send?access_token=xxx×tamp=${timestamp}&sign=${sign}"
<p>local payload=$(cat </p><p>curl -X POST "$webhook" \
-H 'Content-Type: application/json' \
-d "$payload" >/dev/null 2>&1
}</p><h1>调用示例:部署成功后通知</h1><p>send_to_dingding "✅ 部署完成 | 服务: api-gateway | 环境: prod | 提交: $(git rev-parse --short HEAD)" '"186****1234"'
</p>
三、集成到部署流程(如Git Hook或CI脚本)
将脚本放入部署链路末端,确保只在关键节点触发。常见做法:
- 放在CI/CD的「Deploy」阶段末尾,用exit code判断成败:
if [ $? -eq 0 ]; then send_to_dingding "? 部署成功"; else send_to_dingding "⚠️ 部署失败,请检查流水线"; fi - 若用Git Hooks(如post-receive),在同步代码后直接调用脚本
- 注意权限:脚本需有执行权限(
chmod +x notify.sh),且运行用户能访问git、curl、openssl
四、Slack适配说明(仅作参考)
Slack Webhook仍可用,但需注意:
- Webhook地址格式为:
https://hooks.slack.com/services/Txxx/Bxxx/xxx - 不支持加签,仅靠URL保密,建议限制IP或配合Slack App升级
- 消息体为纯JSON,无at功能,格式更简单:
{"text":"部署完成","username":"deploy-bot","icon_emoji":":rocket:"} - 因Slack策略收紧,生产环境建议优先迁移到钉钉或企业微信











