在以下範例中,主機機器就是執行 Bazel 的機器。
使用遠端執行功能時,實際的建構和/或測試步驟不會在主體機器上發生,而是傳送到遠端執行系統。不過,解析工作區規則的步驟會在主機機器上發生。如果工作區規則會存取主體機器的相關資訊以便在執行期間使用,則建構可能會因為環境之間的不相容而中斷。
做為針對遠端執行調整 Bazel 規則的過程中,您需要找出並修正這類工作區規則。本頁面說明如何使用工作區記錄找出可能有問題的工作區規則。
找出非密封規則
開發人員可透過工作區規則將依附元件新增至外部工作區,但內容是否足夠豐富,因而能在程序中進行任意處理。所有相關指令都在本機進行,可能會是非密封的可能來源。通常非典型的行為是透過 repository_ctx
導入,即允許與主體機器互動。
從 Bazel 0.18 開始,只要在 Bazel 指令中新增標記 --experimental_workspace_rules_log_file=[PATH]
,就能取得一些可能的非典型動作記錄。以下是 [PATH]
做為要建立記錄的檔案名稱。
注意事項:
記錄檔會在執行事件時擷取。如果部分步驟已快取完成,這些步驟就不會顯示在記錄中,因此為了取得完整結果,不要忘記提前執行
bazel clean --expunge
。有時函式可能會重新執行,在這種情況下,相關事件會多次顯示在記錄檔中。
Workspace 規則目前只會記錄 Starlark 事件。
如何找出在工作區初始化期間執行的項目:
執行
bazel clean --expunge
。這個指令會清除本機快取和任何快取存放區,確保系統會重新執行所有初始化作業。將
--experimental_workspace_rules_log_file=/tmp/workspacelog
新增至 Bazel 指令,然後執行建構作業。這樣會產生二進位 proto 檔案,其中列出 WorkspaceEvent 類型訊息
下載 Bazel 原始碼,並使用以下指令前往 Bazel 資料夾。您需要原始碼,才能利用工作區記錄剖析器剖析工作區記錄。
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
:這本身並不是什麼,而是在主機環境中取得依附元件的簡便方法。密封建構通常不會呼叫此方法。 您在評估用量是否合理,請注意,這項作業是在主機上執行,而不是在工作站上執行。若是遠端建構作業,您通常不建議從主機取得環境專屬資訊。symlink
:這通常安全無虞,但可以尋找紅色標記。任何指向存放區外或絕對路徑的符號連結都會造成遠端工作站發生問題。如果符號連結是根據主機機器屬性建立,可能也會發生問題。which
:檢查安裝在主機上的程式通常有問題,因為工作站可能採用不同的設定。