Github

ในกระบวนการ CI/CD เหตุการณ์สำคัญ เช่น การบิลด์ล้มเหลว การปรับใช้เสร็จสมบูรณ์ การแจ้งเตือนการสแกนความปลอดภัย มักต้องแจ้งให้ผู้เกี่ยวข้องทราบทันที การผสานรวม EngageLab SMS เข้ากับ GitHub Actions ช่วยให้คุณทริกเกอร์การแจ้งเตือน SMS ได้ที่จุดใดก็ได้ใน Workflow เพื่อให้สมาชิกในทีมรับรู้สถานะของระบบได้ทันท่วงทีไม่ว่าจะออนไลน์อยู่หรือไม่

ข้อกำหนดเบื้องต้น

ก่อนเริ่ม โปรดตรวจสอบว่าได้กำหนดค่าต่อไปนี้เสร็จแล้ว:

ฝั่ง EngageLab

  • เปิดใช้บริการ EngageLab SMS แล้ว
  • สร้างเทมเพลต SMS ในหน้าการจัดการเทมเพลตและผ่านการตรวจสอบแล้ว พร้อมได้รับ ID เทมเพลต
  • สร้าง API Key ในหน้า API Key แล้ว พร้อมได้รับ dev_key และ dev_secret

ฝั่ง GitHub

  • มีสิทธิ์ผู้ดูแลของที่เก็บโค้ดเป้าหมาย เพื่อกำหนดค่า Repository Secrets ได้

ขั้นตอนที่ 1: เตรียมเทมเพลต SMS

การเรียกใช้ API เพื่อส่ง SMS ต้องใช้เทมเพลตที่ผ่านการตรวจสอบล่วงหน้า ไม่รองรับการส่งข้อความที่กำหนดเองโดยตรง

เข้าสู่ระบบคอนโซล EngageLab ไปที่ SMS → การจัดการเทมเพลต และสร้างเทมเพลตใหม่ ยกตัวอย่างการแจ้งเตือนการปรับใช้ เนื้อหาเทมเพลตสามารถออกแบบได้ดังนี้:

【{{sign}}】สวัสดี ที่เก็บโค้ด {{repo}} ได้ {{status}} เมื่อ {{time}} Commit: {{commit}}
              
              {{sign}}】สวัสดี ที่เก็บโค้ด {{repo}} ได้ {{status}} เมื่อ {{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 Key ของ EngageLab
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": "ปรับใช้สำเร็จ", "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": "ปรับใช้ล้มเหลว", "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": "ปรับใช้สำเร็จ",
                  "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": "ปรับใช้ล้มเหลว",
                  "time": "'"$(date '+%Y-%m-%d %H:%M')"'"
                }
              }
            }'

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

คำอธิบายพารามิเตอร์สำคัญ

พารามิเตอร์ คำอธิบาย
if: success() ดำเนินการเฉพาะเมื่อขั้นตอนก่อนหน้าทั้งหมดของ Job ปัจจุบันสำเร็จ
if: failure() ดำเนินการเฉพาะเมื่อขั้นตอนใด ๆ ของ Job ปัจจุบันล้มเหลว
github.repository ตัวแปรในตัวของ GitHub รูปแบบเป็น owner/repo
github.sha Commit 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": "ปรับใช้ล้มเหลว", "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": "ปรับใช้ล้มเหลว",
      "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')"'"
          }
        }
      }'

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

รายงานผลการทำงานของงานตามกำหนดเวลา

สำหรับ Workflow ตามกำหนดเวลาที่ทริกเกอร์ผ่าน schedule (เช่น การซิงค์ข้อมูลรายวัน การสำรองข้อมูลตามรอบ) ให้ส่ง SMS สรุปหลังทำงานเสร็จ:

on: schedule: - cron: '0 2 * * *' # ทำงานทุกวันเวลา UTC 02:00 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 * * *'   # ทำงานทุกวันเวลา UTC 02:00

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 ในเนื้อหาการตอบกลับ หาก code เป็น 0 หรือไม่มี แสดงว่าปกติ หากไม่ใช่ศูนย์ ให้ดูคำอธิบายรหัสข้อผิดพลาดเพื่อตรวจหาสาเหตุ
  5. หลีกเลี่ยงการเปิดเผยคีย์ในบันทึก (log) อย่า echo แสดงเนื้อหาของตัวแปร AUTH โดยตรงในขั้นตอน run
Icon Solid Transparent White Qiyu
ติดต่อฝ่ายขาย