透過指令碼呼叫 Bazel

回報問題 查看原始碼

您可以從指令碼呼叫 Bazel,以執行建構、執行測試或查詢依附元件圖表。Bazel 的設計目的是要啟用有效的指令碼編寫程序,不過本節將列出幾項相關注意事項,協助您編寫出更有效的指令碼。

選擇輸出基礎

--output_base 選項可控制 Bazel 程序應將建構作業的輸出內容寫入哪個位置,以及 Bazel 內部使用的各種工作檔案,其中一個鎖定可以防止多個 Bazel 程序同時變更輸出基礎。

為指令碼選擇正確的輸出基本目錄取決於多項因素。如果您需要將建構輸出內容放在特定位置,這會指定您要使用的輸出基礎。如果您對 Bazel 執行「唯讀」呼叫 (例如 bazel query),則鎖定因子會更為重要。請特別注意,如果您需要同時執行多個指令碼的執行個體,應注意每個 Blaze 伺服器程序「一次」最多能處理一個叫用。視您的情況而定,每個指令碼的每個執行個體都有可能等待轉彎,或者使用 --output_base 執行多個 Blaze 伺服器,可以使用這些執行個體。

如果您使用預設的輸出基礎值,就會解除使用者互動式 Bazel 指令使用的鎖定。如果使用者發出長時間執行的指令 (例如建構),您的指令碼必須等候這些指令執行完畢才能繼續。

伺服器模式註意事項

根據預設,Bazel 會使用長時間執行的伺服器程序做為最佳化作業。以指令碼執行 Bazel 時,請務必在與伺服器使用完畢後呼叫 shutdown,或是指定 --max_idle_secs=5,讓閒置伺服器立即自動關閉。

我會收到哪個結束代碼?

Bazel 會嘗試區分失敗的原因是原始碼,以及導致 Bazel 無法正確執行的外部錯誤。Bazel 執行作業可能會導致下列結束代碼:

結束所有指令使用的程式碼:

  • 0 - 成功
  • 2 - 指令列問題、錯誤或非法標記/指令組合,或錯誤的環境變數。您的指令列必須修改。
  • 8 - 建構作業中斷,但因訂單關閉而終止。
  • 9:保留伺服器鎖定,並通過 --noblock_for_lock
  • 32 - 這部機器沒有外部環境失敗。

  • 33 - Bazel 記憶體不足且異常終止。您必須修改指令列。

  • 34 - 保留給 Google 內部使用。

  • 35 - 保留給 Google 內部使用。

  • 36 - 當地環境問題,疑似永久存在。

  • 37 - 未處理的例外狀況 / 內部 Bazel 錯誤。

  • 38:將結果發布至建構事件服務時發生暫時性錯誤。

  • 39 - Bazel 所需的 Blob 已從遠端快取中移除。

  • 41-44 - 保留給 Google 內部使用。

  • 45 - 將結果發布至建構事件服務時發生持續錯誤。

  • 47 - 保留給 Google 內部使用。

  • 49 - 保留給 Google 內部使用。

傳回 bazel build 指令 bazel test 的代碼:

  • 1 - 建構失敗。
  • 3 - 建構正常,但部分測試失敗或逾時。
  • 4:成功建構,但即使要求測試,系統卻找不到任何測試。

bazel run

  • 1 - 建構失敗。
  • 如果建構成功,但執行的子程序傳回非零的結束代碼,則也會是指令的結束代碼。

bazel query

  • 3 - 部分成功,但查詢在輸入 BUILD 檔案集中發生 1 或多個錯誤,因此作業結果不完全穩定。這可能是指令列上的 --keep_going 選項所造成。
  • 7 - 指令失敗。

日後的 Bazel 版本可能會新增額外的結束代碼,將一般失敗的結束代碼 1 替換為有特定意義的非零值。不過,所有非零的結束值一律都會構成錯誤。

讀取 .bazelrc 檔案

根據預設,Bazel 會從基本工作區目錄或使用者的主目錄讀取 .bazelrc 檔案。無論指令碼是否適合您,都可以在指令碼中找到;如果您的指令碼必須保持完美美觀 (例如執行發布子版本時),請使用 --bazelrc=/dev/null 選項停止讀取 .bazelrc 檔案。如果您要採用使用者的偏好設定執行建構,預設行為會比較好。

指令記錄

Bazel 輸出內容也會出現在指令記錄檔中,您可以使用下列指令找到該檔案:

bazel info command_log

指令記錄檔包含最近 Bazel 指令的交錯 stdout 和 stderr 串流。請注意,執行 bazel info 將覆寫這個檔案的內容,因為該檔案會成為最新的 Bazel 指令。不過,除非您變更 --output_base--output_user_root 選項的設定,否則指令記錄檔的位置將不會改變。

剖析輸出內容

Bazel 輸出內容非常容易剖析,有許多用途。對指令碼來說,可以使用以下兩個選項:--noshow_progress 隱藏進度訊息,以及 --show_result n 控制是否顯示「建構最新」訊息;您可以剖析這些訊息,以探索成功建構的目標,以及建立的輸出檔案的位置。如果您仰賴這些訊息,請務必指定非常大的 n 值。

透過剖析以排解效能問題

請參閱「效能剖析」一節。