สวัสดีค่าา EP.6 มาแล้ว!
ถ้า DevOps มี MVP หนึ่งเรื่อง เรื่องนั้นคือ CI/CD ค่ะ มันคือหัวใจของทุกอย่างที่เราเรียนมา Git, Docker, Cloud ทุกอย่างมาเชื่อมกันที่ pipeline ตัวนี้
เปรียบให้เห็นภาพนะ ถ้าการซ้อม HYROX คือการเขียน code CI/CD ก็คือระบบที่ทดสอบฟอร์มของเราโดยอัตโนมัติทุกครั้งที่ซ้อม ก่อนที่จะส่งเราขึ้นแข่งจริง ถ้าฟอร์มพัง ระบบบอกทันที ไม่ต้องรอไปพังกลางสนามแข่ง
CI/CD คืออะไร
CI (Continuous Integration)
ทุกครั้งที่ developer push code ขึ้น repository ระบบจะ รัน test โดยอัตโนมัติทันที เพื่อตรวจว่าโค้ดใหม่ไม่ทำให้อะไรพัง ถ้า test fail ระบบแจ้งเตือนทันที developer แก้ไขก่อน merge
CD (Continuous Delivery / Deployment)
หลังจาก test ผ่านหมดแล้ว ระบบจะ deploy โค้ดขึ้น environment โดยอัตโนมัติ ไม่ต้องให้ใครมา manual deploy อีกแล้ว
GitHub Actions เริ่มต้นง่ายมาก
GitHub Actions คือ CI/CD tool ที่ built-in อยู่ใน GitHub เลย ใช้ฟรีสำหรับ public repo และมี free tier สำหรับ private ด้วย
เราสร้าง workflow โดยการวางไฟล์ .yml ไว้ใน .github/workflows/ ในทุก push GitHub จะอ่านไฟล์นี้และรัน job ตามที่กำหนด
# .github/workflows/ci.yml
name: CI Pipeline
# trigger: รันเมื่อ push หรือ PR เข้า main
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytest tests/
- name: Run linter
run: flake8 .
เพียงเท่านี้ ทุกครั้งที่มีคน push หรือเปิด PR เข้า main GitHub จะรัน test ให้อัตโนมัติเลยค่ะ
Pipeline ครบวงจร CI/CD และ Docker
ในชีวิตจริง pipeline มักจะทำมากกว่าแค่ test เราจะ build Docker image และ push ขึ้น registry ด้วย
# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: |
pip install -r requirements.txt
pytest tests/
build-and-push:
needs: test # รันต่อจาก test เท่านั้น
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push image
uses: docker/build-push-action@v5
with:
push: true
tags: chawadesu/my-app:${{ github.sha }}
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Deploy to server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_IP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker pull chawadesu/my-app:${{ github.sha }}
docker stop my-app || true
docker run -d --name my-app -p 8000:8000 \
chawadesu/my-app:${{ github.sha }}
🔐 secrets.DOCKER_PASSWORD และ secrets.SSH_PRIVATE_KEY เก็บไว้ใน GitHub repository secrets ไม่ได้อยู่ใน code โดยตรง ตั้งค่าได้ที่ Settings > Secrets ในหน้า repo
Environments: Dev, Staging, Production
ในทีมจริงๆจะมีหลาย environment แยกกัน
| Environment | ใช้เพื่ออะไร | ใครเข้าถึง |
|---|---|---|
| Development (dev) | Developer ทดสอบ feature ใหม่ | Developer เท่านั้น |
| Staging | ทดสอบก่อน release หน้าตาเหมือน production ทุกอย่าง | ทีม QA และ stakeholder |
| Production (prod) | ระบบจริงที่ user ใช้ | User ทั่วไป |
Pipeline ที่ดีจะ deploy ขึ้น staging ก่อนอัตโนมัติ ส่วน production อาจรอ manual approval ก่อน โดยเฉพาะ feature ใหญ่ๆ
Deployment Strategies ไม่ต้อง downtime
Rolling Deployment
ค่อยๆ update server ทีละตัว แทนที่จะ update พร้อมกันทั้งหมด ถ้ามี 4 server จะ update 1, 2, 3, 4 ตามลำดับ ระหว่างนั้น server ที่ยังไม่ update ยังรับ traffic อยู่
Blue-Green Deployment
มี environment สองชุด Blue (ปัจจุบัน) และ Green (ใหม่) deploy version ใหม่ขึ้น Green ก่อน test ให้ผ่าน แล้ว switch traffic จาก Blue ไป Green ทันที ถ้ามีปัญหา switch กลับ Blue ได้เลย
Canary Deployment
ส่ง traffic แค่ 5-10% ไปที่ version ใหม่ก่อน ดู error rate และ performance ถ้า ok ค่อยๆเพิ่ม traffic ขึ้นเรื่อยๆ จนครบ 100% วิธีนี้เหมาะกับ feature ที่ risk สูง
CI/CD Tools ที่นิยมในปัจจุบัน
| Tool | เด่นที่ | เหมาะกับ |
|---|---|---|
| GitHub Actions | built-in ใน GitHub setup ง่ายมาก | ทีมที่ใช้ GitHub |
| GitLab CI | powerful มาก ครบใน platform เดียว | ทีมที่ใช้ GitLab หรืออยากควบคุม infra เอง |
| Jenkins | flexible มาก customize ได้ทุกอย่าง | enterprise ที่มี requirement ซับซ้อน |
| CircleCI | เร็ว setup ง่าย | startup ที่ต้องการความเร็ว |
แนะนำเริ่มที่ GitHub Actions ก่อนเลยค่ะ เพราะ setup ง่ายที่สุดและ free tier ใช้ได้ดีมาก
สรุป EP.6
- CI คือการรัน test อัตโนมัติทุกครั้งที่ push code
- CD คือการ deploy อัตโนมัติหลัง test ผ่าน
- GitHub Actions ใช้ไฟล์
.ymlใน.github/workflows/ - มีหลาย environment: dev, staging, production
- Deployment strategies เช่น rolling, blue-green, canary ช่วยให้ deploy ได้โดยไม่ต้อง downtime
🏋️ การบ้าน: สร้าง repo ใหม่บน GitHub เขียน simple Python app + test file แล้วสร้าง GitHub Actions workflow ที่รัน test อัตโนมัติตอน push ดูว่า Actions tab มี green checkmark ไหม นั่นแหละ CI pipeline แรกของคุณแล้วค่ะ
ซีรี่ส์ DevOps พังแล้วพังอีกพังต่อ