GitHub
ในเวิร์กโฟลว์ CI/CD เหตุการณ์สำคัญ เช่น บิลด์ล้มเหลว การดีพลอยเสร็จ และการแจ้งเตือนจากสแกนความปลอดภัย มักต้องสื่อสารไปยังสมาชิกทีมที่เกี่ยวข้องทันที การเชื่อม EngageLab SMS เข้ากับ GitHub Actions ช่วยให้คุณทริกเกอร์การแจ้งเตือนทาง SMS ได้ทุกจุดใน Workflow เพื่อให้ทีมรับรู้สถานะระบบไม่ว่าจะออนไลน์หรือไม่
ข้อกำหนดเบื้องต้น
ก่อนเริ่ม ให้แน่ใจว่าการกำหนดค่าต่อไปนี้พร้อมแล้ว:
ฝั่ง EngageLab
- เปิดใช้บริการ EngageLab SMS แล้ว
- สร้างเทมเพลต SMS และได้รับอนุมัติในหน้าจัดการเทมเพลตแล้ว ได้ ID เทมเพลตแล้ว
- สร้างคีย์ API ในหน้า API Keys แล้ว ได้
dev_keyและdev_secretแล้ว
ฝั่ง GitHub
- คุณมีสิทธิ์ผู้ดูแลแก้ไขรีโพซิทอรีเป้าหมายและกำหนด Repository Secrets ได้
ขั้นตอนที่ 1: เตรียมเทมเพลต SMS
การส่ง SMS ผ่าน API ต้องใช้เทมเพลตที่อนุมัติแล้ว ไม่สามารถส่งข้อความกำหนดเองโดยตรงได้
ลงชื่อเข้าคอนโซล EngageLab ไปที่ SMS → Template Management แล้วสร้างเทมเพลตใหม่ สำหรับตัวอย่างการแจ้งเตือนการดีพลอย เนื้อหาเทมเพลตอาจเป็น:
【{{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 แล้วเพิ่มตัวแปรต่อไปนี้ทีละรายการ:
| ชื่อ Secret | คำอธิบาย |
|---|---|
ENGAGELAB_DEV_KEY |
dev_key จากหน้า API Keys ของ EngageLab |
ENGAGELAB_DEV_SECRET |
dev_secret ที่คู่กัน |
ENGAGELAB_TEMPLATE_SUCCESS |
ID เทมเพลตสำหรับแจ้งเมื่อดีพลอยสำเร็จ |
ENGAGELAB_TEMPLATE_FAILURE |
ID เทมเพลตสำหรับแจ้งเมื่อดีพลอยล้มเหลว |
ON_CALL_PHONE |
หมายเลขรับการแจ้งเตือน ต้องมีรหัสประเทศ เช่น +8618701235678 |
ขั้นตอนที่ 3: เพิ่มขั้นตอนการแจ้งเตือนใน Workflow
EngageLab SMS API ใช้การยืนยันตัวตนแบบ HTTP Basic โดยสตริง auth สร้างจาก 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 |
SHA ของคอมมิตที่ทริกเกอร์ Workflow นี้ |
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')"'"
}
}
}'
รายงานผลงานตามกำหนดเวลา
สำหรับ Workflow ที่ทริกเกอร์ด้วย schedule (เช่น ซิงก์ข้อมูลรายวันหรือสำรองเป็นระยะ) ส่ง 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การไม่ใส่+หรือรหัสประเทศจะทำให้จัดส่งล้มเหลว - สตริง auth สร้างใหม่ทุกคำขอ — ไม่จำเป็นต้องเก็บผล Base64 ไว้ล่วงหน้า คำนวณแบบเรียลไทม์ด้วย
echo -n "key:secret" | base64 - การตอบ HTTP 200 จาก API ไม่รับประกันว่า SMS จัดส่งสำเร็จ — ตรวจสอบฟิลด์
codeในเนื้อการตอบกลับcodeเป็น0หรือไม่มีมักหมายถึงสำเร็จ สำหรับค่าที่ไม่ใช่ศูนย์ อ้างอิง เอกสารรหัสข้อผิดพลาด เพื่อแก้ปัญหา - หลีกเลี่ยงการรั่วของความลับในล็อก — อย่า
echoเนื้อหาตัวแปรAUTHโดยตรงในขั้นตอนrun
