建構事件通訊協定 (BEP) 可讓第三方程式深入瞭解 Bazel 叫用。舉例來說,您可以使用 BEP 收集 IDE 外掛程式或顯示建構結果的資訊主頁資料。
這個通訊協定是一組通訊協定緩衝區訊息,並在頂端定義一些語意。包括建構和測試結果、建構進度、建構設定等資訊。BEP 旨在以程式輔助方式取用,並讓剖析 Bazel 的指令列輸出內容成為過去式。
建構事件通訊協定會以事件形式呈現建構相關資訊。建構事件是通訊協定緩衝區訊息,包含建構事件 ID、一組子事件 ID 和酬載。
建構事件 ID:視建構事件類型而定,這可能是不透明的字串,或是結構化資訊,可揭露更多建構事件的相關資訊。建構事件 ID 在建構作業中是專屬的。
子項:建構事件可能會在子項欄位中加入其他建構事件 ID,藉此發布這些事件。舉例來說,
PatternExpanded
建構事件會將其擴展的目標宣告為子項。這項通訊協定可確保所有事件 (第一個事件除外) 都會由先前的事件發布。酬載:酬載包含建構事件的結構化資訊,並編碼為該事件專屬的通訊協定緩衝區訊息。請注意,如果建構作業過早中止,酬載可能不是預期類型,而是
Aborted
訊息。
建立事件圖表
所有建構事件都會透過父項和子項關係形成有向無環圖。除了初始建構事件之外,每個建構事件都有一或多個父項事件。請注意,子事件不一定需要先發布所有父項事件。建構完成時 (無論成功或失敗),所有已發布的事件都會張貼完畢。如果發生 Bazel 當機或網路傳輸失敗的情況,部分已發布的建構事件可能不會張貼。
事件圖的結構會反映指令的生命週期。每個 BEP 圖表都具有下列特徵形狀:
- 根事件一律為
BuildStarted
事件。所有其他事件都是其後代。 - BuildStarted 事件的直屬子項包含指令的中繼資料。
- 包含指令產生資料 (例如建構的檔案和測試結果) 的事件,會顯示在
BuildFinished
事件之前。 BuildFinished
事件可能會接續發生,其中包含建構作業的摘要資訊 (例如指標或剖析資料)。
使用 Build Event Protocol
以二進位格式取用
如要以二進位格式使用 BEP,請按照下列步驟操作:
指定
--build_event_binary_file=/path/to/file
選項,讓 Bazel 將通訊協定緩衝區訊息序列化至檔案。這個檔案會包含序列化通訊協定緩衝區訊息,每則訊息都會以長度分隔。每則訊息都會加上前置字元,長度會編碼為可變長度的整數。您可以使用 Protocol Buffers 程式庫的parseDelimitedFrom(InputStream)
方法讀取這個格式。接著,編寫程式,從序列化通訊協定緩衝區訊息中擷取相關資訊。
以文字或 JSON 格式使用
下列 Bazel 指令列標記會以使用者可解讀的格式 (例如文字和 JSON) 輸出 BEP:
--build_event_text_file
--build_event_json_file
建構事件服務
建構事件服務通訊協定是發布建構事件的通用 gRPC 服務。Build Event Service 通訊協定與 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_lifecycle_events
--bes_results_url
--bes_timeout
--bes_instance_name
如要瞭解各個標記的說明,請參閱指令列參考資料。
驗證與安全性
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。