เมื่อ 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:
- ไปที่ api.slack.com/apps แล้ว Click Create New App
- เลือก From scratch ตั้งชื่อ App เช่น “Deploy Bot” และเลือก Workspace
- ไปที่ Incoming Webhooks และเปิดใช้งาน (Toggle ON)
- Click Add New Webhook to Workspace
- เลือก Channel ที่ต้องการส่งการแจ้งเตือน เช่น #deploy-notifications
- Copy Webhook URL ที่ได้ รูปแบบจะเป็น:
https://hooks.slack.com/services/T.../B.../...
ขั้นตอนที่ 2: สร้าง Discord Webhook
สำหรับ Discord การสร้าง Webhook ทำได้ง่ายกว่า:
- เปิด Discord Server ที่ต้องการ
- Click ขวาที่ Channel เช่น #deployments แล้วเลือก Edit Channel
- ไปที่แท็บ Integrations แล้ว Click Webhooks
- Click New Webhook ตั้งชื่อและเลือก Channel
- 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
