GitHub

CI/CD のワークフローでは、ビルド失敗、デプロイ完了、セキュリティスキャンのアラートなど、重要な出来事を関係者にすぐ知らせる必要があることがよくあります。GitHub Actions に EngageLab SMS を組み込むと、Workflow の任意のタイミングで SMS 通知を送れ、オンラインでなくてもメンバーがシステムの状態を把握できます。

前提条件

始める前に、次の設定が済んでいることを確認してください。

EngageLab 側

  • EngageLab SMS が有効になっていること
  • テンプレート管理で SMS テンプレートを作成し承認済みであること。テンプレート ID を取得済みであること
  • API Keys ページで API キーを作成し、dev_keydev_secret を取得済みであること

GitHub 側

  • 対象リポジトリの管理者権限があり、Repository Secrets を設定できること

ステップ 1: SMS テンプレートの準備

API 経由の送信には事前承認済みテンプレートが必要で、自由文をそのまま送ることはできません。

EngageLab コンソールにログインし、SMS → テンプレート管理へ進み、新しいテンプレートを作成します。デプロイ通知の例として、テンプレート本文は次のようになります。

【{{sign}}】Hello, repository {{repo}} {{status}} at {{time}}, Commit: {{commit}}.
              
              {{sign}}】Hello, repository {{repo}} {{status}} at {{time}}, Commit: {{commit}}.

            
このコードブロックはフローティングウィンドウ内に表示されます

テンプレートを提出したら承認を待ち、テンプレート ID(例: deploy-notify-template)を控えます。

ヒント: 「デプロイ成功」と「デプロイ失敗」でテンプレートを分けると意図が明確になり、承認されやすくなります。

ステップ 2: GitHub Secrets の設定

Workflow ファイルにシークレットを直書きしないよう、GitHub の Repository Secrets に保存します。

リポジトリの Settings → Secrets and variables → Actions → New repository secret から、次を順に追加します。

シークレット名 説明
ENGAGELAB_DEV_KEY EngageLab の API Keys ページの dev_key
ENGAGELAB_DEV_SECRET 対応する dev_secret
ENGAGELAB_TEMPLATE_SUCCESS デプロイ成功通知用のテンプレート ID
ENGAGELAB_TEMPLATE_FAILURE デプロイ失敗通知用のテンプレート ID
ON_CALL_PHONE 通知先電話番号。国番号を含めること。例: +8618701235678

ステップ 3: 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": "deployed successfully", "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": "deployment failed", "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": "deployed successfully",
                  "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": "deployment failed",
                  "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

            
このコードブロックはフローティングウィンドウ内に表示されます

主要パラメーター参照

パラメーター 説明
if: success() 現在の Job 内の先行ステップがすべて成功したときだけ実行
if: failure() 現在の Job 内のいずれかのステップが失敗したときだけ実行
github.repository GitHub 組み込み変数。owner/repo 形式
github.sha この Workflow をトリガーしたコミットの 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": "deployment failed", "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": "deployment failed",
      "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
    }
  }
}'

            
このコードブロックはフローティングウィンドウ内に表示されます

セキュリティスキャンのアラート

セキュリティスキャンを含む Workflow で、重大度の高い脆弱性が見つかったときにすぐ SMS で通知します。

- 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(日次データ同期や定期バックアップなど)では、実行後にサマリー SMS を送れます。

on: schedule: - cron: '0 2 * * *' # Runs daily at 02:00 UTC 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 * * *'   # Runs daily at 02:00 UTC

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 を返しても SMS 配信成功を保証しません。 レスポンス本文の code を確認してください。0 または未設定は成功を示します。0 以外は エラーコードのドキュメント を参照してください。
  5. ログにシークレットを漏らさないこと。 run ステップで AUTH の内容を直接 echo しないでください。
Icon Solid Transparent White Qiyu
お問い合わせ