GitHub
CI/CD のワークフローでは、ビルド失敗、デプロイ完了、セキュリティスキャンのアラートなど、重要な出来事を関係者にすぐ知らせる必要があることがよくあります。GitHub Actions に EngageLab SMS を組み込むと、Workflow の任意のタイミングで SMS 通知を送れ、オンラインでなくてもメンバーがシステムの状態を把握できます。
前提条件
始める前に、次の設定が済んでいることを確認してください。
EngageLab 側
- EngageLab SMS が有効になっていること
- テンプレート管理で SMS テンプレートを作成し承認済みであること。テンプレート ID を取得済みであること
- API Keys ページで API キーを作成し、
dev_keyとdev_secretを取得済みであること
GitHub 側
- 対象リポジトリの管理者権限があり、Repository Secrets を設定できること
ステップ 1: SMS テンプレートの準備
API 経由の送信には事前承認済みテンプレートが必要で、自由文をそのまま送ることはできません。
EngageLab コンソールにログインし、SMS → テンプレート管理へ進み、新しいテンプレートを作成します。デプロイ通知の例として、テンプレート本文は次のようになります。
【{{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')"'"
}
}
}'
主要パラメーター参照
| パラメーター | 説明 |
|---|---|
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')"'"
}
}
}'
セキュリティスキャンのアラート
セキュリティスキャンを含む 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')"'"
}
}
}'
定期実行ジョブの結果レポート
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')"'"
}
}
}'
if: always()は、先行ステップの成否にかかわらずステップを実行します。必ず通知したい場合に適しています。
注意事項
- テンプレートは利用前に承認が必要です。 審査中や却下のテンプレートを呼ぶと、API は
4001エラーを返します。 - 電話番号には国番号を含めてください。 例: 中国本土は
+8618701235678。+や国番号を省略すると配信に失敗します。 - 認証文字列はリクエストごとに動的に生成します。 Base64 結果をあらかじめ保存する必要はありません。
echo -n "key:secret" | base64で都度計算してください。 - API が HTTP 200 を返しても SMS 配信成功を保証しません。 レスポンス本文の
codeを確認してください。0または未設定は成功を示します。0 以外は エラーコードのドキュメント を参照してください。 - ログにシークレットを漏らさないこと。
runステップでAUTHの内容を直接echoしないでください。
