iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0
Kubernetes

從零到一:使用 K8S + GitOps 打造異構技術棧的資料分析平台系列 第 15

[Day 15] CI/CD 自動化 (一):GitHub Actions 基礎流程與測試自動化 —— 建立代碼推送後的第一道防線,確保品質不退化。

  • 分享至 

  • xImage
  •  

Day 15: CI/CD 自動化 (一):GitHub Actions 基礎流程與測試自動化

建立代碼推送後的第一道防線,確保品質不退化。

1. 為什麼要寫 CI 流水線?

如果每次改完 code 都要手動 docker build 六個服務、手動推 Registry、手動改部署檔的 tag……不僅浪費工程師寶貴的生命,還超容易出錯(推錯分支、忘記改 tag、六個服務漏推一個)。

所以我們需要 Continuous Integration,讓機器人代勞。我們選 GitHub Actions——跟 code 放在同一個地方,整合度最好,而且 public repo 免費額度很夠用。

2. 觸發機制:不要浪費運算資源

.github/workflows/deploy.yml 中設定觸發條件:

on:
  push:
    branches: [ main ]
    paths:
      - 'services/**'
      - '.github/workflows/**'

只有推到 main 且動到服務程式碼或流水線本身時才觸發。單純改 README.md 或文件?不跑,省下來的額度拿去跑正事。

(小提醒:helm/ 的變動也刻意觸發 image 重建——部署設定的變更由 ArgoCD 直接同步,不需要重新建置,這是 Day 17 GitOps 的伏筆。)

3. Matrix Strategy:六個服務平行建置

Wafer BI 是異構微服務,Java、Python、Node.js、React 的建置方式完全不同。一個一個排隊建,等到天荒地老。matrix 策略讓 GitHub 同時開六台 VM 平行處理:

strategy:
  matrix:
    service: [wafer-bi-backend, wafer-bi-frontend, api-gateway, user-service, ai-mcp-service, license-service]
    include:
      - service: wafer-bi-backend
        context: ./services/wafer-bi
      - service: user-service
        context: ./services/user-service
      # ...每個服務對應自己的 build context

搭配 GHA 專屬的 Docker layer 快取(還記得 Day 3 的 Layer 快取嗎?CI 上也吃得到):

- name: Build and Push
  uses: docker/build-push-action@v5
  with:
    context: ${{ matrix.context }}
    push: true
    tags: |
      ghcr.io/${{ needs.setup.outputs.owner_lc }}/${{ matrix.service }}:latest
      ghcr.io/${{ needs.setup.outputs.owner_lc }}/${{ matrix.service }}:${{ github.sha }}
    cache-from: type=gha
    cache-to: type=gha,mode=max

每個 image 都會打上兩個 tag:latestcommit SHA。SHA tag 是關鍵——它讓每次部署都能精準對應到某一個 commit,回滾的時候你會感謝它。

4. 實際跑起來長什麼樣

這條流水線陪我走了兩百多次 build。看看 Actions 頁面:

https://ithelp.ithome.com.tw/upload/images/20260817/20182549YD1RtwEpL2.png

▲ GitHub Actions:236 次 workflow runs,有綠勾也有紅叉——紅叉都是學費

對,你沒看錯,中間有一整排紅色叉叉(#230~#232 連三敗,哭啊)。那是當時在調 Ollama 部署跟 license-service 的 Vault 依賴,每次失敗 CI 都第一時間擋下來——這正是 CI 的價值:爛 code 在 CI 就死,不會活著走到 production

點進最新一次成功的 run,可以看到完整的流水線視覺化:

https://ithelp.ithome.com.tw/upload/images/20260817/20182549Q2VH3vk5Zi.png

▲ Run #235:setup → 6 個服務平行建置 → deploy-trigger,總耗時 3 分 19 秒

setup 4 秒 → 六個服務平行建置 → deploy-trigger 5 秒收尾,總計 3 分 19 秒。如果六個服務串行跑,light 說也要 15~20 分鐘,matrix 直接把時間砍成零頭。

5. 最後一棒:deploy-trigger

流水線的最後一個 job 會把新的 image SHA 回寫到 helm/wafer-bi/values.yaml

- name: Bump image tags in Helm values
  run: |
    for key in waferBackend waferFrontend apiGateway userService aiMcpService licenseService; do
      yq -i ".${key}.image.tag = \"${{ github.sha }}\"" helm/wafer-bi/values.yaml
    done
    git add helm/wafer-bi/values.yaml
    git commit -m "deploy: bump image tags to ${GITHUB_SHA:0:7} [skip ci]"
    git push

注意那個 [skip ci]——不加的話這個 commit 又會觸發下一輪 build,無限輪迴到 GitHub 額度燒光為止(別問我怎麼知道的)。

至於這個 commit 推上去之後會發生什麼魔法?賣個關子:Git 一變,某個住在叢集裡的傢伙就會自己動起來。Day 17,GitOps 與 ArgoCD 正式登場!


上一篇
[Day 14] 自癒能力:Liveness 與 Readiness Probes 的設計思維 —— 讓 K8S 知道何時該重啟服務,何時該引導流量。
下一篇
[Day 16] CI/CD 自動化 (二):多架構 (Multi-Arch) Docker Image 構建 —— 支援 ARM 與 AMD64,讓 Image 在各種節點都能跑。
系列文
從零到一:使用 K8S + GitOps 打造異構技術棧的資料分析平台17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言