CICD Pipeline 架構及最佳實踐方式 - paulip114/blog GitHub Wiki

✅ 完整 CI/CD Pipeline 結構(符合 Best Practice)

階段 功能
CI - Build & Test 確保程式可以編譯、通過測試、符合品質門檻
Test - QA Automation 自動化測試:單元、整合、端對端、靜態分析、安全性
CD - Deploy 自動部署到 Staging / Production
Release 管理 Tag、版本控制、通知、Rollback 支援
Monitoring & Feedback 成功通知、錯誤追蹤、監控整合

🧱 Pipeline 範例(以 GitHub Actions 為例)

以下是一份符合業界最佳實踐的 CI + QA + CD Pipeline

name: CI/CD Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  # ===================
  # 1. Build & Lint
  # ===================
  build:
    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: Lint code
        run: npm run lint

      - name: Run unit tests
        run: npm run test:unit

  # ===================
  # 2. QA: E2E & Security
  # ===================
  qa:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Install dependencies
        run: npm ci

      - name: Run integration tests
        run: npm run test:integration

      - name: Run E2E tests
        run: npm run test:e2e

      - name: Static code analysis (SonarCloud)
        uses: SonarSource/sonarcloud-github-action@master
        with:
          projectBaseDir: .
          args: >
            -Dsonar.organization=my-org
            -Dsonar.projectKey=my-project
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

      - name: Run security scan (Snyk)
        uses: snyk/actions/node@v1
        with:
          command: test
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

  # ===================
  # 3. Deploy
  # ===================
  deploy:
    needs: qa
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Login to Container Registry
        uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest

      - name: Set kubeconfig
        run: |
          mkdir -p ~/.kube
          echo "${{ secrets.KUBECONFIG }}" > ~/.kube/config

      - name: Deploy to Kubernetes
        run: |
          kubectl set image deployment/my-deployment my-container=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest

      - name: Notify success
        uses: slackapi/[email protected]
        with:
          payload: |
            {
              "text": ":rocket: Deployment completed successfully to *Production*!",
              "channel": "#deployments"
            }
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}

📦 支援內容總覽

模組 工具 / 技術
Linting ESLint, Pylint, etc
單元測試 Jest, Mocha, PyTest, xUnit
整合測試 Supertest, Postman CLI
E2E 測試 Cypress, Playwright, Selenium
靜態分析 SonarCloud
安全掃描 Snyk, Trivy, CodeQL
构建與推送 Image Docker Buildx, GitHub Registry
部署 kubectl, Helm
通知 Slack, Discord, Email

🎯 為什麼這是 Best Practice?

  • 測試被分階段處理(可平行執行)
  • 確保部署前品質(QA gate)
  • 支援快速回報錯誤(fail fast)
  • 安全性檢查自動化
  • 可延伸至 Canary 或 Blue-Green 部署