Skip to content

GitOps 工作流程藍圖 (詳細版)

執行摘要

本文件旨在詳細闡述一個基於 GitOps 原則的現代化、可擴展且安全的 CI/CD 工作流程。該藍圖的核心思想是將 Git 倉庫作為所有程式碼、文件與系統狀態的唯一真相來源。流程透過事件驅動、精準的分工與自動化,實現從開發、文件發布、版本控制到自動化部署的端到端(End-to-End)閉環,同時確保每個階段都有足夠的品質把關和人工審核點。

整體架構概覽

整個系統由解耦的 Git 倉庫、自動化工作流、中央訊息佇列和 Kubernetes 叢集組成。每個元件各司其職,共同運作以實現高效的協作與發布。

graph TD
    subgraph "Developer Workflow"
        A[Developer]
    end

    subgraph "Repositories"
        B[document_repository]
        C[feature_repository]
        D[release_coordinator]
    end

    subgraph "CI/CD & Automation"
        E["GitHub Actions"]
        F["RabbitMQ"]
        G["private_github_operator<br>(AI-powered Issue Creator)"]
    end

    subgraph "Production Environment"
        H["Netlify (Docs Site)"]
        I["Container Registry"]
        J["Argo CD"]
        K["Kubernetes Cluster"]
    end

    A -- "Push Docs" --> B
    B -- "Push to main" --> E
    E -- "Build & Deploy" --> H
    E -- "Send Message" --> F
    F --> G
    G -- "Create Issue" --> C

    A -- "Code & PRs" --> C
    C -- "Manual Release" --> E
    E -- "Build & Push" --> I

    C -- "Merge to main" --> E
    E -- "Update values.yaml PR" --> D
    D -- "Merge PR" --> J
    J -- "Sync Cluster State" --> K
    I -- "Monitor new images" --> J

1. 文件發布流程:Docs as Code

此流程確保技術文件與程式碼同步更新,並以自動化方式發布,同時觸發後續的協作流程。

  • 倉庫: document_repository
  • Git 流程: 採用簡單的 featuremain 模式。
  • 自動化流程(GitHub Actions):
    • 觸發點: on: pushmain 分支。
    • github-actions.yaml 範例:
      name: Publish Docs
      on:
        push:
          branches:
            - main
      jobs:
        build_and_publish:
          runs-on: ubuntu-latest
          steps:
            - name: Checkout code
              uses: actions/checkout@v3
            - name: Set up Python
              uses: actions/setup-python@v4
              with:
                python-version: 3.x
            - name: Install dependencies
              run: |
                pip install mkdocs mkdocs-material
            - name: Build docs
              run: mkdocs build
            - name: Deploy to Netlify
              run: |
                # Use Netlify CLI or a dedicated action
                npm install netlify-cli
                netlify deploy --prod --dir=site
              env:
                NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_TOKEN }}
            - name: Send RabbitMQ message
              run: |
                # Use curl or a dedicated action to publish a message
                curl -X POST -H "Content-Type: application/json" -d '{ "event": "doc_update", "repo": "document_repository", "version": "${{ github.sha }}" }' "http://your.rabbitmq.com:15672/api/exchanges/vhost/docs-exchange/publish"
              env:
                RABBITMQ_USER: ${{ secrets.RABBITMQ_USER }}
                RABBITMQ_PASS: ${{ secrets.RABBITMQ_PASS }}
      

2. 自動化協作與問題追蹤

此階段透過訊息佇列實現服務解耦,並利用 AI 輔助創建可追蹤的任務。

  • 工具: RabbitMQ, 自定義的 private_github_operator 服務 (可使用 Python 或 Node.js 實現), AI Assistant (例如 OpenAI API)。
  • 工作流程:
    • 訊息格式: RabbitMQ 訊息的 JSON payload 應包含足夠的資訊,如 {"event": "doc_update", "repo": "document_repository", "commit_sha": "..."}
    • private_github_operator 的邏輯:
      1. 持續監聽 RabbitMQ 的 docs-exchange 佇列。
      2. 接收到 doc_update 訊息後,讀取相關變更。
      3. 呼叫 AI Assistant API,傳入文件變更內容,要求其生成一個 Issue 標題和描述。
      4. 使用 GitHub 的 create-an-issue API (POST /repos/{owner}/{repo}/issues),將 AI 生成的內容作為 payload 創建 Issue。

3. 微服務 CI 管道 (Pipeline)

這是程式碼從 Git 到容器映像檔的核心流程,確保每個建置都是可追溯且高質量的。

  • 倉庫: 每個微服務一個倉庫 (feature_repository)。
  • Git 流程: featuredevelopmentstagingproductionmain
  • 自動化流程(GitHub Actions):
    • 觸發點: on: release 事件,types: [published]
    • ci-pipeline.yaml 範例:
      name: Build and Push Docker Image
      on:
        release:
          types: [published]
      jobs:
        build_and_push:
          runs-on: ubuntu-latest
          steps:
            - name: Checkout code
              uses: actions/checkout@v3
              with:
                ref: ${{ github.ref_name }} # Checkout the release tag
            - name: Log in to Docker Registry
              uses: docker/login-action@v2
              with:
                registry: your.registry.com
                username: ${{ secrets.REGISTRY_USERNAME }}
                password: ${{ secrets.REGISTRY_TOKEN }}
            - name: Build and push Docker image
              uses: docker/build-and-push-action@v4
              with:
                context: .
                push: true
                tags: your.registry.com/your-app:${{ github.ref_name }} # Use the release tag as image tag
                file: ./Dockerfile
            - name: Run automated tests
              run: |
                # Execute unit and integration tests
                npm test
                # Or a specific test script
                ./run_integration_tests.sh
      

