GitHub
在 CI/CD 流程中,建置失敗、部署完成、安全掃描警示等關鍵事件往往需要立即通知相關成員。將 EngageLab SMS 整合進 GitHub Actions 後,您可在 Workflow 任一階段觸發簡訊通知,讓團隊成員無論是否在線上都能掌握系統狀態。
前置條件
開始前,請確認以下設定已完成:
EngageLab 端
- 已開通 EngageLab SMS 服務
- 已在範本管理頁面建立簡訊範本並通過審核,已取得範本 ID
- 已在 API Keys 頁面建立 API 金鑰,已取得
dev_key與dev_secret
GitHub 端
- 擁有目標儲存庫的管理員權限,可設定 Repository Secrets
步驟一:準備簡訊範本
透過 API 發送簡訊須使用預先審核通過的範本,無法直接傳入自訂文字內容。
登入 EngageLab 控制台,前往 SMS → Template Management,建立新範本。以下為部署通知範例,範本內容可設計為:
【{{sign}}】Hello, repository {{repo}} {{status}} at {{time}}, 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 Keys 頁面的 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": "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(例如每日資料同步或定期備份),執行完成後可發送摘要簡訊:
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 不代表簡訊一定送達成功 — 請檢查回應本文中的
code欄位。code為0或不存在表示成功;非零值請參考錯誤碼說明文件排查。 - 避免在記錄中洩漏機密 — 請勿在
run步驟中直接echo輸出AUTH變數內容。
