Github

CI/CDプロセスでは、ビルド失敗、デプロイ完了、セキュリティスキャンのアラートといった重要なイベントを、関係者へ即座に通知する必要がしばしばあります。EngageLab SMSをGitHub Actionsに連携すると、Workflowの任意のノードでSMS通知をトリガーでき、チームメンバーがオンラインかどうかに関わらず、システムの状態を速やかに把握できるようになります。

前提条件

開始する前に、次の設定が完了していることを確認してください。

EngageLab側

  • EngageLab SMSサービスが有効化されている
  • テンプレート管理ページでSMSテンプレートを作成・承認済みで、テンプレートIDを取得している
  • API KeyページでAPIキーを作成済みで、dev_keydev_secret を取得している

GitHub側

  • Repository Secretsを設定するために、対象リポジトリの管理者権限を保有している

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

APIを呼び出してSMSを送信するには、事前に承認されたテンプレートが必要であり、カスタムテキストを直接渡すことはできません。

EngageLabコンソールにログインし、SMS → テンプレート管理 に移動して、新しいテンプレートを作成します。デプロイ通知を例にとると、テンプレート内容は次のように設計できます。

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

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

テンプレートを送信した後、承認を待ち、テンプレートID(例:deploy-notify-template)を記録します。

推奨:「デプロイ成功」と「デプロイ失敗」で独立したテンプレートを作成すると、意味がより明確になり、承認率も高まります。

ステップ2:GitHub Secretsの設定

Workflowファイルにキーをハードコードすることを避けるため、機密情報はGitHub Repository Secretsに保存すべきです。

リポジトリページに移動し、Settings → Secrets and variables → Actions → New repository secret に進んで、次の変数を1つずつ追加します。

Secret名 説明
ENGAGELAB_DEV_KEY EngageLab API Keyページの dev_key
ENGAGELAB_DEV_SECRET 対応する dev_secret
ENGAGELAB_TEMPLATE_SUCCESS デプロイ成功通知用のテンプレートID
ENGAGELAB_TEMPLATE_FAILURE デプロイ失敗通知用のテンプレートID
ON_CALL_PHONE 通知を受け取る、国番号を含む携帯番号。例:+6591234567

ステップ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をトリガーした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": "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で、高リスクの脆弱性が見つかった際に即座に通知します。

- 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 * * *' # Execute 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 * * *'   # Execute 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. 電話番号には国番号を含める必要があります。例えば、シンガポールの番号は +6591234567 と記述します。+ や国番号なしで送信すると失敗します。
  3. 認証文字列はリクエストごとに動的に生成されます。Base64エンコードした結果を事前に保存する必要はなく、echo -n "key:secret" | base64 を使ってリアルタイムに計算するだけです。
  4. APIからのHTTP 200の返却は、SMSが正常に配信されたことを意味しません。レスポンスボディの code フィールドを確認してください。code0 または存在しない場合は正常であることを示し、0以外の場合はエラーコードの説明を参照してトラブルシューティングを行ってください。
  5. ログにキーを漏洩させないようにしてくださいrun ステップで AUTH 変数の内容を直接 echo しないでください。
Icon Solid Transparent White Qiyu
お問い合わせ