ตั้งค่า Git-based Deployment Pipeline สำหรับ Multiple Environments

การสร้าง Git-based Deployment Pipeline สำหรับการจัดการ multiple environments (development, staging, production) เป็นหนึ่งในปฏิบัติที่สำคัญสำหรับทีม DevOps และนักพัฒนา เพราะช่วยให้การ deploy แอปพลิเคชันเป็นไปอย่างอัตโนมัติ ปลอดภัย และสามารถคาดเดาผลได้ บน ผู้ให้บริการโฮสติ้ง Cloud VPS คุณสามารถตั้งค่า pipeline นี้ได้อย่างง่ายดายโดยใช้ GitHub Actions หรือเครื่องมือ CI/CD อื่นๆ

1. หลักการพื้นฐานของ Git-based Deployment Pipeline

Git-based deployment pipeline ทำงานโดยการเชื่อมต่อกับ Git repository ของคุณ เมื่อมีการ push code ไปที่ branch ต่างๆ (เช่น develop, staging, main) pipeline จะทำการทดสอบ build และ deploy อัตโนมัติไปยัง environment ที่เหมาะสม

ประโยชน์ของการใช้ git-based pipeline:

  • ลดความผิดพลาดจากการ deploy ด้วยมือ
  • เร่งความเร็วในการ release features ใหม่
  • เก็บประวัติการเปลี่ยนแปลง code ได้ชัดเจน
  • สามารถ rollback ไปยังเวอร์ชันเก่าได้อย่างรวดเร็ว
  • ช่วยให้ทีมทำงานเป็นระบบและได้มาตรฐาน

2. โครงสร้างของ Multiple Environments

การจัดการ multiple environments ที่ดีต้องมีโครงสร้างที่ชัดเจน:

# โครงสร้าง environments
development:   สำหรับการพัฒนา ทดสอบ feature ใหม่
staging:       สำหรับการ test ก่อน production เหมือนกับ production
production:    สำหรับผู้ใช้งานจริง (live environment)

# Branch strategy
main/master    → production
staging        → staging environment
develop        → development environment
feature/*      → feature branches (test locally)

3. การตั้งค่า GitHub Actions สำหรับ Multi-Environment Deployment

GitHub Actions ให้บริการ CI/CD ที่มีประสิทธิภาพ คุณสามารถสร้าง workflow file ชื่อ .github/workflows/deploy.yml ดังนี้:

name: Multi-Environment Deployment

on:
  push:
    branches: [develop, staging, main]
  pull_request:
    branches: [develop, staging, main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Install dependencies
        run: npm ci
      - name: Run tests
        run: npm test
      - name: Build application
        run: npm run build

  deploy-dev:
    needs: test
    if: github.ref == 'refs/heads/develop'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Deploy to development
        env:
          DEPLOY_KEY: ${{ secrets.DEV_DEPLOY_KEY }}
          DEPLOY_HOST: ${{ secrets.DEV_HOST }}
          DEPLOY_PATH: /var/www/app-dev
        run: |
          mkdir -p ~/.ssh
          echo "$DEPLOY_KEY" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
          ssh -i ~/.ssh/deploy_key deploy@$DEPLOY_HOST "cd $DEPLOY_PATH && git pull origin develop && npm install && npm run build"

  deploy-staging:
    needs: test
    if: github.ref == 'refs/heads/staging'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Deploy to staging
        env:
          DEPLOY_KEY: ${{ secrets.STAGING_DEPLOY_KEY }}
          DEPLOY_HOST: ${{ secrets.STAGING_HOST }}
          DEPLOY_PATH: /var/www/app-staging
        run: |
          mkdir -p ~/.ssh
          echo "$DEPLOY_KEY" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
          ssh -i ~/.ssh/deploy_key deploy@$DEPLOY_HOST "cd $DEPLOY_PATH && git pull origin staging && npm install && npm run build && npm run migrate"

  deploy-prod:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment:
      name: production
    steps:
      - uses: actions/checkout@v3
      - name: Deploy to production
        env:
          DEPLOY_KEY: ${{ secrets.PROD_DEPLOY_KEY }}
          DEPLOY_HOST: ${{ secrets.PROD_HOST }}
          DEPLOY_PATH: /var/www/app
        run: |
          mkdir -p ~/.ssh
          echo "$DEPLOY_KEY" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
          ssh -i ~/.ssh/deploy_key deploy@$DEPLOY_HOST "cd $DEPLOY_PATH && git pull origin main && npm install && npm run build && npm run migrate && npm run health-check"

4. การจัดการ Environment Variables อย่างปลอดภัย

การเก็บ secrets และ environment variables อย่างปลอดภัยเป็นสิ่งสำคัญ:

# .env.example (commit ไปยัง repository)
DATABASE_URL=postgresql://user:pass@localhost/app
API_KEY=your_api_key_here
LOG_LEVEL=debug
AWS_REGION=ap-southeast-1

# .env.development (ใช้เฉพาะ local)
DATABASE_URL=postgresql://dev:dev@localhost:5432/app_dev
API_KEY=dev-key-1234
LOG_LEVEL=debug

# .env.production (เก็บใน GitHub Secrets)
# ห้ามเก็บใน repository!
DATABASE_URL=postgresql://prod_user:[email protected]/app
API_KEY=prod-key-abcd1234
LOG_LEVEL=warn

# .gitignore
.env
.env.local
.env.*.local
*.pem
secrets/

5. Best Practices สำหรับ Git-based Deployment

  • Automated Testing: ทำให้การ test เป็นส่วนบังคับของ pipeline เพื่อป้องกันการ deploy code ที่มีข้อผิดพลาด
  • Feature Flags: ใช้ feature flags เพื่อ toggle features ใหม่ใน production โดยไม่ต้อง deploy code ใหม่
  • Semantic Versioning: ใช้ semver (major.minor.patch) สำหรับ tagging releases เพื่อให้ชัดเจนว่ามีการเปลี่ยนแปลงอะไร
  • Monitoring & Alerting: ตั้งค่า monitoring เพื่อติดตามสถานะของการ deploy และแจ้งเตือนเมื่อมีปัญหา
  • Rollback Plan: มีแผนสำหรับการ rollback โดยเร็วในกรณีที่เกิดปัญหา
  • Documentation: เก็บบันทึกรายละเอียดของแต่ละการ deploy เพื่อการ troubleshooting ในอนาคต

6. ตัวอย่างการจัดการ Secrets ใน GitHub

ในหน้า Settings > Secrets and variables > Actions ของ repository ให้เพิ่ม secrets ดังต่อไปนี้:

# Development
DEV_DEPLOY_KEY         → SSH private key สำหรับ dev server
DEV_HOST               → hostname ของ dev server (เช่น dev.example.com)

# Staging
STAGING_DEPLOY_KEY     → SSH private key สำหรับ staging server
STAGING_HOST           → hostname ของ staging server

# Production
PROD_DEPLOY_KEY        → SSH private key สำหรับ prod server
PROD_HOST              → hostname ของ prod server
PROD_DATABASE_URL      → Database connection string
PROD_API_SECRET        → API secret key

การตั้งค่า Git-based Deployment Pipeline สำหรับ multiple environments บน ผู้ให้บริการโฮสติ้ง Cloud VPS จะทำให้กระบวนการ release ของแอปพลิเคชันเป็น safe controlled และ reproducible ทุกครั้ง ด้วยการใช้ GitHub Actions หรือ CI/CD tools อื่นๆ คุณสามารถทำให้การ deploy เป็นอัตโนมัติและลดความผิดพลาดจากการทำด้วยมือลงไปอย่างมาก