बिल्ड इवेंट प्रोटोकॉल

Build Event Protocol (बीईपी) की मदद से, तीसरे पक्ष के प्रोग्राम को Bazel इनवोकेशन के बारे में अहम जानकारी मिलती है. उदाहरण के लिए, BEP का इस्तेमाल किसी आईडीई प्लगिन या ऐसे डैशबोर्ड के लिए जानकारी इकट्ठा करने के लिए किया जा सकता है जो बिल्ड के नतीजे दिखाता है.

प्रोटोकॉल, प्रोटोकॉल बफ़र मैसेज का एक सेट होता है. इसमें कुछ सिमैंटिक, सबसे ऊपर तय किए जाते हैं. इसमें बिल्ड और टेस्ट के नतीजों, बिल्ड की प्रोग्रेस, बिल्ड कॉन्फ़िगरेशन वगैरह के बारे में जानकारी शामिल होती है. बीईपी को प्रोग्राम के हिसाब से इस्तेमाल किया जाता है. इससे Bazel के कमांड लाइन आउटपुट को पार्स करने की ज़रूरत नहीं पड़ती.

Build Event Protocol, किसी बिल्ड के बारे में जानकारी को इवेंट के तौर पर दिखाता है. बिल्ड इवेंट, प्रोटोकॉल बफ़र मैसेज होता है. इसमें बिल्ड इवेंट आइडेंटिफ़ायर, चाइल्ड इवेंट आइडेंटिफ़ायर का सेट, और पेलोड शामिल होता है.

  • बिल्ड इवेंट आइडेंटिफ़ायर: बिल्ड इवेंट के टाइप के आधार पर, यह ओपेक स्ट्रिंग या स्ट्रक्चर्ड जानकारी हो सकती है. इससे बिल्ड इवेंट के बारे में ज़्यादा जानकारी मिलती है. किसी बिल्ड के लिए, बिल्ड इवेंट आइडेंटिफ़ायर यूनीक होता है.

  • चाइल्ड इवेंट: बिल्ड इवेंट, अन्य बिल्ड इवेंट का एलान कर सकता है. इसके लिए, वह अपने children फ़ील्ड में, बिल्ड इवेंट के आइडेंटिफ़ायर शामिल करता है. उदाहरण के लिए, PatternExpanded बिल्ड इवेंट, उन टारगेट का एलान करता है जिन्हें वह बच्चों के तौर पर दिखाता है. यह प्रोटोकॉल इस बात की गारंटी देता है कि पहले इवेंट को छोड़कर, सभी इवेंट की सूचना पिछले इवेंट से दी जाती है.

  • पेलोड: पेलोड में, बिल्ड इवेंट के बारे में स्ट्रक्चर्ड जानकारी होती है. इसे उस इवेंट के लिए खास तौर पर तैयार किए गए प्रोटोकॉल बफ़र मैसेज के तौर पर कोड में बदला जाता है. ध्यान दें कि हो सकता है कि पेलोड, उम्मीद के मुताबिक न हो. हालांकि, अगर बिल्ड समय से पहले बंद हो जाता है, तो यह Aborted मैसेज हो सकता है.

इवेंट ग्राफ़ बनाना

सभी बिल्ड इवेंट, पैरंट और चाइल्ड के संबंध के ज़रिए एक डायरेक्टेड एसाइक्लिक ग्राफ़ बनाते हैं. शुरुआती बिल्ड इवेंट को छोड़कर, हर बिल्ड इवेंट में एक या उससे ज़्यादा पैरंट इवेंट होते हैं. कृपया ध्यान दें कि किसी बच्चे के इवेंट के सभी पैरंट इवेंट को उससे पहले पोस्ट करना ज़रूरी नहीं है. जब कोई बिल्ड पूरा हो जाता है (सफल या विफल), तो सूचना दिए गए सभी इवेंट पोस्ट कर दिए जाते हैं. Bazel क्रैश होने या नेटवर्क ट्रांसपोर्ट में गड़बड़ी होने पर, हो सकता है कि कुछ बिल्ड इवेंट कभी पोस्ट न किए जाएं.

इवेंट ग्राफ़ का स्ट्रक्चर, किसी निर्देश के लाइफ़साइकल को दिखाता है. हर बीईपी ग्राफ़ का आकार इस तरह का होता है:

  1. रूट इवेंट हमेशा BuildStarted इवेंट होता है. अन्य सभी इवेंट, इसके डिसेंडेंट होते हैं.
  2. BuildStarted इवेंट के तुरंत बाद होने वाले इवेंट में, कमांड के बारे में मेटाडेटा होता है.
  3. कमांड से जनरेट किया गया डेटा दिखाने वाले इवेंट, BuildFinished इवेंट से पहले दिखते हैं. जैसे, बनाई गई फ़ाइलें और टेस्ट के नतीजे.
  4. BuildFinished इवेंट के बाद, ऐसे इवेंट हो सकते हैं जिनमें बिल्ड के बारे में खास जानकारी शामिल हो. उदाहरण के लिए, मेट्रिक या प्रोफ़ाइलिंग डेटा.

