本頁說明密封、使用密封版本的優點,以及識別建構作業中非密封行為的策略。
總覽
發現相同的輸入原始碼和產品設定時,密封建構系統會一律將建構作業從變更與主機系統隔離,藉此傳回相同的輸出內容。
為了隔離建構作業,密封版本對於安裝於本機或遠端主機機器上的程式庫和其他軟體無關。而是取決於特定版本的建構工具 (例如編譯器),以及程式庫 (例如程式庫)。這會讓建構程序保持獨立,因為不依賴建構環境外部的服務。
密封的兩個重要面向如下:
- 隔離:密封建構系統會將工具視為原始碼。可下載工具副本並管理其儲存空間,並在代管檔案樹狀結構中使用。這樣會在主機機器與本機使用者之間建立區隔,包括已安裝的語言版本。
- 來源身分:密封建構系統會嘗試確保輸入的相同。程式碼存放區 (例如 Git) 會使用專屬的雜湊程式碼識別多組程式碼異動。密封建構系統會使用此雜湊來識別建構輸入內容的變更。
優點
密封建物的主要優點如下:
- 速度:您可以快取動作的輸出內容,而且除非輸入內容變更,否則不必再次執行動作。
- 平行執行:對於指定的輸入和輸出,建構系統可建構所有動作的圖表,以便計算效率和平行的執行作業。建構系統會載入規則並計算動作圖表和雜湊輸入內容,藉此在快取中查詢。
- 多個建構:您可以在同一部機器上建構多個密封建構,每個版本都使用不同的工具和版本。
- 可重現性:密封建構適合用於疑難排解,因為您瞭解產生該版本的確切條件。
辨別非密封性質
如果您正在準備改用 Bazel,如果預先改善現有建構作業的完整性,遷移作業就能更加輕鬆。在建構作業中,非樣式的常見來源如下:
.mk
個檔案中進行仲裁- 非確定性建立檔案的動作或工具,通常涉及建構 ID 或時間戳記
- 不同主機的系統二進位檔 (例如原生 C++ 規則自動設定的
/usr/bin
二進位檔、絕對路徑、系統 C++ 編譯器) - 在建構期間寫入來源樹狀結構。這樣做可避免將相同的來源樹狀結構用於其他目標。第一個建構作業會寫入來源樹狀結構,修正目標 A 的來源樹狀結構。然後嘗試建構目標 B 可能會失敗。
非密封建構問題疑難排解
從本機執行作業開始,影響本機快取命中的問題會顯示非典型動作。
- 確保空值依序建構:如果您執行
make
並成功建構,再次執行建構時不應重新建構任何目標。如果您在不同的系統上執行每個建構步驟兩次,或比較檔案內容的雜湊結果,取得差異的結果,則建構無法重現。 - 執行相關步驟,從各種潛在用戶端機器對本機快取命中進行偵錯,確保不會發生用戶端環境外洩到動作的任何情況。
- 在 docker 容器中執行建構作業,該容器只包含已勾選的原始碼樹狀結構,以及主機工具明確清單。建構中斷和錯誤訊息會擷取隱含系統依附元件。
- 使用遠端執行規則找出並修正密封問題。
- 針對每次動作層級啟用嚴格的沙箱機制,因為建構作業中的動作可能具有狀態,並且會影響建構或輸出內容。
- 工作區規則可讓開發人員將依附元件新增至外部工作區,但內容必須夠豐富,才能在程序中進行任意處理。只要在 Bazel 指令中新增旗標
--experimental_workspace_rules_log_file=PATH
,即可在 Bazel 工作區規則中取得一些可能的非密封動作記錄。
Bazel 的遺傳
如要進一步瞭解其他專案如何透過 Bazel 使用密封建構作業的成功經驗,請參閱下列 BazelCon 講座:
- 使用 Bazel 建構即時系統 (SpaceX)
- Bazel Remote Execution 與遠端快取 (Uber 和 TwoSigma)
- 利用遠端執行和快取加快建構速度
- 融合 Bazel:加快漸進式建構速度
- Remote Execution 與本機執行作業
- 改善遠端快取的可用性 (IBM)
- 使用 Bazel 打造自動駕駛汽車 (BMW)
- 使用 Bazel 和問與答打造自動駕駛汽車 (GM 郵輪)