在 WORKSPACE 規則中找出非跟密行為的行為

回報問題 查看來源 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

在下文中,主機是指執行 Bazel 的機器。

使用遠端執行時,實際的建構和/或測試步驟不會在主機上進行,而是傳送至遠端執行系統。不過,解決工作區規則的步驟是在主機上進行。如果工作區規則會存取主機的相關資訊,以便在執行期間使用,則環境不相容可能會導致建構作業中斷。

調整 Bazel 規則以供遠端執行時,您需要找出這類工作區規則並修正。本頁說明如何使用工作區記錄,找出可能造成問題的工作區規則。

找出非密封規則

工作區規則可讓開發人員將依附元件新增至外部工作區,但這些規則已足夠豐富,可讓任意處理程序在過程中發生。所有相關指令都會在本機執行,可能導致非密封性。通常非密封行為是透過 repository_ctx 導入,可與主機互動。

從 Bazel 0.18 開始,您可以在 Bazel 指令中新增 --experimental_workspace_rules_log_file=[PATH] 標記,取得部分可能非密封動作的記錄。其中 [PATH] 是要建立記錄的檔案名稱。

注意事項:

  • 記錄檔會擷取事件的執行情況。如果某些步驟已快取,就不會顯示在記錄中,因此如要取得完整結果,請務必事先執行 bazel clean --expunge

  • 有時函式可能會重新執行,這時相關事件會在記錄中多次顯示。

  • Workspace 規則目前只會記錄 Starlark 事件。

如要查看工作區初始化期間執行的內容,請按照下列步驟操作:

  1. 執行 bazel clean --expunge。 此指令會清除本機快取和所有快取存放區,確保所有初始化作業都會重新執行。

  2. --experimental_workspace_rules_log_file=/tmp/workspacelog 加入 Bazel 指令,然後執行建構作業。

    這會產生二進位 proto 檔案,列出 WorkspaceEvent 類型的訊息

  3. 下載 Bazel 原始碼,並使用以下指令前往 Bazel 資料夾。需要透過原始碼使用 workspacelog 剖析器來剖析工作區記錄檔。

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
  4. 在 Bazel 原始碼存放區中,將整個工作區記錄檔轉換為文字。

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
  5. 輸出內容可能相當冗長,且包含內建 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
  6. 開啟 /tmp/workspacelog.txt 並檢查不安全的操作。

記錄檔包含 WorkspaceEvent 訊息,其中列出在 repository_ctx 上執行的特定潛在非密封動作。

以下是可能非密封的動作:

  • execute:在主機環境中執行任意指令。檢查這些項目是否會對主機環境造成任何依附元件。

  • downloaddownload_and_extract:為確保建構作業密封,請務必指定 sha256

  • filetemplate:這本身並非非密封,但可能是將主機環境的依附元件導入存放區的機制。請務必瞭解輸入內容的來源,且輸入內容不得依附於主機環境。

  • os:這本身並非非密封式,但可輕鬆取得主機環境的依附元件。一般來說,完整建構作業不會呼叫這個函式。評估使用情形是否密封時,請注意這是在主機上執行,而非在工作站上執行。一般來說,從主機取得環境詳細資料並非遠端建構作業的理想做法。

  • symlink:這通常很安全,但請留意警訊。如果符號連結指向存放區外部或絕對路徑,遠端工作站就會發生問題。如果根據主機電腦屬性建立符號連結,可能也會造成問題。

  • which:檢查主機上安裝的程式通常會有問題,因為工作人員的設定可能不同。