Turborepo logo

建構 CI

Turborepo 加快了您持續整合管線中所需的建置、程式碼檢查、測試和任何其他任務的速度。透過平行處理和遠端快取,Turborepo 使您的 CI 速度顯著提升。

如需了解如何將您的 CI 供應商連接到遠端快取並執行任務的範例,請參閱我們的 CI 指南

啟用遠端快取

若要為您的 CI 啟用遠端快取,請設定環境變數,讓 Turborepo 可以存取您的遠端快取。

環境變數描述
TURBO_TOKEN用於存取遠端快取的 Bearer 權杖
TURBO_TEAM與您的儲存庫相關聯的帳戶名稱。當使用 Vercel 遠端快取時,這是您的團隊 Slug

當您透過 turbo 執行任務時,您的 CI 將能夠命中快取,從而加快您的管線速度。

遠端快取託管

Vercel 的內建 CI/CD 會自動連接到您管理的 Vercel 遠端快取,無需任何設定。若要取得權杖以將您的其他 CI 供應商連接到 Vercel 遠端快取,請參閱 Vercel 遠端快取文件

如需自託管遠端快取選項,請參閱 Turborepo 的遠端快取文件

在 CI 中執行任務

透過turbo 全域安裝到您的開發和 CI 機器上,您可以使用一個心智模型來執行您的整個儲存庫,從開發到交付。您在 turbo.json 中註冊的任務在 CI 中將完全相同地運作。

  • 如需有關如何設定任務的更多資訊,請參閱設定任務頁面。
  • 如需在 CI 中執行任務的範例,請參閱我們的 CI 指南

篩選入口點

您可以使用 --filter 旗標來篩選您的任務,這與您在本機使用 turbo 時完全相同。CI 中支援依套件、目錄和 Git 歷史記錄進行篩選。

在 CI 中使用 Git 歷史記錄

僅當機器上提供歷史記錄時,才能使用原始碼控制變更進行篩選。如果您使用的是淺層複製,則不會提供歷史記錄。

您也可以使用 --affected 旗標,僅在具有變更的套件中執行任務。

Docker

Docker 是許多部署管線的重要組成部分。Turborepo 的 prune 子命令透過從您的映像檔中移除不必要的依賴項和程式碼,協助您交付輕量級映像檔。

如需更多關於如何從具有 Docker 的 Turborepo 部署的資訊,請參閱專門的 Docker 指南

跳過任務和其他不必要的工作

僅執行受影響的任務

您可以使用 --affected 旗標僅執行具有變更的任務。

終端機
turbo run build --affected

您會在以下情況下想要使用此旗標:

  • 您在您的 Monorepo 中的多個套件中執行許多任務,並且只想在具有程式碼變更的套件中執行這些任務。
  • 沒有使用遠端快取,但仍然希望在 CI 中盡可能少做工作。
  • 使用遠端快取,並且您在一個大型儲存庫中。透過最大限度地減少將從快取還原的任務量,將減少跨網路傳送的資料量,從而加快快取還原速度。
  • 您已經在使用進階篩選技術turbo-ignore來建立與 --affected 相同或相似的行為。您可能有機會使用這個新旗標來簡化您的腳本。
    • --affected 將比自訂篩選更優雅地處理淺層複製,因為它會回退到執行所有任務。

在 GitHub Actions 中使用 --affected

CI/CD 管線是使用 --affected 的完美場所。透過 --affected,Turborepo 可以透過檢查 GitHub 設定的環境變數(例如 GITHUB_BASE_REF)來自動偵測您是否在 GitHub Actions 中執行。

在 PR 的上下文中,這表示 Turborepo 可以判斷哪些套件在 PR 的基礎分支和 PR 的 head 分支之間發生了變更。這讓您可以僅針對受 PR 中變更影響的套件執行任務。

雖然 GITHUB_BASE_REFpull_requestpull_request_target 事件中運作良好,但在常規 push 事件中不可用。在這些情況下,我們使用 GITHUB_EVENT_PATH 來判斷要將您的提交與哪個基礎分支進行比較。在強制推送和推送沒有額外提交的分支時,我們會與分支上第一個提交的父級進行比較。

使用 turbo-ignore

