GitHub Actions 的「複雜化」挑戰

GitHub Actions 很強大,但工作流 YAML 會隨著專案成長而越來越肥大。想從數百行程式碼中看懂「哪個 job 在哪個 job 之後執行」,花費的時間往往遠超預期。

GitHub Actions 可視化工具 只要貼上工作流 YAML,就能立即轉換成 Mermaid 依賴關係圖。所有處理都在瀏覽器內完成,敏感的工作流定義不會傳送到伺服器。

GitHub Actions 工作流可視化:精確理解複雜的流水線

needs 如何轉換成圖

可視化完全是根據每個 job 的 needs 欄位建立的。分散在 YAML 各處的依賴關係會被逐一走訪,轉換成 Mermaid 的箭頭。

jobs:
  lint:
    runs-on: ubuntu-latest
  test:
    needs: lint
  build:
    needs: lint
  deploy:
    needs: [test, build]
graph TD
    lint["lint"]
    test["test"]
    lint --> test
    build["build"]
    lint --> build
    deploy["deploy"]
    test --> deploy
    build --> deploy

一眼就能看出 lint 是瓶頸、test 與 build 平行執行、deploy 是匯流點——流水線的整體形狀一目了然。

needs 可以寫成字串,也可以寫成陣列

GitHub Actions 的規格允許 needs 在只有一個依賴時寫成字串,多個依賴時寫成陣列:

needs: lint            # 寫成字串也可以
needs: [lint, test]    # 寫成陣列也可以

可視化工具兩種寫法都能正確處理,但了解這個小細節,能讓您自己讀 YAML 時不會被搞混。

常見的流水線結構模式

把工作流畫成圖之後會發現,大部分其實都是幾種固定模式的組合:

  • 扇出(平行展開)build 之後 testlintsecurity-scan 同時執行——縮短 CI 時間的基本模式
  • 扇入(匯聚):多個 job 完成後匯聚到 deploy,以 needs: [build, test, lint] 這種方式指定多個依賴
  • Matrix:用 strategy.matrix 把同一個 job 展開成多個版本/作業系統的組合——圖上只是一個節點,實際執行時卻是多個平行 job

畫成圖之後,「明明該平行卻串成序列」「deploy 的 needs 少了品質檢查」這類問題就會浮現出來,成為改善流水線的起點。加速 CI 的具體模式,可參考 GitHub Actions needs 設計模式集

審查時的具體範例

在下面的配置中,deploy 只相依於 test,因此即使 lint 失敗也可能會進入部署。

jobs:
  lint:
    runs-on: ubuntu-latest
  test:
    runs-on: ubuntu-latest
  deploy:
    needs: [test]
    runs-on: ubuntu-latest

畫成圖表後,lint 會顯得獨立,因此更容易討論「品質檢查是否該納入部署的前提條件」。這也能引導出設計決策——是把 deployneeds 改成 [lint, test] 就好,還是要新增 build job 來共享產物。

循環依賴會被 GitHub Actions 本身擋下來

如果 needs 形成迴圈(A 依賴 B、B 依賴 A),GitHub Actions 就完全無法執行該工作流,並回報錯誤。在數百行 YAML 中很難用肉眼發現循環,因此先把依賴關係畫成圖,是實務上最快的捷徑。

常見問題

沒有指定 needs 的 Job 會如何執行?

沒有 needs 的 Job 會在工作流開始時並行執行。若要控制順序,請用 needs: [job-id] 明確指定相依對象。畫成圖表後,獨立執行的 Job 與循序 Job 的邊界一目了然。

相依關係形成循環會怎樣?

needs 形成迴圈,GitHub Actions 將無法執行工作流並回報錯誤。在數百行 YAML 中很難察覺循環,因此將其視覺化為 DAG(有向無環圖)會很有幫助。

把工作流 YAML 貼到外部工具安全嗎?

工作流可能含有密鑰名稱與部署目標等資訊。GitHub Actions 可視化工具 在你的瀏覽器內完成處理,不會將 YAML 傳送到伺服器,因此可安全地將這類檔案繪製成圖。

Matrix 建置會怎麼顯示?

透過 strategy.matrix 展開成多個組合的 job,在定義上仍是同一個 job,因此圖上也只會顯示成一個節點。實際執行時,則會依組合數量平行跑出多個 job,這點請留意。若目的是掌握 needs 的依賴流向,單一節點的呈現方式已經足夠實用。

總結

  • 可視化只是把每個 job 的 needs 轉換成 Mermaid 箭頭,機制本身很單純
  • needs 同時支援字串與陣列兩種寫法
  • 畫成圖之後,能發現「不必要的序列化」「非預期的平行」「循環依賴」
  • 加速 CI 的具體模式,請參考另一篇需求設計模式集文章

當複雜的 job 配置出現錯誤時,先畫成圖重新確認執行順序,往往是最快的排查方式。