Build Event Protocol का इस्तेमाल करना

बाइनरी फ़ॉर्मैट में इस्तेमाल करना

बीईपी को बाइनरी फ़ॉर्मैट में इस्तेमाल करने के लिए:

  1. Bazel को प्रोटोकॉल बफ़र मैसेज को किसी फ़ाइल में क्रम से लगाने के लिए, --build_event_binary_file=/path/to/file विकल्प का इस्तेमाल करें. इस फ़ाइल में, प्रोटोकॉल बफ़र के क्रम से लगाए गए मैसेज शामिल होंगे. हर मैसेज की लंबाई तय होगी. हर मैसेज से पहले, उसकी लंबाई को वैरिएबल लेंथ इंटिजर के तौर पर कोड किया जाता है. इस फ़ॉर्मैट को, प्रोटोकॉल बफ़र लाइब्रेरी के parseDelimitedFrom(InputStream) तरीके का इस्तेमाल करके पढ़ा जा सकता है.

  2. इसके बाद, एक ऐसा प्रोग्राम लिखें जो सीरियलाइज़ किए गए प्रोटोकॉल बफ़र मैसेज से काम की जानकारी निकाल सके.

टेक्स्ट या JSON फ़ॉर्मैट में इस्तेमाल करना

Bazel कमांड-लाइन फ़्लैग की मदद से, बीईपी को टेक्स्ट और JSON जैसे आसानी से पढ़े जा सकने वाले फ़ॉर्मैट में आउटपुट किया जा सकता है:

--build_event_text_file
--build_event_json_file

इवेंट सर्विस बनाना

Build Event Service प्रोटोकॉल, बिल्ड इवेंट पब्लिश करने के लिए एक सामान्य gRPC सेवा है. Build Event Service प्रोटोकॉल, बीईपी से अलग होता है. यह बीईपी इवेंट को ओपेक बाइट के तौर पर प्रोसेस करता है. Bazel, Build Event Service प्रोटोकॉल के gRPC क्लाइंट को लागू करता है. यह Build Event Protocol इवेंट पब्लिश करता है. --bes_backend=HOST:PORT फ़्लैग का इस्तेमाल करके, इवेंट भेजने के लिए एंडपॉइंट तय किया जा सकता है. अगर आपका बैकएंड gRPC का इस्तेमाल करता है, तो आपको पते के आगे सही स्कीम जोड़नी होगी: grpc://, टेक्स्ट के तौर पर gRPC के लिए और grpcs://, टीएलएस की सुविधा वाले 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 के साथ भी पुष्टि करने और टीएलएस का इस्तेमाल किया जा सकता है. इन सेटिंग को नीचे दिए गए फ़्लैग का इस्तेमाल करके कंट्रोल किया जा सकता है. कृपया ध्यान दें कि इन फ़्लैग का इस्तेमाल, Bazel के रिमोट एक्ज़ीक्यूशन के लिए भी किया जाता है. इसका मतलब है कि Build Event Service और Remote Execution Endpoints को एक ही पुष्टि और टीएलएस इन्फ़्रास्ट्रक्चर शेयर करना होगा.

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

इनमें से हर फ़्लैग के बारे में जानकारी पाने के लिए, कमांड-लाइन रेफ़रंस देखें.

इवेंट सर्विस और रिमोट कैशिंग बनाना

बीईपी में आम तौर पर, लॉग फ़ाइलों (test.log, test.xml वगैरह) के कई रेफ़रंस होते हैं. ये फ़ाइलें उस मशीन पर सेव होती हैं जिस पर Bazel चल रहा है. आम तौर पर, रिमोट BES सर्वर इन फ़ाइलों को ऐक्सेस नहीं कर सकता, क्योंकि ये अलग-अलग मशीन पर होती हैं. इस समस्या को हल करने के लिए, Bazel के साथ रिमोट कैशिंग का इस्तेमाल करें. Bazel, सभी आउटपुट फ़ाइलों को रिमोट कैश में अपलोड करेगा. इनमें BEP में रेफ़रंस की गई फ़ाइलें भी शामिल हैं. इसके बाद, BES सर्वर, कैश से रेफ़रंस की गई फ़ाइलों को फ़ेच कर सकता है.

ज़्यादा जानकारी के लिए, GitHub की समस्या 3689 देखें.