文化遺產

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.37.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁將介紹歷史、使用密封建物的優點 識別建構中非密封行為的策略。

總覽

如果選擇相同的輸入原始碼和產品設定,會有一個密封 建構系統一律會從變更中隔離建構作業,傳回相同的輸出內容 複製到主機系統

為了隔離建構作業,密封的建構對程式庫沒有敏感性 本機或遠端主機電腦上安裝的其他軟體。取決於 和依附元件等特定建構工具版本 程式庫這使得建構程序不依賴 建構環境外的服務

特徵的兩個重要層面如下:

  • 隔離:密封建構系統會將工具視為原始碼。他們 下載工具副本、管理儲存空間,以及在受管理的檔案中使用 樹木這項設定會在主機機器和本機使用者之間設立隔離 包括已安裝的語言版本
  • 來源身分:密封建構系統會嘗試確保 輸入內容Git 等程式碼存放區 不重複的雜湊碼。密封建構系統會使用這個雜湊值辨識 建構輸入內容

優點

密封版本的主要優點包括:

  • 速度:可以快取動作的輸出結果,且動作不必 除非輸入內容有所變更,否則再重新執行。
  • 平行執行:對於給定的輸入和輸出內容,建構系統可以 建構所有操作的圖表,計算有效和平行 建構系統會載入規則並計算動作圖 並雜湊輸入內容在快取中查詢
  • 多項建物:您可以在同一個上建構多個密封的建物 每次建構時,都會使用不同的工具和版本。
  • 可重現性:匿名版本適合用於疑難排解,因為您 瞭解產生版本的確切條件

辨別非本質

如果您正在準備改用 Bazel,只要能 「現有版本」先培養神祕學的門學常見的 以下為:

  • .mk 檔案中任意處理
  • 非確定性地建立檔案的動作或工具,通常涉及 版本 ID 或時間戳記
  • 不同主機的系統二進位檔 (例如 /usr/bin 二進位檔、 路徑、原生 C++ 規則自動設定的系統 C++ 編譯器)
  • 在建構期間寫入原始碼樹狀結構。這可避免相同的來源資料 其他目標使用這種樹狀結構第一個建構作業會將資料寫入來源 修正了目標 A 的來源樹狀結構。那麼嘗試建置目標 B 之後 失敗。

排解非密封版本問題

從本機執行開始,會影響本機快取命中的問題會顯示 非密封的動作

  • 確保為空值依序建構:如果您執行 make 並成功建構, 再次執行建構作業不應重建任何目標。如執行每項版本 每執行兩次或不同的系統,請比較檔案內容的雜湊碼 取得不同的結果,就無法重現建構作業。
  • 執行步驟 在本機快取命中偵錯 從多種不同的用戶端機器中存取,以確保您能夠 用戶端環境洩漏到行動中的案例。
  • 在僅含任何內容的 Docker 容器中執行建構作業 已勾選的原始碼樹狀結構和主機工具明確清單。建立服務中斷 錯誤訊息會擷取隱含的系統依附元件。
  • 使用 遠端執行規則
  • 啟用嚴格沙箱機制 計算成效,因為建構作業中的動作可能是有狀態的,且會影響 建構或輸出內容
  • 工作區規則 允許開發人員將依附元件新增至外部工作區 有足夠的豐富內容,讓系統能在此程序中進行任意處理。你可以 以便取得 Bazel 工作區規則中某些可能非密封的動作記錄, 新增標記 --experimental_workspace_rules_log_file=PATH到 執行 Bazel 指令
,瞭解如何調查及移除這項存取權。

可搭配 Bazel 使用

進一步瞭解其他專案如何藉由密封而獲得成功 請使用 Bazel 進行建構,請查看以下 BazelCon 討論: