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

समस्या की शिकायत करें सोर्स देखें

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

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

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

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

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

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

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

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

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

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

बिल्ड इवेंट प्रोटोकॉल का इस्तेमाल करना

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

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

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

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

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

यहां दिए गए Bazel कमांड लाइन फ़्लैग, BEP को टेक्स्ट और JSON जैसे इन फ़ॉर्मैट में देंगे, जिन्हें इंसान पढ़ सकते हैं:

--build_event_text_file
--build_event_json_file

बिल्ड इवेंट सेवा

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

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

Bazel के पास बिल्ड इवेंट सर्विस प्रोटोकॉल से जुड़े कई फ़्लैग हैं, जिनमें ये शामिल हैं:

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

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

पुष्टि करना और सुरक्षा

Bazel की बिल्ड इवेंट सेवा, ऑथेंटिकेशन और TLS के साथ भी काम करती है. इन सेटिंग को नीचे दिए गए फ़्लैग से कंट्रोल किया जा सकता है. कृपया ध्यान दें कि इन फ़्लैग का इस्तेमाल Bazel के रिमोट एक्ज़ीक्यूटेबल के लिए भी किया जाता है. इसका मतलब है कि बिल्ड इवेंट सेवा और रिमोट एक्ज़ीक्यूशन एंडपॉइंट को एक ही पुष्टि और TLS इन्फ़्रास्ट्रक्चर शेयर करना होगा.

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

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

इवेंट सेवा बनाएं और किसी दूसरी जगह से कैश मेमोरी में सेव करें

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

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