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

回報問題 查看原始碼 夜間 7.4 ,直接在 Google Cloud 控制台實際操作。 7.3 7.2 7.1 7.0 6.5

在以下說明中,主機是指執行 Bazel 的機器。

使用遠端執行功能時,實際的建構和/或測試步驟不會 而是被傳送到遠端執行 有些人會將 Cloud Storage 視為檔案系統 但實際上不是不過,解析工作區規則的步驟會在主機上執行。如果您的工作區規則會存取主機機器的相關資訊,以便在執行期間使用,由於環境之間不相容,因此您的建構作業可能會中斷。

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

找出非密封規則

工作區規則可讓開發人員將依附元件新增至 但現在更豐富多樣,可以任意處理 在這個過程中會發生什麼事所有相關指令都會在本機上執行,因此可能會導致非密封性。通常,非密封行為會透過 repository_ctx 引入,這可讓您與主機互動。

從 Bazel 0.18 開始,您就可以取得某些可能非密封的記錄檔 將標記 --experimental_workspace_rules_log_file=[PATH] 加入 執行 Bazel 指令這裡 [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 剖析器剖析 Workspace 記錄檔。

    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:檢查主機上安裝的程式通常會出現問題,因為 worker 可能有不同的設定。