如何設計與實作 Monorepo 的 Github Workflow?

如何設計與實作 Monorepo 的 Github Workflow?

前言

有鑑於越來越多人使用 monorepo,想研究一下,當只有針對某個 project 有程式碼的異動時,如何實踐 CI/CD

什麼是 monorepo?

  • 顧名思義,mono 表示一個,repo 表示 repository,也就是一個 repository 包含多個 projects,並且清楚定義它們之間的關係
  • 例如前後端開發,將前後端的程式都放在同一個 repository,就是 monorepo
  • 結構大致上會呈現如下圖,這次舉例有兩個 app 在同一個 repository 中
    • apps
  • 想知道必用的原因、好處或採坑紀錄,可先參考 👇

如何設計 Github workflow?

實作

  • Github Workflow YAML 檔案中是以 on 定義,哪些 events 可以去 trigger 一個 workflow,因此我們需要在這邊動一些手腳,讓他只有在異動特定 application 時才會執行 workflow

  • 利用 workflow syntax paths 指定範圍,當 pet app 底下的檔案有異動,執行這個 workflow

      paths:
        - 'apps/pet/**'
    
  • 如果想要再加入指定環境呢?比如指定 stage 或 main,可以利用 branches 的 workflow syntax

      branches: ['stage']
    
  • 結合以上,整個看起來應該會像這樣,指定在 stage 的 pet app 有程式碼變化時,執行這個 workflow

      on:
          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.yml
    • stage-app2.yml
    • main-app1.yml
    • main-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 更多的認識。

參考資料 👐

🍀 最後,若喜歡我的分享,可以免費幫我按讚,是對我最大的鼓勵! ✨ ✨ ✨