Github
CI/CDプロセスでは、ビルド失敗、デプロイ完了、セキュリティスキャンのアラートといった重要なイベントを、関係者へ即座に通知する必要がしばしばあります。EngageLab SMSをGitHub Actionsに連携すると、Workflowの任意のノードでSMS通知をトリガーでき、チームメンバーがオンラインかどうかに関わらず、システムの状態を速やかに把握できるようになります。
前提条件
開始する前に、次の設定が完了していることを確認してください。
EngageLab側
- EngageLab SMSサービスが有効化されている
- テンプレート管理ページでSMSテンプレートを作成・承認済みで、テンプレートIDを取得している
- API KeyページでAPIキーを作成済みで、
dev_keyとdev_secretを取得している
GitHub側
- Repository Secretsを設定するために、対象リポジトリの管理者権限を保有している
ステップ1:SMSテンプレートの準備
APIを呼び出してSMSを送信するには、事前に承認されたテンプレートが必要であり、カスタムテキストを直接渡すことはできません。
EngageLabコンソールにログインし、SMS → テンプレート管理 に移動して、新しいテンプレートを作成します。デプロイ通知を例にとると、テンプレート内容は次のように設計できます。
【{{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')"'"
}
}
}'
主要パラメータの説明
| パラメータ | 説明 |
|---|---|
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')"'"
}
}
}'
セキュリティスキャンのアラート
セキュリティスキャンステップを含む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(例:日次のデータ同期、定期バックアップ)では、実行後にサマリー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')"'"
}
}
}'
if: always()は、ステップが成功・失敗のどちらであっても実行されることを示し、通知の配信を確実に保証する必要があるシーンに適しています。
注意事項
- テンプレートは承認後にのみ使用できます。呼び出し時にテンプレートが審査待ちまたは却下されている場合、APIは
4001エラーを返します。 - 電話番号には国番号を含める必要があります。例えば、シンガポールの番号は
+6591234567と記述します。+や国番号なしで送信すると失敗します。 - 認証文字列はリクエストごとに動的に生成されます。Base64エンコードした結果を事前に保存する必要はなく、
echo -n "key:secret" | base64を使ってリアルタイムに計算するだけです。 - APIからのHTTP 200の返却は、SMSが正常に配信されたことを意味しません。レスポンスボディの
codeフィールドを確認してください。codeが0または存在しない場合は正常であることを示し、0以外の場合はエラーコードの説明を参照してトラブルシューティングを行ってください。 - ログにキーを漏洩させないようにしてください。
runステップでAUTH変数の内容を直接echoしないでください。










