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

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

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

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

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

  • चाइल्ड इवेंट: बिल्ड इवेंट, अपने चाइल्ड फ़ील्ड में बिल्ड इवेंट आइडेंटिफ़ायर शामिल करके, अन्य बिल्ड इवेंट के बारे में जानकारी दे सकता है. उदाहरण के लिए, 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

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

Build Event Service के फ़्लैग

Bazel में, Build Event Service Protocol से जुड़े कई फ़्लैग होते हैं. इनमें ये शामिल हैं:

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

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

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

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

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

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

Build Event Service और रिमोट कैशिंग

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

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