Deploy Notification: แจ้งเตือนทีมผ่าน Slack/Discord เมื่อ Deploy สำเร็จ

เมื่อ CI/CD Pipeline ทำงานเสร็จสิ้น สิ่งสำคัญที่ไม่ควรมองข้ามคือ การแจ้งเตือนทีม ให้รู้ว่า Deploy สำเร็จหรือล้มเหลว บทความนี้จะสอนวิธีตั้งค่า Deploy Notification ผ่าน Slack และ Discord โดยใช้ Webhook เพื่อให้ทีมรับรู้สถานะการ Deploy แบบ Real-time บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง

ทำไมต้องมี Deploy Notification?

การ Deploy โดยไม่มีการแจ้งเตือนทำให้เกิดปัญหาหลายอย่าง เช่น ทีมไม่รู้ว่า Deploy สำเร็จหรือยัง, ไม่รู้ว่าเวอร์ชันใหม่ถูก Deploy ขึ้น Production แล้ว, หรือไม่รู้ว่า Deploy ล้มเหลวและต้องแก้ไขด่วน การมีระบบแจ้งเตือนอัตโนมัติช่วยให้:

  • ทีมรับรู้สถานะ Deploy แบบ Real-time
  • ลดเวลาที่ใช้ในการตรวจสอบ Pipeline
  • ตอบสนองต่อ Deploy ที่ล้มเหลวได้รวดเร็ว
  • มีบันทึกการ Deploy ในช่อง Chat ของทีม

Webhook คืออะไร?

Webhook คือ URL พิเศษที่ Slack หรือ Discord สร้างขึ้น เมื่อเราส่ง HTTP POST Request ไปยัง URL นี้พร้อมข้อมูล JSON ระบบจะแสดงข้อความในช่อง (Channel) ที่กำหนดโดยอัตโนมัติ เหมาะสำหรับการส่งการแจ้งเตือนจาก CI/CD Pipeline, Monitoring System หรือ Script ต่างๆ

ขั้นตอนที่ 1: สร้าง Slack Incoming Webhook

เริ่มต้นด้วยการสร้าง Webhook URL สำหรับ Slack:

  1. ไปที่ api.slack.com/apps แล้ว Click Create New App
  2. เลือก From scratch ตั้งชื่อ App เช่น “Deploy Bot” และเลือก Workspace
  3. ไปที่ Incoming Webhooks และเปิดใช้งาน (Toggle ON)
  4. Click Add New Webhook to Workspace
  5. เลือก Channel ที่ต้องการส่งการแจ้งเตือน เช่น #deploy-notifications
  6. Copy Webhook URL ที่ได้ รูปแบบจะเป็น: https://hooks.slack.com/services/T.../B.../...

ขั้นตอนที่ 2: สร้าง Discord Webhook

สำหรับ Discord การสร้าง Webhook ทำได้ง่ายกว่า:

  1. เปิด Discord Server ที่ต้องการ
  2. Click ขวาที่ Channel เช่น #deployments แล้วเลือก Edit Channel
  3. ไปที่แท็บ Integrations แล้ว Click Webhooks
  4. Click New Webhook ตั้งชื่อและเลือก Channel
  5. Click Copy Webhook URL

ขั้นตอนที่ 3: ทดสอบ Webhook ด้วย curl

ก่อนนำไปใช้ใน Pipeline ทดสอบ Webhook ก่อนด้วย curl:

ทดสอบ Slack Webhook

# ทดสอบ Slack Webhook
curl -X POST -H 'Content-type: application/json' \
  --data '{"text":"Hello from Deploy Bot! 🚀"}' \
  https://hooks.slack.com/services/YOUR/WEBHOOK/URL

ทดสอบ Discord Webhook

# ทดสอบ Discord Webhook
curl -X POST -H 'Content-type: application/json' \
  --data '{"content":"Hello from Deploy Bot! 🚀"}' \
  https://discord.com/api/webhooks/YOUR/WEBHOOK/URL

ขั้นตอนที่ 4: เขียน Bash Script สำหรับส่งการแจ้งเตือน

สร้าง Script ที่ใช้ซ้ำได้สำหรับส่งการแจ้งเตือนบน Cloud VPS:

#!/bin/bash
# notify.sh - ส่งการแจ้งเตือน Deploy ไปยัง Slack และ Discord

SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
DISCORD_WEBHOOK="https://discord.com/api/webhooks/YOUR/WEBHOOK/URL"

# รับค่าจาก Arguments
STATUS=$1      # success หรือ failure
PROJECT=$2     # ชื่อโปรเจกต์
VERSION=$3     # เวอร์ชัน
ENVIRONMENT=$4 # dev, staging, production

# กำหนด Emoji และสีตามสถานะ
if [ "$STATUS" = "success" ]; then
  EMOJI="✅"
  COLOR="good"
  MESSAGE="Deploy สำเร็จ!"
else
  EMOJI="❌"
  COLOR="danger"
  MESSAGE="Deploy ล้มเหลว!"
fi

# ส่งไปยัง Slack
send_slack() {
  curl -s -X POST -H 'Content-type: application/json' \
    --data "{
      \"attachments\": [{
        \"color\": \"$COLOR\",
        \"title\": \"$EMOJI $MESSAGE\",
        \"fields\": [
          {\"title\": \"Project\", \"value\": \"$PROJECT\", \"short\": true},
          {\"title\": \"Version\", \"value\": \"$VERSION\", \"short\": true},
          {\"title\": \"Environment\", \"value\": \"$ENVIRONMENT\", \"short\": true},
          {\"title\": \"Time\", \"value\": \"$(date '+%Y-%m-%d %H:%M:%S')\", \"short\": true}
        ]
      }]
    }" \
    "$SLACK_WEBHOOK"
}