隨著您的程式碼庫和 CI 的成長,您可能會開始尋找更多方法來變得更快。雖然命中快取很有用,但您也可能能夠完全跳過工作。使用 turbo-ignore,您可以跳過冗長的容器準備步驟,例如依賴項安裝,這些步驟最終會導致命中快取。

簽出儲存庫

首先複製您的儲存庫。請注意,為了進行比較,必須使用具有您計劃使用的複製深度的歷史記錄進行複製。

小知識: 

預設情況下,turbo-ignore 使用父提交。若要自訂更多深度,請參閱turbo-ignore 參考文件

為套件和任務執行 turbo-ignore

預設情況下,turbo-ignore 將在目前的工作目錄中使用 build 任務。

  • 若要檢查不同任務的變更,請使用 --task 旗標。
  • 若要檢查特定套件及其依賴項的變更,請新增套件名稱作為引數。

透過新增 web 套件作為引數,檢查 web 套件及其依賴項的 build 任務的變更

終端機
npx turbo-ignore web

處理結果

如果在套件或其內部依賴項中偵測到變更,turbo 將以 1 狀態碼結束。如果未偵測到變更,它將以 0 結束。

使用此狀態碼,您可以選擇 CI 管線的其餘部分應執行哪些操作。例如,1 結束代碼可能表示您應該繼續安裝依賴項並執行任務。

如需更進階的使用案例,請參閱turbo-ignore 參考文件

最佳實務

仰賴快取

Turborepo 的快取能力讓您可以建立快速且複雜度最低的 CI 管線。透過遠端快取和使用 --filter 旗標來鎖定要建置的套件,Turborepo 將處理大型 Monorepo 的變更偵測,且幾乎沒有額外負荷。

例如,您的 CI 可以執行以下兩個命令來快速處理品質檢查並建置您的目標應用程式

  • turbo run lint check-types test:為您的整個儲存庫執行品質檢查。任何未變更的套件都將命中快取。
  • turbo build --filter=web:使用您在 turbo.json 中註冊的 build 任務來建置 web 套件。如果 web 套件或其依賴項未變更,則建置也將命中快取。

隨著您的程式碼庫擴展,您可能會發現更多特定的機會來最佳化您的 CI - 但仰賴快取是一個很好的起點。

CI 中的全域 turbo

在 CI 工作流程中使用全域 turbo 很方便,讓您可以輕鬆執行特定於您的 CI 的命令,並充分利用自動工作區範圍劃定

但是,在某些情況下,您可能會在使用套件管理器安裝套件之前執行 turbo 命令或使用 turbo 的腳本。其中一個範例是使用 turbo prune 來建立 Docker 映像檔。在這種情況下,全域 turbo 將無法使用來自 package.json 的版本,因為該版本的二進位檔尚未安裝。

因此,我們建議您將 CI 中全域安裝的 turbo 固定到 package.json 中的主要版本,因為主要版本內不會引入重大變更。您也可以選擇透過固定確切版本來增加穩定性,但需要權衡維護負擔才能接收修補程式版本中的錯誤修正。

在 CI 中使用 turbo run

turbo run 是您在使用 Turborepo 時最常用的命令,因此為了方便起見,它被別名為 turbo。雖然這對於在本機工作很棒,但 turbo 還有其他子命令,例如 turbo pruneturbo generate

我們一直致力於使 turbo 變得更好,因此我們將來可能會新增更多子命令。因此,您可以透過在 CI 中使用 turbo run 來防止命名衝突。

例如,如果您的 CI 管線中有 turbo deploy 命令,則它可能會與直接建置到 turbo CLI 中的潛在 deploy 子命令衝突。為避免這種情況,請在您的 CI 管線中使用 turbo run deploy 來代替。

疑難排解

命中快取導致建置失敗

如果您的任務在未命中快取時通過,但在命中快取時失敗,則您可能沒有正確設定您任務的outputs

部署時使用錯誤的環境變數

如果您沒有為您的任務定義 envglobalEnv 鍵,則 Turborepo 將無法在建立雜湊時使用它們。這表示您的任務可能會命中快取,即使它處於不同的環境中。

檢查您的設定中是否有 envglobalEnv 鍵。

下一步

您現在擁有使用 Turborepo 交付應用程式所需的一切。若要了解有關特定使用案例的更多資訊,請查看指南深入了解核心概念