Github
在 CI/CD 流程中,构建失败、部署完成、安全扫描告警等关键事件往往需要第一时间通知到相关人员。将 EngageLab SMS 集成到 GitHub Actions,可以在 Workflow 的任意节点触发短信通知,确保团队成员无论是否在线都能及时感知系统状态。
前置条件
开始前,请确认以下配置已完成:
EngageLab 侧
- 已开通 EngageLab SMS 服务
- 已在模板管理页面创建短信模板并通过审核,获取模板 ID
- 已在 API 密钥页面创建 API 密钥,获取
dev_key和dev_secret
GitHub 侧
- 拥有目标仓库的管理员权限,可配置 Repository Secrets
第一步:准备短信模板
调用 API 发送短信必须使用预审核通过的模板,不支持直接传入自定义文本。
登录 EngageLab 控制台,进入 SMS → 模板管理,新建模板。以部署通知为例,模板内容可设计为:
【{{sign}}】您好,仓库 {{repo}} 于 {{time}} {{status}},Commit:{{commit}}。
模板提交后等待审核通过,记录模板 ID(如 deploy-notify-template)。
建议:为「部署成功」和「部署失败」分别创建独立模板,语义更清晰,审核通过率也更高。
第二步:配置 GitHub Secrets
为避免将密钥硬编码到 Workflow 文件中,需将敏感信息存储到 GitHub Repository Secrets。
进入仓库页面,依次点击 Settings → Secrets and variables → Actions → New repository secret,逐一添加以下变量:
| Secret 名称 | 说明 |
|---|---|
ENGAGELAB_DEV_KEY |
EngageLab API 密钥页面的 dev_key |
ENGAGELAB_DEV_SECRET |
对应的 dev_secret |
ENGAGELAB_TEMPLATE_SUCCESS |
部署成功通知的模板 ID |
ENGAGELAB_TEMPLATE_FAILURE |
部署失败通知的模板 ID |
ON_CALL_PHONE |
接收通知的手机号,需含国家代码,如 +8618701235678 |
第三步:在 Workflow 中添加通知步骤
EngageLab SMS API 采用 HTTP Basic 认证,鉴权字符串由 base64(dev_key:dev_secret) 生成。以下为完整的 Workflow 示例:
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build and test
run: |
npm install
npm test
- name: Deploy
run: ./deploy.sh
- name: Notify success via EngageLab SMS
if: success()
run: |
AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
curl -s -X POST https://smsapi.engagelab.com/v1/messages \
-H "Content-Type: application/json" \
-H "Authorization: Basic ${AUTH}" \
-d '{
"to": ["${{ secrets.ON_CALL_PHONE }}"],
"template": {
"id": "${{ secrets.ENGAGELAB_TEMPLATE_SUCCESS }}",
"params": {
"repo": "${{ github.repository }}",
"commit": "${{ github.sha }}",
"status": "部署成功",
"time": "'"$(date '+%Y-%m-%d %H:%M')"'"
}
}
}'
- name: Notify failure via EngageLab SMS
if: failure()
run: |
AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
curl -s -X POST https://smsapi.engagelab.com/v1/messages \
-H "Content-Type: application/json" \
-H "Authorization: Basic ${AUTH}" \
-d '{
"to": ["${{ secrets.ON_CALL_PHONE }}"],
"template": {
"id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}",
"params": {
"repo": "${{ github.repository }}",
"commit": "${{ github.sha }}",
"status": "部署失败",
"time": "'"$(date '+%Y-%m-%d %H:%M')"'"
}
}
}'
关键参数说明
| 参数 | 说明 |
|---|---|
if: success() |
仅在当前 Job 所有前置步骤均成功时执行 |
if: failure() |
仅在当前 Job 任意步骤失败时执行 |
github.repository |
GitHub 内置变量,格式为 owner/repo |
github.sha |
触发本次 Workflow 的 Commit SHA |
date '+%Y-%m-%d %H:%M' |
获取 Runner 当前时间,默认为 UTC 时区 |
注意:
date命令获取的是 GitHub Actions Runner 的系统时间(UTC),若需要显示本地时区时间,请在命令前设置TZ环境变量,例如:TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M'。
扩展场景
通知多位接收人
将 to 字段改为数组,可同时向多个手机号发送:
-d '{
"to": [
"${{ secrets.ON_CALL_PHONE }}",
"${{ secrets.TEAM_LEAD_PHONE }}"
],
"template": {
"id": "${{ secrets.ENGAGELAB_TEMPLATE_FAILURE }}",
"params": {
"repo": "${{ github.repository }}",
"commit": "${{ github.sha }}",
"status": "部署失败",
"time": "'"$(date '+%Y-%m-%d %H:%M')"'"
}
}
}'
安全扫描告警
在包含安全扫描步骤的 Workflow 中,发现高危漏洞时立即通知:
- name: Security scan
id: security
run: ./run-security-scan.sh
- name: Notify security alert via SMS
if: steps.security.outputs.high_severity == 'true'
run: |
AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
curl -s -X POST https://smsapi.engagelab.com/v1/messages \
-H "Content-Type: application/json" \
-H "Authorization: Basic ${AUTH}" \
-d '{
"to": ["${{ secrets.SECURITY_TEAM_PHONE }}"],
"template": {
"id": "${{ secrets.ENGAGELAB_TEMPLATE_SECURITY }}",
"params": {
"repo": "${{ github.repository }}",
"time": "'"$(date '+%Y-%m-%d %H:%M')"'"
}
}
}'
定时任务执行结果播报
对于通过 schedule 触发的定时 Workflow(如每日数据同步、定期备份),执行完成后发送汇总短信:
on:
schedule:
- cron: '0 2 * * *' # 每天 UTC 02:00 执行
jobs:
daily-sync:
runs-on: ubuntu-latest
steps:
- name: Run daily sync
run: ./daily-sync.sh
- name: Notify result via SMS
if: always()
run: |
STATUS=${{ job.status }}
AUTH=$(echo -n "${{ secrets.ENGAGELAB_DEV_KEY }}:${{ secrets.ENGAGELAB_DEV_SECRET }}" | base64)
curl -s -X POST https://smsapi.engagelab.com/v1/messages \
-H "Content-Type: application/json" \
-H "Authorization: Basic ${AUTH}" \
-d '{
"to": ["${{ secrets.ON_CALL_PHONE }}"],
"template": {
"id": "${{ secrets.ENGAGELAB_TEMPLATE_DAILY }}",
"params": {
"repo": "${{ github.repository }}",
"status": "'"${STATUS}"'",
"time": "'"$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M')"'"
}
}
}'
if: always()表示无论步骤成功或失败均执行,适合需要保证通知必达的场景。
注意事项
- 模板必须审核通过后方可使用。调用时若模板处于待审核或审核拒绝状态,API 将返回
4001错误。 - 手机号格式需含国家代码,如中国大陆号码应写为
+8618701235678,不含+或国家代码会导致发送失败。 - 鉴权字符串在每次请求时动态生成,无需提前存储 Base64 编码后的结果,直接通过
echo -n "key:secret" | base64实时计算即可。 - API 返回 HTTP 200 并不代表短信发送成功,请检查响应体中的
code字段,code为0或不存在时表示正常,非零时参考错误码说明排查原因。 - 避免在日志中泄露密钥,不要在
run步骤中直接echo输出AUTH变量内容。
