建構 CI
Turborepo 加速了建置、程式碼檢查、測試以及您在持續整合管道中需要執行的任何其他任務。透過平行化和遠端快取,Turborepo 使您的 CI 速度顯著加快。
有關如何將您的 CI 供應商連接到遠端快取並執行任務的範例,請造訪我們的CI 指南。
啟用遠端快取
若要為您的 CI 啟用遠端快取,請設定環境變數,讓 Turborepo 可以存取您的遠端快取。
環境變數 | 描述 |
---|---|
TURBO_TOKEN | 用來存取遠端快取的 Bearer 權杖 |
TURBO_TEAM | 與您的儲存庫相關聯的帳戶名稱 |
當您透過 turbo
執行任務時,您的 CI 將能夠命中快取,從而加速您的管道。
遠端快取託管
Vercel 的內建 CI/CD 會自動連接到您託管的 Vercel 遠端快取,無需任何設定。若要取得將您的其他 CI 供應商連接到 Vercel 遠端快取的權杖,請造訪Vercel 遠端快取文件。
有關自行託管的遠端快取選項,請造訪Turborepo 的遠端快取文件。
在 CI 中執行任務
透過在您的開發和 CI 機器上全域安裝 turbo
,您可以使用一個心智模型來執行您的整個儲存庫,從開發到交付。您在 turbo.json
中註冊的任務在 CI 中的運作方式將完全相同。
篩選進入點
您可以使用--filter
旗標來篩選您的任務,就像您在本地使用 turbo
時一樣。CI 中支援依套件、目錄和 Git 歷史記錄進行篩選。
在 CI 中使用 Git 歷史記錄
僅當機器上有歷史記錄時,才能使用來源控制變更進行篩選。如果您使用的是淺層複製,則歷史記錄將不可用。
您也可以使用--affected
旗標來僅執行已變更套件中的任務。
Docker
Docker 是許多部署管道的重要組成部分。Turborepo 的 prune
子命令可透過從您的映像中移除不必要的相依性和程式碼,協助您交付輕量級映像。
有關如何使用 Docker 從 Turborepo 部署的更多資訊,請造訪專用的 Docker 指南。
跳過任務和其他不必要的工作
僅執行受影響的任務
您可以使用 --affected
旗標來僅執行已變更的任務。
您會希望在以下情況下使用此旗標:
- 您在單一儲存庫中跨多個套件執行許多任務,並且只想在具有程式碼變更的套件中執行這些任務。
- 您沒有使用遠端快取,但仍然希望在 CI 中盡可能減少工作量。
- 您有使用遠端快取,並且您在大型儲存庫中。透過最小化從快取還原的任務數量,將減少跨網路傳輸的資料量,從而加快快取還原速度。
- 您已經在使用進階篩選技術或
turbo-ignore
來建立與--affected
相同或類似的行為。您可能可以使用此新旗標來簡化您的腳本。--affected
比自訂篩選更優雅地處理淺層複製,因為它會退回以執行所有任務。
在 GitHub Actions 中使用 --affected
CI/CD 管道是使用 --affected
的理想場所。透過 --affected
,Turborepo 可以透過檢查 GitHub 設定的環境變數 (例如 GITHUB_BASE_REF
) 來自動偵測您是否在 GitHub Actions 中執行。
在 PR 的內容中,這表示 Turborepo 可以判斷 PR 的基礎分支與 PR 的標頭分支之間已變更哪些套件。這讓您可以僅執行受 PR 變更影響的任務。
雖然 GITHUB_BASE_REF
在 pull_request
和 pull_request_target
事件中運作良好,但在一般推送事件期間不可用。在這些情況下,我們使用 GITHUB_EVENT_PATH
來判斷基礎分支以比較您的提交。在強制推送和推送沒有額外提交的分支時,我們會與分支上第一個提交的父項進行比較。
使用 turbo-ignore
隨著您的程式碼庫和 CI 的成長,您可能會開始尋找更快的方法。雖然命中快取很有用,但您也可能可以完全跳過工作。使用 turbo-ignore
,您可以跳過冗長的容器準備步驟,例如相依性安裝,這些步驟無論如何都會導致快取命中。
簽出儲存庫
首先複製您的儲存庫。請注意,對於比較而言,必須複製具有您計劃使用之複製深度的歷史記錄。
了解一下
預設情況下,turbo-ignore
使用父提交。若要自訂更多深度,請參閱turbo-ignore 參考。
針對套件和任務執行 turbo-ignore
預設情況下,turbo-ignore
將在目前的工作目錄中使用 build
任務。
- 若要檢查不同任務的變更,請使用
--task
旗標。 - 若要檢查特定套件及其相依性的變更,請將套件的名稱新增為引數。
透過新增 web
套件作為引數,檢查 web
套件及其相依性的 build
任務是否有變更
有關更進階的用例,請參閱turbo-ignore
參考。
最佳實務
依賴快取
Turborepo 的快取功能讓您能夠以最小的複雜性建立快速的 CI 管道。透過遠端快取和使用 --filter
旗標來鎖定要建置的套件,Turborepo 將以很少的開銷處理大型單一儲存庫的變更偵測。
例如,您的 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 prune
和 turbo generate
。
我們一直致力於改進 turbo
,因此未來可能會新增更多子命令。因此,您可以在 CI 中使用 turbo run
來防止命名衝突。
舉例來說,如果您的 CI 管道中有一個 turbo deploy
命令,它可能會與直接建置在 turbo
CLI 中的潛在 deploy
子命令衝突。為了避免這種情況,請在您的 CI 管道中使用 turbo run deploy
來代替。
疑難排解
快取導致建置失敗
如果您的任務在錯過快取時通過,但在命中快取時失敗,則您可能尚未正確設定任務的outputs
金鑰。
使用錯誤的環境變數進行部署
如果您沒有為任務定義 env
或 globalEnv
金鑰,Turborepo 將無法在建立雜湊時使用它們。這表示您的任務即使在不同的環境中也可能命中快取。
請檢查您的設定中是否有 env
和 globalEnv
金鑰。
下一步
您現在擁有使用 Turborepo 發佈應用程式所需的一切。若要深入了解特定使用案例,請查看指南或深入了解核心概念。
這有幫助嗎?