Logo Site EngageLab Mark Colored Transparent文档
搜索

Github

在 CI/CD 流程中,构建失败、部署完成、安全扫描告警等关键事件往往需要第一时间通知到相关人员。将 EngageLab SMS 集成到 GitHub Actions,可以在 Workflow 的任意节点触发短信通知,确保团队成员无论是否在线都能及时感知系统状态。

前置条件

开始前,请确认以下配置已完成:

EngageLab 侧

  • 已开通 EngageLab SMS 服务
  • 已在模板管理页面创建短信模板并通过审核,获取模板 ID
  • 已在 API 密钥页面创建 API 密钥,获取 dev_keydev_secret

GitHub 侧

  • 拥有目标仓库的管理员权限,可配置 Repository Secrets

第一步:准备短信模板

调用 API 发送短信必须使用预审核通过的模板,不支持直接传入自定义文本。

登录 EngageLab 控制台,进入 SMS → 模板管理,新建模板。以部署通知为例,模板内容可设计为:

【{{sign}}】您好,仓库 {{repo}} 于 {{time}} {{status}},Commit:{{commit}}。
              
              {{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')"'" } } }'
              
              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')"'" } } }'
              
              -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')"'" } } }'
              
              - 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')"'" } } }'
              
              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() 表示无论步骤成功或失败均执行,适合需要保证通知必达的场景。

注意事项

  1. 模板必须审核通过后方可使用。调用时若模板处于待审核或审核拒绝状态,API 将返回 4001 错误。
  2. 手机号格式需含国家代码,如中国大陆号码应写为 +8618701235678,不含 + 或国家代码会导致发送失败。
  3. 鉴权字符串在每次请求时动态生成,无需提前存储 Base64 编码后的结果,直接通过 echo -n "key:secret" | base64 实时计算即可。
  4. API 返回 HTTP 200 并不代表短信发送成功,请检查响应体中的 code 字段,code0 或不存在时表示正常,非零时参考错误码说明排查原因。
  5. 避免在日志中泄露密钥,不要在 run 步骤中直接 echo 输出 AUTH 变量内容。
Icon Solid Transparent White Qiyu
联系销售