如何設計與實作 Monorepo 的 Github Workflow?
前言
有鑑於越來越多人使用 monorepo,想研究一下,當只有針對某個 project 有程式碼的異動時,如何實踐 CI/CD
什麼是 monorepo?
- 顧名思義,mono 表示一個,repo 表示 repository,也就是一個 repository 包含多個 projects,並且清楚定義它們之間的關係
- 例如前後端開發,將前後端的程式都放在同一個 repository,就是
monorepo - 結構大致上會呈現如下圖,這次舉例有兩個 app 在同一個 repository 中
- 想知道必用的原因、好處或採坑紀錄,可先參考 👇
如何設計 Github workflow?
-
參考Creating separate monorepo CI/CD pipelines with GitHub Actions,
-
以 project 來區分 workflows 檔案,有 db.yaml、gateway.yaml 以及worker.yaml,如下圖
-
當 gateway application 有程式碼異動,只能執行 gateway.yaml,測試或 build gateway image 等

-
實作
-
Github Workflow YAML 檔案中是以
on定義,哪些 events 可以去 trigger 一個 workflow,因此我們需要在這邊動一些手腳,讓他只有在異動特定 application 時才會執行 workflow -
利用 workflow syntax
paths指定範圍,當 pet app 底下的檔案有異動,執行這個 workflowpaths: - 'apps/pet/**' -
如果想要再加入指定環境呢?比如指定
stage或main,可以利用 branches 的 workflow syntaxbranches: ['stage'] -
結合以上,整個看起來應該會像這樣,指定在
stage的 pet app 有程式碼變化時,執行這個 workflowon: push: branches: ['stage'] paths: - 'apps/pet/**' -
那如果是用
pull request呢?on: push: branches: ['stage'] paths: - 'apps/pet/**' pull_request: branches: ['stage']
我如何設計?
- 根據
兩種環境 stage 與 main,以及兩種 app,總共會有 4 組 workflow yaml 檔案stage-app1.ymlstage-app2.ymlmain-app1.ymlmain-app1.yml
注意事項
- ❗ “You must store workflow files in the .github/workflows directory of your repository.”
- Github Workflow 只支援第一層的 workflow yaml 檔案
- 也就是,以下圖的結構來放 workflow 檔案,Github 是不會執行的任何 workflow 的

- 官方文件說明
心得
經過這次,除了了解 monorepo 外,對於 Github Actions 的 Workflow syntax 更多的認識。
參考資料 👐
- Creating separate monorepo CI/CD pipelines with GitHub Actions
- what-is-a-monorepo
- monorepo 之我見
- 更多 workflow syntax 介紹
🍀 最後,若喜歡我的分享,可以免費幫我按讚,是對我最大的鼓勵! ✨ ✨ ✨
