在以下說明中,主機是指執行 Bazel 的機器。
使用遠端執行作業時,實際的建構和/或測試步驟並不會在主機上執行,而是會傳送至遠端執行系統。不過,解析工作區規則的步驟會在主機上執行。如果您的工作區規則會存取主機機器的相關資訊,以便在執行期間使用,由於環境之間不相容,因此您的建構作業可能會中斷。
調整 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 剖析器剖析 Workspace 記錄檔。
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
:這並非不具密封性,而是取得主機環境依附元件的簡單方法。密封式版本通常不會呼叫這個方法。在評估使用情形是否密封時,請注意這項作業是在主機上執行,而非在 worker 上執行。對於遠端建構作業來說,從主機取得環境特定資訊通常不是個好主意。symlink
:這通常是安全的,但請留意警訊。任何指向存放區外或絕對路徑的符號連結都會導致遠端工作站發生問題。如果是根據主機機器屬性建立符號連結,也可能會發生問題。which
:檢查主機上安裝的程式通常會出現問題,因為 worker 可能有不同的設定。