हर्मिटिटी

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

खास जानकारी

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

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

हर्मेटिटी के दो अहम पहलू हैं:

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

फ़ायदे

हर्मेटिक बिल्ड के मुख्य फ़ायदे:

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

नॉन-आर्मेटिकिटी की पहचान करना

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

  • .mk फ़ाइलों में आर्बिट्ररी प्रोसेस की जा रही है
  • ऐसी कार्रवाइयां या टूल जो तय किए बिना ही फ़ाइलें बनाती हैं. इनमें आम तौर पर बिल्ड आईडी या टाइमस्टैंप शामिल होते हैं
  • ऐसी सिस्टम बाइनरी जो हर होस्ट के हिसाब से अलग-अलग होती हैं. जैसे, /usr/bin बाइनरी, ऐब्सलूट पाथ, नेटिव C++ नियमों के अपने-आप कॉन्फ़िगर होने के लिए सिस्टम C++ कंपाइलर
  • बिल्ड के दौरान सोर्स ट्री में लिखना. इससे उसी सोर्स ट्री का किसी दूसरे टारगेट के लिए इस्तेमाल नहीं किया जा सकता. पहला बिल्ड सोर्स ट्री को लिखता है, और टारगेट A के लिए सोर्स ट्री ठीक करता है. ऐसा करने पर, हो सकता है कि टारगेट B बनाने की कोशिश नाकाम हो जाए.

नॉन-हेरमेटिक बिल्ड से जुड़ी समस्या हल करना

स्थानीय तौर पर लागू करने से शुरू करते हुए, लोकल कैश हिट पर असर डालने वाली समस्याओं का पता चलता है कि यह कार्रवाइयां नॉन-हर्मेटिक नहीं हैं.

  • शून्य क्रम के बिल्ड पक्का करें: अगर आप make चलाते हैं और सफल बिल्ड पाते हैं, तो बिल को फिर से चलाने से कोई भी टारगेट फिर से नहीं बनाया जाना चाहिए. अगर बिल्ड के हर चरण को दो बार या अलग-अलग सिस्टम पर चलाया जाता है, तो फ़ाइल के कॉन्टेंट के हैश की तुलना करें और अलग-अलग नतीजे पाएं.
  • कई तरह की संभावित क्लाइंट मशीनों से लोकल कैश हिट को डीबग करने का तरीका चलाएं. इससे, यह पक्का किया जा सकेगा कि क्लाइंट एनवायरमेंट की कार्रवाइयों में लीक हो रहे मामलों का पता लगाया जा सके.
  • डॉकर कंटेनर में ऐसा बिल्ड करें जिसमें, चेक आउट किया गया सोर्स ट्री और होस्ट टूल की साफ़ तौर पर जानकारी देने वाली सूची के अलावा और कुछ न हो. बिल्ड ब्रेकेज और गड़बड़ी के मैसेज, इंप्लिसिट सिस्टम डिपेंडेंसी को पकड़ लेंगे.
  • रिमोट प्रोग्राम लागू करने के नियमों का इस्तेमाल करके, हर्मेटिटी से जुड़ी समस्याओं का पता लगाएं और उन्हें ठीक करें.
  • हर कार्रवाई के लेवल पर, सख्त सैंडबॉक्सिंग चालू करें, क्योंकि बिल्ड में की जाने वाली कार्रवाइयां स्टेटफ़ुल हो सकती हैं और बिल्ड या आउटपुट पर असर डाल सकती हैं.
  • Workspace के नियमों की मदद से डेवलपर, बाहरी फ़ाइल फ़ोल्डर पर डिपेंडेंसी जोड़ सकते हैं. हालांकि, इनमें ज़रूरत के मुताबिक प्रोसेसिंग की अनुमति दी जा सकती है. --experimental_workspace_rules_log_file=PATH अपने Bazel कमांड में फ़्लैग जोड़कर, आपको Bazel वर्कस्पेस के कुछ ऐसे नॉन-हर्मेटिक ऐक्शन का लॉग मिल सकता है.

बेज़ेल के साथ हर्मेटिटी

कैसे दूसरे प्रोजेक्ट को Bazel के साथ, हेरमेटिक बिल्ड इस्तेमाल करने में सफलता मिली है, इस बारे में ज़्यादा जानकारी के लिए, BazelCon के ये डायलॉग देखें: