रिमोट एक्ज़ीक्यूशन के लिए, Bazel के नियमों को अपनाना

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

यह पेज, Basel के उन उपयोगकर्ताओं के लिए है जो अपने हिसाब से बिल्ड और टेस्ट के नियम बना रहे हैं जो बेज़ल नियमों की ज़रूरी शर्तों को रिमोट तरीके से एक्ज़ीक्यूट किया जा सकता है.

रिमोट तौर पर एक्ज़ीक्यूट करने की सुविधा की मदद से, बैजल एक अलग प्लैटफ़ॉर्म पर कार्रवाइयां कर पाते हैं. जैसे, एक डेटासेंटर. बेज़ल जीआरपीसी प्रोटोकॉल रिमोट तरीके से एक्ज़ीक्यूट किया जा सकता है. रिमोट तरीके से एक्ज़ीक्यूशन करने के लिए, इनका इस्तेमाल किया जा सकता है: baaz-buildfarm, एक ओपन सोर्स प्रोजेक्ट जिसका मकसद डिस्ट्रिब्यूटेड रिमोट एक्ज़ीक्यूशन देना है प्लैटफ़ॉर्म.

यह पेज अलग-अलग पेज पर दिए गए एनवायरमेंट टाइप या प्लैटफ़ॉर्म:

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

खास जानकारी

रिमोट तौर पर एक्ज़ीक्यूट करने के लिए Baze बिल्ड को कॉन्फ़िगर करते समय, आपको इनका पालन करना होगा: इस पेज पर दिए गए दिशा-निर्देश, ताकि यह पक्का किया जा सके कि बिल्ड रिमोट तरीके से काम करता है वह भी गड़बड़ी से बचा सकता है. ऐसा रिमोट तौर पर किए जाने वाले प्रोग्राम की वजह से होता है, जैसे:

  • बिल्ड से जुड़ी अलग-अलग कार्रवाइयां. बिल्ड टूल की मौजूदा स्थिति और डिपेंडेंसी नहीं बनी रहती उनके बीच लीक नहीं हो सकता.

  • अलग-अलग तरह के एक्ज़ीक्यूशन एनवायरमेंट. लोकल बिल्ड कॉन्फ़िगरेशन हमेशा ज़रूरी नहीं होता रिमोट तरीके से एक्ज़ीक्यूट किया जा सकता है.

इस पेज में उन समस्याओं के बारे में बताया गया है जो कस्टम बेज़ल को लागू करते समय पैदा हो सकती हैं रिमोट एक्ज़ीक्यूशन के लिए नियम बनाना और उनकी जांच करना. साथ ही, उनसे बचने का तरीका जानना. इसमें ये विषय शामिल हैं:

टूलचेन के नियमों की मदद से, बिल्ड टूल इस्तेमाल करने की शुरुआत करना

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

फ़िलहाल, Basel के बिल्ड और टेस्ट नियमों के लिए टूलचेन के नियम मौजूद हैं Scala, रस्ट, और शुरू करें, और अन्य भाषाओं और टूल पर भी नए टूलचेन नियम लागू किए जा रहे हैं, जैसे कि बैश. आपके नियम जिस टूल का इस्तेमाल करते हैं, अगर उसके लिए कोई टूलचेन नियम मौजूद नहीं है, तो टूलचेन नियम बनाना.

इंप्लिसिट डिपेंडेंसी मैनेज करना

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

