分散工作執行 (DTE)
透過 快取 及 --since
旗標,Lerna 可縮短平均 CI 時間。不過,這些功能並無法應對最糟的情況。當儲存庫核心中的某些項目已修改,且 CI 中的每項工作都需要執行時,唯一可以改善效能的方式就是增加更多代理人作業並有效率地並行執行各項工作。
並行執行的最明顯方法,就是按工作類型來分拆工作:在一個作業上執行所有測試,在另一個作業上執行所有建置,並在第三個作業上執行所有程式碼檢查工作。這種策略稱為分箱。如果某些測試工作前置條件為建置工作的話,可能會讓建置工作變得困難,但假設您設法找出處理方法,則典型的設定看起來會像是下方的圖示。在此,測試工作會延後執行,直到所有必要的建置產出都準備就緒,但建置和程式碼檢查工作可以立即開始。
分箱方式的問題在於,最後會有一個或多個作業空閒。Nx 的分散工作執行會根據工作的平均執行時間,將每個個別工作指派給代理人作業,進而將空閒時間減少到最低限度。Nx 亦保證,會按正確順序執行工作,並使用分散式快取,以確保每個需要先前工作建置產出的代理人作業中,都有這些建置產出。
當您設定 Nx 的分散工作執行後,工作圖形看起來會更像這樣
而且,CI 的速度不僅會更快,而且就像你在單一工作中執行所有 CI 一樣,偵錯體驗也不會改變。這是因為 Nx 使用分散快取,於主工作中重新建立所有記錄和建置產出。
在這個 詳細指南中 找到更多資訊,以改善你的最差情況 CI 時間。
設定
若要分配你的工作執行,你需要 (1) 連線到 Nx Cloud 和 (2) 在你的 CI 工作流程中啟用 DTE。每個步驟都能使用單一指令啟用
nx connect-to-nx-cloud
nx generate @nrwl/workspace:ci-workflow --ci=github
--ci
旗標可能是 github
、circleci
或 azure
。若要深入了解如何設定 DTE,請閱讀 此指南。
CI 執行流程
分散工作執行可以在任何 CI 提供者上執行。你負責在你的 CI 系統中啟動工作。然後,Nx Cloud 會協調這些工作的執行方式。你需要在你的 CI 系統中建立兩種不同的工作。
- 一個主工作,用以控制哪些工作會執行
- 多個實際執行工作的代理工作
主工作執行流程如下
# Coordinate the agents to run the tasks
- npx nx-cloud start-ci-run
# Run any commands you want here
- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main
# Stop any run away agents
- npx nx-cloud stop-all-agents
代理工作執行流程非常簡單
# Wait for tasks to execute
- npx nx-cloud start-agent
主工作看起來或多或少與你未曾使用任何分配相同。你只需要做的就是在開頭呼叫 npx nx-cloud start-ci-run
,並在結尾呼叫 npx nx-cloud stop-all-agents
(選擇性)。
代理工作執行長執行中的 start-agent
處理,執行所有與特定 CI 執行關聯的工作。你只需要做的就是呼叫 npx nx-cloud start-agent
,就能設定這些工作。這個處理會一直執行,直到 Nx Cloud 指示它終止。
請注意,主工作和代理工作具有相同的環境和相同的原始程式碼非常重要。它們大約在同一時間開始。並且,一旦主工作完成,所有代理都會停止。
請務必注意,Nx Cloud 代理不是機器,而是在機器上執行的長執行中處理。換句話說,Nx Cloud 沒有管理你的代理,你必須在你的 CI 組態中進行管理(請查看下方的 CI 範例)。
Nx Cloud 是一個協調器。主工作會告訴 Nx Cloud 你想要執行什麼,然後 Nx Cloud 會將那些工作分配到各個代理。Nx Cloud 會自動從一個代理移動檔案到另一個代理,從代理移動檔案到主工作。
最終的結果是,當主工作完成 lerna run build --since=main
時,在代理上建立的所有檔案產出都會複製到主工作,就像主工作已在本地建置所有內容一樣。
並行執行
--concurrency
會傳送至代理程式。例如:npx lerna run build --since=main --concurrency=3 --dte
告訴 Nx Cloud 在每個代理程式中並行執行最多 3 個建置目標。因此,假設你有 10 個代理程式,則你將在所有代理程式中並行執行多達 30 個建置。
你也會想要並行執行盡可能多的指令。例如,
- lerna run lint --since=main
- lerna run test --since=main
- lerna run build --since=main
比下列差:
- lerna run lint --since=main & lerna run test --since=main & lerna run build --since=main
後者會在同一時間排程所有三個指令,因此,如果某個代理程式找不到任何要建置的項,它將會開始執行測試和 lints。結果就是能更好地利用代理程式,並縮短 CI 時間。
CI/CD 範例
以下範例說明如何使用 Nx 和 Nx Cloud 設定 CI,並使用分散式工作任務執行和分散式快取。
每個組織以不同的方式管理其 CI/CD 管線,因此範例沒有涵蓋 CI/CD 的組織特定面向(例如部署)。它們主要針對正確設定 Nx。
請閱讀指南,瞭解如何在 CI 中設定這些指南的更多資訊。
請注意,只有可快取的作業才能分散,因為它們必須在主工作中重播。