4. 多服務協調發布

此流程確保跨多個微服務的功能可以被統一、原子性地發布,避免版本不一致。

  • 倉庫: release_coordinator
  • Git 流程: featuremain
  • 自動化流程(GitHub Actions):
    • 觸發點: on: pull_requestmain。這個 Action 負責檢查 PR 內容並確保其格式正確。
    • values.yaml 檔案範例:
      apps:
        auth-service:
          image: your.registry.com/auth-service:v1.2.3
          tag: v1.2.3
        frontend:
          image: your.registry.com/frontend:v5.6.7
          tag: v5.6.7
      
    • 部署觸發點: on: pushmain。這表示 PR 合併後,Argo CD 會被觸發。

5. CD 與 GitOps 部署

這是流程的終點,確保應用程式狀態與 Git 倉庫定義的狀態保持一致。

  • 工具: Argo CD、Kubernetes、Helm。
  • 工作流程:
    • Argo CD App of Apps 模式: 在 Kubernetes 叢集中,Argo CD 被配置為監控 release_coordinator 倉庫。這個倉庫有一個主要的 Helm Chart,它包含了所有微服務的子 Chart。當 values.yaml 更新時,Argo CD 會自動執行 Helm 升級(helm upgrade)指令。
    • 同步: Argo CD 會自動同步叢集中的資源,將舊的 Pod 替換為使用新映像檔的 Pod。
    • 回滾: 如果部署失敗或發現問題,DevOps 人員可以手動在 release_coordinator 倉庫中將 values.yaml 檔案的版本號改回上一個已知的良好版本,Argo CD 會自動執行回滾。這比傳統的回滾更為可靠。

Git 流程細節

Repository Type Git Flow Key Branch(es) Primary Trigger for CI/CD
feature_repository Full developmentstagingproduction development, main Manual GitHub Release
document_repository Simple featuremain main Push to main
release_coordinator Simple featuremain main Merge PR to main
  • feature_repository Git 流程

    gitGraph
    commit id: "Initial commit"
    branch development
    commit id: "Initial dev setup"
    checkout development
    branch feature/add-service
    commit id: "Work on feature"
    commit id: "Complete feature"
    checkout development
    merge feature/add-service
    commit id: "Merge feature to dev"
    branch staging
    commit id: "Ready for QA"
    checkout staging
    merge development
    commit id: "QA ready build"
    branch production
    commit id: "UAT approved"
    checkout production
    merge staging
    commit id: "Release commit"
    checkout main
    merge production tag: "v1.2.3"
    commit id: "Tag production release"
    checkout development
    merge main
    commit id: "Sync dev with main"

  • document_repository Git 流程

    gitGraph
    commit id: "Initial commit"
    branch feature/update-doc
    commit id: "Work on doc"
    checkout main
    merge feature/update-doc
    commit id: "Publish new doc"

  • release_coordinator Git 流程

    gitGraph
    commit id: "Initial state"
    branch feature/new-deployment
    commit id: "Update image tags"
    checkout main
    merge feature/new-deployment
    commit id: "Release to production"

需要考量的要點與最佳實踐

  • 安全性:
    • Secrets Management: 嚴格使用 GitHub Secrets 和 Kubernetes Secrets 來管理所有敏感資料。永遠不要將密鑰提交到 Git。
    • OIDC (OpenID Connect): 使用 OIDC 讓 GitHub Actions 能夠安全地與雲端服務(如 AWS、GCP)進行身份驗證,無需使用長期存在的靜態密鑰。
  • 測試:
    • 層級化測試: 每個 PR 都應運行快速的單元測試和程式碼品質檢查(如 ESLint, Prettier)。在部署到 Staging 後,運行更全面的端到端測試。
  • 可觀察性:
    • 日誌: 使用集中式日誌系統(如 Fluentd, Loki)來收集來自所有服務和 CI/CD 流程的日誌。
    • 指標: 透過 Prometheus 和 Grafana 來收集和可視化服務的效能指標。
  • 團隊紀律:
    • PR 審核: 嚴格執行程式碼審核流程。確保程式碼審核者理解每個 PR 所帶來的潛在風險。
    • 定義: 確保團隊對「完成(Done)」、測試覆蓋率、和緊急發布流程有共同的理解。
    • 溝通: 在每個主要發布階段,都應有清晰的溝通渠道,讓所有相關人員都知悉進度。

結論

這份 GitOps 工作流程藍圖提供了一個嚴謹而全面的框架,用於管理微服務開發與部署的複雜性。它將 Git 的版本控制與程式碼審核能力、GitHub Actions 的自動化、Argo CD 的部署同步以及 Kubernetes 的運行可靠性完美地結合在一起。

這個流程不僅能夠極大地提升開發效率,還能在每個關鍵環節提供足夠的品質把關和透明度。透過這套經過深思熟慮的系統,你的團隊能夠將精力集中在創造價值上,同時確保每一次的發布都是安全、可控且可靠的。