การสร้าง 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 เป็นอัตโนมัติและลดความผิดพลาดจากการทำด้วยมือลงไปอย่างมาก
