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

回報問題 查看來源

在下列指令中,主體機器就是執行 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:由於工作站可能採用不同的設定,檢查安裝在主機上的程式通常都會發生問題。