針對遠端執行調整 Bazel 規則

回報問題 查看來源 夜間 7.2 7.1 7.0 6.5 6.4

本頁內容適用於編寫自訂建構和測試規則的 Bazel 使用者 瞭解 Bazel 規則的必要條件 遠端執行。

遠端執行可讓 Bazel 在獨立的平台上執行動作 基礎架構Bazel 會使用 gRPC 通訊協定 用於遠端執行您可以透過以下項目,嘗試遠端執行作業: bazel-buildfarm、 一項開放原始碼專案,旨在提供分散式遠端執行作業 平台。

本網頁使用以下術語來說明 環境類型或平台

  • 主機平台 - Bazel 的執行位置。
  • 執行平台:執行 Bazel 動作的位置。
  • 目標平台:建構輸出內容 (和一些動作) 執行的位置。

總覽

為遠端執行作業設定 Bazel 建構作業時,請務必遵循 按照本頁所述指南進行,確保建構作業能從遠端執行 發生錯誤。這是因為遠端執行作業的特性,即:

  • 隔離的建構動作。建構工具不會保留狀態和依附元件 無法洩漏

  • 多種執行環境本機建構設定不一定 適用於遠端執行環境。

本頁說明導入自訂 Bazel 時可能發生的問題 為遠端執行建立及測試規則,以及如何避免這些規則。它涵蓋 下列主題:

透過工具鍊規則叫用建構工具

Bazel 工具鍊規則是一種設定提供者,可告知建構規則的內容為何 建構工具 (例如編譯器和連結器),以使用及設定這些工具 使用規則建立者定義的參數。工具鍊規則允許建構 和測試規則,以可預測且預先設定的方式叫用建構工具 並與遠端執行相容例如使用工具鍊規則 而不是透過 PATHJAVA_HOME 或其他本機 如果變數並未在遠端設定成相等值 (或完全不設定) 該變數, 執行環境

Bazel 建構作業和測試規則目前已有工具鍊規則 ScalaRust、 然後 Go, 以及新工具鍊規則應用到其他語言和工具 bash。 如果規則所用工具不存在工具鍊規則,請考慮 建立工具鍊規則

管理隱含依附元件

如果建構工具可以存取不同建構動作的依附元件,這些動作將 因執行每個遠端建構動作而導致遠端執行失敗 彼此區隔部分建構工具會在建構動作和 存取工具中未明確包含的依附元件 叫用,讓遠端執行的建構動作失敗。

舉例來說,當 Bazel 指示有狀態編譯器在本機建構 foo 時, 編譯器會保留 foo 的建構輸出內容參照。當 Bazel 導致 指示編譯器建構依附於 foobar,但沒有 明確指出該依附元件會納入 BUILD 檔案中 編譯器叫用時,只要 編譯器執行個體會同時對兩個動作執行 (如同本機執行作業的常見做法)。 然而,因為在遠端執行的情況下,每個建構動作都會執行 獨立編譯器執行個體、編譯器狀態和 bar 的隱含依附元件 foo 將會遺失,建構作業也會失敗。

為協助偵測及排除這些依附元件問題,Bazel 0.14.1 提供了 或本機 Docker 沙箱,兩者對依附元件的限制相同 使用沙箱,讓版本在以下時間前進行遠端執行: 識別及解決與依附元件相關的建構錯誤。請參閱搭配 Docker Sandbox 使用 Bazel Remote Execution 疑難排解一文。 瞭解詳情

管理平台相依的二進位檔

一般來說,在主機平台上建構的二進位檔無法安全地在 完全遠端執行平台,因為依附元件可能不相符。 例如,由 Bazel 提供的 SingleJar 二進位檔指定主機平台。 不過,如要執行遠端執行作業,必須將 SingleJar 編譯為程序的一部分。 讓它以遠端執行平台為目標。(請參閱 目標選取邏輯)。

不要隨原始碼提供建構作業所需的建構工具二進位檔 除非您確定它們會在您的執行平台中安全地執行相反地 下列其中一項:

  • 寄送或對外參照工具原始碼,以便 專為遠端執行平台打造

  • 將該工具預先安裝至遠端執行環境 (例如, 工具鍊容器),並將其執行時,請使用工具鍊規則執行。 建構項目

管理設定樣式的 WORKSPACE 規則

Bazel 的 WORKSPACE 規則可用來探測主機平台的工具 和建構所需的程式庫 (在本機建構中) 也是 Bazel 執行平台如果建構明確依附本機建構工具 如果遠端執行平台 與代管平台不同

與「WORKSPACE」規則執行的下列動作不相容: 遠端執行:

  • 建構二進位檔。WORKSPACE 規則中執行編譯動作 導致與遠端執行平台不相容的二進位檔 (與代管平台不同)。

  • 正在安裝 pip 套件。透過「WORKSPACE」安裝 pip 個套件 而其依附元件必須預先安裝在主機平台上。 這類專為代管平台打造的套件 與遠端執行平台不相容 (如果與主機不同) 平台。

  • 偽裝成本機工具或構件。連結至工具或程式庫 透過 WORKSPACE 規則建立的主機平台安裝 Bazel 就無法在遠端執行平台上執行建構作業 以便找出他們的位置和位置請改用標準建構動作建立符號連結,以便 您可以透過 Bazel 的 runfiles 存取符號連結的工具和程式庫 。不要使用 repository_ctx.symlink 將目標檔案加入外部存放區目錄以外的符號連結

  • 更改代管平台。請避免在 Bazel 之外建立檔案 runfiles 樹狀結構,建立環境變數,以及類似的動作: 則可能在遠端執行平台上出現非預期的行為。

如要找出潛在的非異質行為,可以使用 Workspace 規則記錄

外部依附元件執行依賴主機的特定作業 平台,應在 WORKSPACE 之間拆分這些作業,並建立 管理規則如下:

  • 平台檢查和依附元件列舉。這些作業 透過 WORKSPACE 規則即可在本機安全地執行,這項功能可以查看 程式庫安裝完成、下載必須建構的套件,然後做好準備 編譯所需的構件如要執行遠端執行作業,這些規則必須 也支援使用預先勾選的構件,以提供 通常是在主機平台檢查時取得。已預先勾選 可讓 Bazel 將依附元件當做本機來描述依附元件。使用 條件陳述式或 --override_repository 旗標。

  • 產生或編譯目標專屬的構件和平台異動。 這些作業必須透過一般建構規則執行。可執行的操作 為外部依附元件產生目標專屬構件時 建構期間

如要更輕鬆地產生用於遠端執行的預先檢查構件,可以使用 WORKSPACE 規則,用於輸出產生的檔案。您可以在每個新的 執行環境 (例如每個工具鍊容器內部),然後檢查 遠端執行建構作業的輸出內容匯入原始碼存放區,以便參照。

例如 Tensorflow 的 cuda 規則 和 pythonWORKSPACE 規則會產生下列 BUILD files。 如要在本機執行,系統會使用檢查主機環境產生的檔案。 針對遠端執行,條件陳述式 環境變數上,規則可使用已簽入的檔案 存放區

BUILD 檔案會宣告 genrules 能在本機和遠端執行,以及執行必要的 之前透過 repository_ctx.symlink 完成,如這裡所示。