在下列指令中,主體機器就是執行 Bazel 的機器。
使用遠端執行功能時,實際的建構和/或測試步驟不會 而是被傳送到遠端執行 有些人會將 Cloud Storage 視為檔案系統 但實際上不是然而,解決 Workspace 規則的步驟仍在進行中 相同的虛擬機器如果您的工作區規則會存取 用於執行作業期間,建構作業可能會因為 並達成協議
做為調整遠端使用的 Bazel 規則的一部分 執行,因此您需要找出這類工作區規則 加以修正本頁說明如何找出可能有問題的工作區 管理規則
找出非密封的規則
工作區規則可讓開發人員將依附元件新增至
但現在更豐富多樣,可以任意處理
在這個過程中會發生什麼事所有相關指令都是在本機執行,且可以是
可能產生非固體的資料來源通常非密封的行為
導入
repository_ctx
,可讓您與
與主體機器相對應
從 Bazel 0.18 開始,您就可以取得某些可能非密封的記錄檔
將標記 --experimental_workspace_rules_log_file=[PATH]
加入
執行 Bazel 指令這裡 [PATH]
是記錄檔,做為記錄
已建立。
注意事項:
而會在事件執行時擷取這些事件。如果 快取的值不會顯示在記錄中,因此如要獲得完整結果,請不要 忘記事先執行
bazel clean --expunge
有時候函式可能會重新執行,此時函式會 事件會多次顯示在記錄中。
Workspace 規則目前只會記錄 Starlark 事件。
如何找出工作區初始化期間所執行的項目:
執行
bazel clean --expunge
。 這個指令會清除您的本機快取 任何快取存放區,確保系統會重新執行所有初始化作業。將
--experimental_workspace_rules_log_file=/tmp/workspacelog
新增至您的 Bazel 指令並執行建構作業。這會產生按類型顯示訊息的二進位 proto 檔案 WorkspaceEvent
下載 Bazel 原始碼,並使用以下指令前往 Bazel 資料夾。您需要原始碼才能剖析 含有 workspacelog 剖析器:
git clone https://github.com/bazelbuild/bazel.git
cd bazel
在 Bazel 原始碼存放區中,將整個工作區記錄轉換為文字。
bazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
輸出內容可能相當詳細,並且包含透過 Bazel 建構的輸出內容 不過,編寫這類演算法並不容易 因為我們無法寫出所有可能的規則
如要從輸出內容中排除特定規則,請使用
--exclude_rule
選項。 例如:bazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \ --exclude_rule "//external:local_config_cc" \ --exclude_rule "//external:dep" > /tmp/workspacelog.txt
開啟
/tmp/workspacelog.txt
並檢查是否有不安全的作業。
記錄檔包含
WorkspaceEvent
訊息,概述會對
repository_ctx
。
標示為可能不密封的動作如下:
execute
:在主機環境中執行任意指令。檢查是否 這些可能會產生主機環境的任何依附元件。download
、download_and_extract
:為確保密封化,請確保 將指定 sha256file
、template
:這本身並非密封的作業,但可做為機制 將主機環境的依附元件導入存放區。 務必瞭解輸入內容的來源,且不能 要視主機環境而定os
:這本身並非密封的作業,而是可以輕鬆取得依附元件的方式 外部 IP 位址隱密版本通常不會有這個意思。 評估用量是否屬於密封時,請記得 在主機上運作,而不是在工作站上。取得環境詳細資訊 通常不建議遠端建構。symlink
:這通常很安全,但是要尋找紅色旗標。任何指向 在存放區外或絕對路徑會導致 遠端工作人員。如果是根據主體機器屬性建立符號連結 也會發生問題which
:檢查安裝在主機上的程式常會發生問題 因為工作站的設定可能不同