建立代碼推送後的第一道防線,確保品質不退化。
如果每次改完 code 都要手動 docker build 六個服務、手動推 Registry、手動改部署檔的 tag……不僅浪費工程師寶貴的生命,還超容易出錯(推錯分支、忘記改 tag、六個服務漏推一個)。
所以我們需要 Continuous Integration,讓機器人代勞。我們選 GitHub Actions——跟 code 放在同一個地方,整合度最好,而且 public repo 免費額度很夠用。
在 .github/workflows/deploy.yml 中設定觸發條件:
on:
push:
branches: [ main ]
paths:
- 'services/**'
- '.github/workflows/**'
只有推到 main 且動到服務程式碼或流水線本身時才觸發。單純改 README.md 或文件?不跑,省下來的額度拿去跑正事。
(小提醒:helm/ 的變動也刻意不觸發 image 重建——部署設定的變更由 ArgoCD 直接同步,不需要重新建置,這是 Day 17 GitOps 的伏筆。)
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:latest 跟 commit SHA。SHA tag 是關鍵——它讓每次部署都能精準對應到某一個 commit,回滾的時候你會感謝它。
這條流水線陪我走了兩百多次 build。看看 Actions 頁面:

▲ GitHub Actions:236 次 workflow runs,有綠勾也有紅叉——紅叉都是學費
對,你沒看錯,中間有一整排紅色叉叉(#230~#232 連三敗,哭啊)。那是當時在調 Ollama 部署跟 license-service 的 Vault 依賴,每次失敗 CI 都第一時間擋下來——這正是 CI 的價值:爛 code 在 CI 就死,不會活著走到 production。
點進最新一次成功的 run,可以看到完整的流水線視覺化:

▲ Run #235:setup → 6 個服務平行建置 → deploy-trigger,總耗時 3 分 19 秒
setup 4 秒 → 六個服務平行建置 → deploy-trigger 5 秒收尾,總計 3 分 19 秒。如果六個服務串行跑,light 說也要 15~20 分鐘,matrix 直接把時間砍成零頭。
流水線的最後一個 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 正式登場!