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

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

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

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

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

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

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

बिल्ड इवेंट ग्राफ़

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

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

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

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

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

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

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

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

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

Bazel के ये कमांड लाइन फ़्लैग, बीईपी को टेक्स्ट और 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_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

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

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

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

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