# ส่งไปยัง Discord
send_discord() {
  curl -s -X POST -H 'Content-type: application/json' \
    --data "{
      \"content\": \"$EMOJI **$MESSAGE**\",
      \"embeds\": [{
        \"title\": \"$PROJECT - $ENVIRONMENT\",
        \"description\": \"Version: $VERSION\\nTime: $(date '+%Y-%m-%d %H:%M:%S')\",
        \"color\": $([ \"$STATUS\" = \"success\" ] && echo 5763719 || echo 15548997)
      }]
    }" \
    "$DISCORD_WEBHOOK"
}

send_slack
send_discord

echo "Notification sent!"

ใช้งาน Script:

chmod +x notify.sh
./notify.sh success "my-app" "v1.2.3" "production"

ขั้นตอนที่ 5: เพิ่ม Notification ใน GitHub Actions

เพิ่มการแจ้งเตือนใน GitHub Actions Workflow:

name: Deploy with Notification

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Deploy to Cloud VPS
        id: deploy
        run: |
          ssh -i ~/.ssh/id_rsa user@YOUR_VPS_IP "
            cd /var/www/myapp &&
            git pull &&
            npm install --production &&
            pm2 restart myapp
          "

      - name: Notify Slack - Success
        if: success()
        run: |
          curl -X POST -H 'Content-type: application/json' \
            --data '{
              "attachments": [{
                "color": "good",
                "title": "✅ Deploy สำเร็จ!",
                "fields": [
                  {"title": "Repository", "value": "${{ github.repository }}", "short": true},
                  {"title": "Branch", "value": "${{ github.ref_name }}", "short": true},
                  {"title": "Commit", "value": "${{ github.sha }}", "short": false},
                  {"title": "Triggered by", "value": "${{ github.actor }}", "short": true}
                ]
              }]
            }' \
            ${{ secrets.SLACK_WEBHOOK_URL }}

      - name: Notify Slack - Failure
        if: failure()
        run: |
          curl -X POST -H 'Content-type: application/json' \
            --data '{
              "attachments": [{
                "color": "danger",
                "title": "❌ Deploy ล้มเหลว!",
                "fields": [
                  {"title": "Repository", "value": "${{ github.repository }}", "short": true},
                  {"title": "Branch", "value": "${{ github.ref_name }}", "short": true},
                  {"title": "Run URL", "value": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}", "short": false}
                ]
              }]
            }' \
            ${{ secrets.SLACK_WEBHOOK_URL }}

ขั้นตอนที่ 6: เก็บ Webhook URL ไว้ใน Secrets

ไม่ควร Hardcode Webhook URL ไว้ใน Code ให้เก็บเป็น Secrets แทน:

  • GitHub Actions: ไปที่ Repository → Settings → Secrets and variables → Actions → New repository secret
  • GitLab CI: ไปที่ Settings → CI/CD → Variables
  • Jenkins: ใช้ Credentials Plugin

ขั้นตอนที่ 7: ใช้ Discord Webhook ใน GitLab CI

stages:
  - deploy
  - notify

deploy:
  stage: deploy
  script:
    - ssh user@$VPS_IP "cd /var/www/myapp && git pull && npm install && pm2 restart myapp"
  only:
    - main

notify_success:
  stage: notify
  script:
    - |
      curl -X POST -H 'Content-type: application/json' \
        --data "{\"content\": \"✅ **Deploy สำเร็จ!** \nProject: $CI_PROJECT_NAME \nBranch: $CI_COMMIT_REF_NAME \nCommit: $CI_COMMIT_SHORT_SHA\"}" \
        $DISCORD_WEBHOOK_URL
  when: on_success
  only:
    - main

notify_failure:
  stage: notify
  script:
    - |
      curl -X POST -H 'Content-type: application/json' \
        --data "{\"content\": \"❌ **Deploy ล้มเหลว!** \nProject: $CI_PROJECT_NAME \nBranch: $CI_COMMIT_REF_NAME \nRun: $CI_PIPELINE_URL\"}" \
        $DISCORD_WEBHOOK_URL
  when: on_failure
  only:
    - main

Best Practices สำหรับ Deploy Notification

  • แยก Channel: มีช่องแยกสำหรับ Notification เช่น #deploy-prod สำหรับ Production และ #deploy-dev สำหรับ Development
  • ระบุข้อมูลให้ครบ: ชื่อโปรเจกต์, เวอร์ชัน, Environment, เวลา, ผู้ Deploy และ Commit Hash
  • ใช้ Emoji และสี: ช่วยให้ทีมเห็นสถานะได้รวดเร็ว (✅ สำเร็จ / ❌ ล้มเหลว)
  • รวม Link: ใส่ลิงก์ไปยัง Pipeline Run หรือ Commit เพื่อให้ตรวจสอบได้ทันที
  • ไม่ Spam: ส่งเฉพาะเมื่อ Deploy สำเร็จหรือล้มเหลว ไม่ใช่ทุก Step ใน Pipeline

สรุป

การตั้งค่า Deploy Notification ผ่าน Slack/Discord เป็นส่วนสำคัญของ DevOps Workflow ที่ดี ช่วยให้ทีมรับรู้สถานะการ Deploy แบบ Real-time และตอบสนองต่อปัญหาได้รวดเร็ว บน Cloud VPS ของ ผู้ให้บริการโฮสติ้ง คุณสามารถตั้งค่า CI/CD Pipeline พร้อม Notification ได้อย่างสมบูรณ์ ครอบคลุมตั้งแต่ GitHub Actions, GitLab CI ไปจนถึง Jenkins