उदाहरण के लिए, जब Bagel किसी स्टेटफ़ुल कंपाइलर को स्थानीय तौर पर foo बनाने का निर्देश देता है, कंपाइलर foo के बिल्ड आउटपुट के रेफ़रंस बनाए रखता है. जब बेज़ल तब यह कंपाइलर को bar बनाने का निर्देश देता है, जो foo पर निर्भर करता है. इसके बिना यह साफ़ तौर पर बताना कि इसमें शामिल किए जाने के लिए BUILD फ़ाइल पर डिपेंडेंसी है कंपाइलर शुरू करने पर, कार्रवाई तब तक पूरी तरह से लागू होती है, जब तक वह एक ही हो कंपाइलर इंस्टेंस दोनों कार्रवाइयों के लिए काम करता है (जैसा कि लोकल एक्ज़ीक्यूशन के लिए आम तौर पर किया जाता है). हालांकि, रिमोट तौर पर रन करने की स्थिति में हर बिल्ड ऐक्शन अलग कंपाइलर इंस्टेंस, कंपाइलर स्टेट, और bar की इंप्लिसिट डिपेंडेंसी foo को खो जाएगा और बिल्ड फ़ेल हो जाएगा.

डिपेंडेंसी से जुड़ी इन समस्याओं का पता लगाने और उन्हें खत्म करने के लिए, Basel 0.14.1 लोकल Docker सैंडबॉक्स, जिसमें डिपेंडेंसी के लिए रिमोट की तरह ही पाबंदियां हैं निष्पादन. सैंडबॉक्स का इस्तेमाल करके, बिल्ड को रिमोट तरीके से एक्ज़ीक्यूट करें. डिपेंडेंसी से जुड़ी बिल्ड की गड़बड़ियों की पहचान करना और उन्हें ठीक करना. डॉकर सैंडबॉक्स की मदद से, बेज़ल रिमोट एक्ज़ीक्यूशन से जुड़ी समस्याओं को हल करना देखें हमारा वीडियो देखें.

प्लैटफ़ॉर्म-निर्भर बाइनरी मैनेज करना

आम तौर पर, होस्ट प्लैटफ़ॉर्म पर बनाई गई बाइनरी, आम तौर पर डिपेंडेंसी की वजह से किसी भी रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म का इस्तेमाल किया जा सकता है. उदाहरण के लिए, Basel के साथ सप्लाई की गई SingleJar बाइनरी, होस्ट प्लैटफ़ॉर्म को टारगेट करती है. हालांकि, रिमोट तरीके से एक्ज़ीक्यूट करने के लिए, SingleJar को प्रोसेस के हिस्से के तौर पर कंपाइल करना ज़रूरी है ताकि यह रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म को टारगेट कर सके. (देखें. टारगेट चुनने का लॉजिक.)

अपने सोर्स कोड के साथ बिल्ड के लिए ज़रूरी बिल्ड टूल की बाइनरी शिप न करें जब तक कि आपको पक्के तौर पर न पता हो कि वे आपके एक्ज़ीक्यूशन प्लैटफ़ॉर्म पर सुरक्षित तरीके से चलेंगे. इसके बजाय, यह करें इनमें से एक:

  • टूल के लिए सोर्स कोड को शिप करें या उसका रेफ़रंस दें, ताकि यह जिसे रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म के लिए बनाया गया है.

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

कॉन्फ़िगर-स्टाइल वाले वर्कस्पेस के नियमों को मैनेज करें

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

