สวัสดีค่าา 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 อีกแล้ว

Developer push code ↓ [CI] รัน automated tests ↓ ผ่าน? ──── ไม่ผ่าน → แจ้งเตือน developer ทันที ↓ ผ่าน [CD] Build Docker image ↓ Deploy ขึ้น staging อัตโนมัติ ↓ (ถ้าเป็น Continuous Deployment) Deploy ขึ้น production อัตโนมัติ

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 ได้เลย

Users │ Load Balancer │ ├── Blue (v1.0) ← traffic ปัจจุบัน └── Green (v1.1) ← deploy ใหม่ test ก่อน หลัง switch: ├── Blue (v1.0) ← standby ถ้า rollback └── Green (v1.1) ← รับ traffic แล้ว

Canary Deployment

ส่ง traffic แค่ 5-10% ไปที่ version ใหม่ก่อน ดู error rate และ performance ถ้า ok ค่อยๆเพิ่ม traffic ขึ้นเรื่อยๆ จนครบ 100% วิธีนี้เหมาะกับ feature ที่ risk สูง


CI/CD Tools ที่นิยมในปัจจุบัน

Toolเด่นที่เหมาะกับ
GitHub Actionsbuilt-in ใน GitHub setup ง่ายมากทีมที่ใช้ GitHub
GitLab CIpowerful มาก ครบใน platform เดียวทีมที่ใช้ GitLab หรืออยากควบคุม infra เอง
Jenkinsflexible มาก 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 แรกของคุณแล้วค่ะ