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

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

नीचे दिए गए Baज़र के कमांड लाइन फ़्लैग, BEP को टेक्स्ट और JSON जैसे फ़ॉर्मैट में ऐसे फ़ॉर्मैट में जनरेट करेंगे जिसे लोग आसानी से पढ़ सकें:

--build_event_text_file
--build_event_json_file

इवेंट सेवा बनाना

बिल्ड इवेंट सेवा प्रोटोकॉल, बिल्ड इवेंट पब्लिश करने के लिए एक सामान्य gRPC सेवा है. Build Event Service प्रोटोकॉल, BEP से अलग होता है और BEP इवेंट को ओपेक बाइट के तौर पर इस्तेमाल करता है. Basel, gRPC क्लाइंट के साथ बिल्ड इवेंट सर्विस प्रोटोकॉल को लागू करके भेजता है. यह बिल्ड इवेंट प्रोटोकॉल इवेंट को पब्लिश करता है. --bes_backend=HOST:PORT फ़्लैग का इस्तेमाल करके, इवेंट भेजने के लिए एंडपॉइंट तय किया जा सकता है. अगर आपका बैकएंड gRPC का इस्तेमाल करता है, तो आपको पते से पहले सही स्कीम जोड़नी होगी: plaintext gRPC के लिए grpc:// और TLS चालू होने पर gRPC के लिए grpcs://.

इवेंट सेवा के लिए फ़्लैग बनाएं

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 और रिमोट EXECUTION एंडपॉइंट को एक ही पुष्टि और TLS इन्फ़्रास्ट्रक्चर शेयर करना होगा.

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

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

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

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

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