WORKSPACE नियमों के मुताबिक की गई इन कार्रवाइयों का इस्तेमाल नहीं किया जा सकता रिमोट तौर पर एक्ज़ीक्यूट करने की सुविधा:

  • बाइनरी बनाना. WORKSPACE नियमों में, कंपाइलेशन ऐक्शन एक्ज़ीक्यूट किए जा रहे हैं इससे ऐसी बाइनरी बनती हैं जो रिमोट तरीके से एक्ज़ीक्यूट करने की सुविधा के साथ काम नहीं करतीं अगर यह होस्ट प्लैटफ़ॉर्म से अलग है.

  • pip पैकेज इंस्टॉल किए जा रहे हैं. WORKSPACE का इस्तेमाल करके, pip पैकेज इंस्टॉल किए गए नियमों के लिए यह ज़रूरी है कि उनकी डिपेंडेंसी, होस्ट प्लैटफ़ॉर्म पर पहले से इंस्टॉल हों. खास तौर पर होस्ट प्लैटफ़ॉर्म के लिए बनाए गए ऐसे पैकेज अगर यह होस्ट से अलग है, तो रिमोट एक्ज़ीक्यूशन प्लैटफ़ॉर्म के साथ काम नहीं करता प्लैटफ़ॉर्म.

  • लोकल टूल या आर्टफ़ैक्ट को आपस में जोड़ना. टूल या लाइब्रेरी के सिमलिंक WORKSPACE नियमों के ज़रिए बनाए गए होस्ट प्लैटफ़ॉर्म पर इंस्टॉल करने से, बिल्ड को रिमोट एक्ज़िक्यूशन प्लैटफ़ॉर्म पर पूरा नहीं किया जा सकेगा, क्योंकि Baze, उनका पता लगाएं. इसके बजाय, स्टैंडर्ड बिल्ड ऐक्शन का इस्तेमाल करके सिमलिंक बनाएं, ताकि सिम्लिंक किए गए टूल और लाइब्रेरी बेज़ल के runfiles से ऐक्सेस किए जा सकते हैं पेड़ repository_ctx.symlink का इस्तेमाल न करें बाहरी रेपो डायरेक्ट्री के बाहर, टारगेट फ़ाइलों को सिमलिंक करने के लिए.

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

Workspace के नियमों के लॉग का इस्तेमाल करके, संभावित नॉन-हर्मेटिक व्यवहार का पता लगाया जा सकता है.

अगर कोई बाहरी डिपेंडेंसी, होस्ट के हिसाब से खास ऑपरेशन करती है , आपको उन ऑपरेशन को WORKSPACE और बिल्ड के बीच में बांट देना चाहिए नियम सेट करें:

  • प्लैटफ़ॉर्म की जांच और डिपेंडेंसी की गिनती. ये ऑपरेशन हैं WORKSPACE नियमों के ज़रिए स्थानीय तौर पर एक्ज़ीक्यूट किया जा सकता है. इससे यह पता लगाया जा सकता है कि लाइब्रेरी स्थापित की जा सकती हैं, बनाए जाने वाले पैकेज डाउनलोड किए जा सकते हैं, और जिसके लिए आर्टफ़ैक्ट इस्तेमाल करना ज़रूरी है. रिमोट तरीके से एक्ज़ीक्यूट करने के लिए, इन नियमों का साथ ही, पहले से जांचे गए आर्टफ़ैक्ट इस्तेमाल करने की सुविधा भी देते हैं, ताकि वे आम तौर पर, इसे होस्ट प्लैटफ़ॉर्म की जांच के दौरान लिया जाता है. पहले से चुना गया आर्टफ़ैक्ट की मदद से, बेज़ल स्थानीय चीज़ों की निर्भरता के बारे में बता पाते हैं. इस्तेमाल की जाने वाली चीज़ें इसके लिए, कंडिशनल स्टेटमेंट या --override_repository फ़्लैग का इस्तेमाल करें.

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

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

उदाहरण के लिए, cuda के लिए Tensorflow के नियमों के आधार पर और python, WORKSPACE के नियमों के मुताबिक, ये BUILD files के दायरे में आते हैं. लोकल एक्ज़ीक्यूशन के लिए, होस्ट एनवायरमेंट की जांच करके बनाई गई फ़ाइलों का इस्तेमाल किया जाता है. रिमोट तरीके से एक्ज़ीक्यूट करने के लिए, शर्त के साथ स्टेटमेंट का इस्तेमाल करने पर, नियम उन फ़ाइलों का इस्तेमाल कर सकता है जिनमें चेक इन किया गया हो और भी बहुत कुछ नहीं कर सकते.

BUILD फ़ाइलें, genrules का एलान करती हैं जो स्थानीय तौर पर और रिमोट तौर पर, दोनों तरह से काम कर सके. साथ ही, ज़रूरी प्रोसेसिंग यह पहले repository_ctx.symlink के ज़रिए किया गया था, जैसा कि यहां दिखाया गया है.