建構事件通訊協定

回報問題 查看來源

Build Event Protocol (BEP) 可讓第三方程式取得 Bazel 叫用的深入分析資訊。舉例來說,您可以使用 BEP 收集 IDE 外掛程式或顯示建構結果的資訊主頁的資訊。

此通訊協定是一組通訊協定緩衝區訊息,以其為基礎定義了某些語意。其中包含建構和測試結果、建構進度、建構設定等相關資訊。BEP 是為了透過程式使用,並且可讓剖析 Bazel 的指令列輸出過去的內容。

「建構事件通訊協定」是以事件形式呈現建構的相關資訊。建構事件是通訊協定緩衝區訊息,包含建構事件 ID、一組子項事件 ID 和酬載。

  • 建構事件 ID:視建構事件的種類而定,可能是「不透明字串」或「結構化資訊」,其中有關於建構事件的詳細資訊。建構事件 ID 在建構作業中不得重複。

  • 子項:建構事件可藉由在子項欄位中加入建構事件 ID 來宣告其他建構事件。舉例來說,PatternExpanded 建構事件會宣告其展開為子項的目標。通訊協定會保證除了第一個事件以外的所有事件,都會在上一個事件中宣告。

  • 酬載:酬載包含建構事件的相關結構化資訊,編碼為該事件專屬的通訊協定緩衝區訊息。請注意,酬載可能不是預期的類型,但如果建構提前取消,則可能是 Aborted 訊息。

建構事件圖表

所有建構事件都會透過父項和子項關係形成有向非循環圖。除了初始建構事件以外,每個建構事件都有一或多個父項事件。請注意,並非所有子項事件的父項事件都必須先張貼。建構完成 (成功或失敗) 時,所有宣布的事件都會發布。如果 Bazel 當機或網路傳輸失敗,系統就可能不會發布某些宣布的建構事件。

事件圖表的結構反映了指令的生命週期。每個 BEP 圖表的特性如下:

  1. 根事件一律為 BuildStarted 事件。所有其他事件皆為其子系。
  2. BuildStarted 事件的立即子項含有指令的中繼資料。
  3. 如果事件包含指令產生的資料 (例如建構的檔案和測試結果),這類事件會顯示在 BuildFinished 事件之前。
  4. BuildFinished 事件「可能」後面會接有包含建構作業摘要資訊的事件 (例如指標或剖析資料)。

使用建構事件通訊協定

以二進位格式使用

如要以二進位格式使用 BEP:

  1. 請指定 --build_event_binary_file=/path/to/file 選項,讓 Bazel 將通訊協定緩衝區訊息序列化。檔案會包含序列化的通訊協定緩衝區訊息,並以長度分隔每則訊息。每則訊息的前置字串皆是其長度,並編碼為可變長度整數。您可以使用通訊協定緩衝區程式庫的 parseDelimitedFrom(InputStream) 方法讀取這個格式。

  2. 然後編寫一個程式,從序列化的通訊協定緩衝區訊息中擷取相關資訊。

以文字或 JSON 格式使用

下列 Bazel 指令列標記會以人類可讀的格式輸出 BEP,例如文字和 JSON:

--build_event_text_file
--build_event_json_file

建構事件服務

建構事件服務通訊協定是通用的 gRPC 服務,可用來發布建構事件。建構事件服務通訊協定與 BEP 無關,會將 BEP 事件視為不透明位元組。Bazel 隨附建構事件服務通訊協定的 gRPC 用戶端實作項目,而這個通訊協定會發布 Build Event Protocol 事件。可以指定使用 --bes_backend=HOST:PORT 旗標,指定要傳送事件的端點。如果您的後端使用 gRPC,則必須在位址前面加上適當的配置:grpc:// 適用於明文 gRPC,grpcs:// 適用於已啟用 TLS 的 gRPC。

建構事件服務旗標

Bazel 有多個與 Build Event Service 通訊協定相關的標記,包括:

  • --bes_backend
  • --[no]bes_best_effort
  • --[no]bes_lifecycle_events
  • --bes_results_url
  • --bes_timeout
  • --project_id

如需每個標記的說明,請參閱指令列參考資料

驗證與安全性

Bazel 的 Build Event 服務實作也支援驗證和傳輸層安全標準 (TLS)。您可以使用下列旗標控管這些設定。請注意,這些標記也會用於 Bazel 的 Remote Execution。這表示建構事件服務與 Remote 執行端點需共用相同的驗證和 TLS 基礎架構。

  • --[no]google_default_credentials
  • --google_credentials
  • --google_auth_scopes
  • --tls_certificate
  • --[no]tls_enabled

如需每個標記的說明,請參閱指令列參考資料

建構事件服務和遠端快取

BEP 通常包含許多在執行 Bazel 的機器上儲存的記錄檔 (test.log、test.xml 等) 參照。遠端 BES 伺服器通常會因位於不同機器,而無法存取這些檔案。如要解決這個問題,您可以將 Bazel 與遠端快取搭配使用。Bazel 會將所有輸出檔案上傳到遠端快取 (包括 BEP 中參照的檔案),接著 BES 伺服器可以從快取中擷取參照檔案。

詳情請參閱 GitHub 問題 3689