建構事件通訊協定

回報問題 查看原始碼 Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 事件可能會隨後接著發生,其中包含有關版本的摘要資訊 (例如指標或剖析資料)。

使用 Build Event Protocol

以二進位格式使用

如要以二進位格式使用 BEP,請按照下列步驟操作:

  1. 指定 --build_event_binary_file=/path/to/file 選項,讓 Bazel 將通訊協定緩衝區訊息序列化為檔案。檔案會包含序列化的通訊協定緩衝區訊息,每則訊息都以長度做為分隔符。每則訊息的開頭都會加上長度,並以可變長度整數編碼。您可以使用 Protocol Buffers 程式庫的 parseDelimitedFrom(InputStream) 方法讀取這類格式。

  2. 接著,請編寫程式,從序列化的通訊協定緩衝區訊息中擷取相關資訊。

以文字或 JSON 格式使用

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

--build_event_text_file
--build_event_json_file

建構事件服務

Build Event Service 通訊協定是用於發布建構事件的通用 gRPC 服務。建構事件服務通訊協定不受 BEP 影響,並將 BEP 事件視為不透明的位元組。Bazel 隨附的 Build Event Service 通訊協定 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 Service 實作也支援驗證和 TLS。您可以使用下列標記控制這些設定。請注意,這些標記也用於 Bazel 的遠端執行作業。這表示 Build Event Service 和 Remote Execution Endpoints 需要共用相同的驗證和 TLS 基礎架構。

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

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

建構事件服務和遠端快取

BEP 通常包含許多對記錄檔 (test.log、test.xml 等) 的參照,這些記錄檔會儲存在執行 Bazel 的電腦上。遠端 BES 伺服器通常無法存取這些檔案,因為這些檔案位於不同的電腦上。解決這個問題的方法是使用 Bazel 搭配遠端快取。Bazel 會將所有輸出檔案上傳至遠端快取 (包括 BEP 中參照的檔案),然後 BES 伺服器就能從快取中擷取參照的檔案。

詳情請參閱 GitHub 問題 3689