इस पेज पर, हर्मेटिसिटी, हर्मेटिक बिल्ड का इस्तेमाल करने के फ़ायदों, और अपने बिल्ड में नॉन-हर्मेटिक व्यवहार की पहचान करने की रणनीतियों के बारे में बताया गया है.
खास जानकारी
एक हर्मेटिक बिल्ड सिस्टम, एक ही सोर्स कोड और प्रॉडक्ट कॉन्फ़िगरेशन देने पर हमेशा एक जैसा आउटपुट देता है. ऐसा इसलिए, क्योंकि यह बिल्ड को होस्ट सिस्टम में होने वाले बदलावों से अलग रखता है.
बिल्ड को अलग रखने के लिए, हर्मेटिक बिल्ड, लोकल या रिमोट होस्ट मशीन पर इंस्टॉल की गई लाइब्रेरी और अन्य सॉफ़्टवेयर के लिए संवेदनशील नहीं होते. ये बिल्ड टूल के खास वर्शन पर निर्भर करते हैं. जैसे, कंपाइलर और डिपेंडेंसी, जैसे कि लाइब्रेरी. इससे बिल्ड प्रोसेस, अपने-आप पूरी हो जाती है, क्योंकि यह बिल्ड एनवायरमेंट के बाहर की सेवाओं पर निर्भर नहीं होती.
हर्मेटिसिटी के दो अहम पहलू हैं:
- आइसोलेशन: हर्मेटिक बिल्ड सिस्टम, टूल को सोर्स कोड के तौर पर मानते हैं. ये टूल की कॉपी डाउनलोड करते हैं. साथ ही, मैनेज किए गए फ़ाइल ट्री में उनके स्टोरेज और इस्तेमाल को मैनेज करते हैं. इससे होस्ट मशीन और लोकल उपयोगकर्ता के बीच आइसोलेशन बनता है. इसमें भाषाओं के इंस्टॉल किए गए वर्शन भी शामिल हैं.
- सोर्स की पहचान: हर्मेटिक बिल्ड सिस्टम, इनपुट की एक जैसी स्थिति बनाए रखने की कोशिश करते हैं. कोड रिपॉज़िटरी, जैसे कि Git, कोड म्यूटेशन के सेट की पहचान, यूनीक हैश कोड से करते हैं. हर्मेटिक बिल्ड सिस्टम, बिल्ड के इनपुट में होने वाले बदलावों की पहचान करने के लिए इस हैश का इस्तेमाल करते हैं.
फ़ायदे
हर्मेटिक बिल्ड के मुख्य फ़ायदे ये हैं:
- स्पीड: किसी कार्रवाई के आउटपुट को कैश किया जा सकता है. साथ ही, इनपुट में बदलाव होने पर ही कार्रवाई को फिर से चलाने की ज़रूरत होती है.
- पैरलल एक्ज़ीक्यूशन: दिए गए इनपुट और आउटपुट के लिए, बिल्ड सिस्टम सभी कार्रवाइयों का ग्राफ़ बना सकता है, ताकि असरदार और पैरलल एक्ज़ीक्यूशन का हिसाब लगाया जा सके. बिल्ड सिस्टम, नियमों को लोड करता है. साथ ही, कैश में देखने के लिए, कार्रवाई का ग्राफ़ और हैश इनपुट का हिसाब लगाता है.
- कई बिल्ड: एक ही मशीन पर कई हर्मेटिक बिल्ड बनाए जा सकते हैं. हर बिल्ड में अलग-अलग टूल और वर्शन का इस्तेमाल किया जा सकता है.
- रीप्रोड्यूसिबिलिटी: हर्मेटिक बिल्ड, समस्याओं को हल करने के लिए बेहतर होते हैं, क्योंकि आपको उन सटीक स्थितियों के बारे में पता होता है जिनकी वजह से बिल्ड बना.
नॉन-हर्मेटिसिटी की पहचान करना
अगर Bazel पर स्विच करने की तैयारी की जा रही है, तो अपने मौजूदा बिल्ड की हर्मेटिसिटी को पहले से बेहतर बनाने पर, माइग्रेशन आसान हो जाता है. बिल्ड में नॉन-हर्मेटिसिटी के कुछ सामान्य सोर्स ये हैं:
.mkफ़ाइलों में मनमानी प्रोसेसिंग- ऐसी कार्रवाइयां या टूलिंग जो गैर-निर्धारित तरीके से फ़ाइलें बनाती हैं. आम तौर पर, इनमें बिल्ड आईडी या टाइमस्टैंप शामिल होते हैं
- सिस्टम बाइनरी जो अलग-अलग होस्ट पर अलग-अलग होती हैं. जैसे,
/usr/binबाइनरी, ऐब्सलूट पाथ, बिल्ट-इन C++ नियमों के लिए सिस्टम C++ कंपाइलर का ऑटोकॉन्फ़िगरेशन - बिल्ड के दौरान, सोर्स ट्री में लिखना. इससे, एक ही सोर्स ट्री का इस्तेमाल किसी दूसरे टारगेट के लिए नहीं किया जा सकता. पहला बिल्ड, सोर्स ट्री में लिखता है. इससे टारगेट A के लिए सोर्स ट्री ठीक हो जाता है. इसके बाद, टारगेट B बनाने की कोशिश करने पर, यह प्रोसेस फ़ेल हो सकती है.
नॉन-हर्मेटिक बिल्ड की समस्याओं को हल करना
लोकल एक्ज़ीक्यूशन से शुरू होने वाली, ऐसी समस्याएं जो लोकल कैश हिट पर असर डालती हैं, नॉन-हर्मेटिक कार्रवाइयों का पता लगाती हैं.
- सीक्वेंशियल बिल्ड को शून्य पर सेट करें: अगर
makeचलाने पर, बिल्ड सही तरीके से बन जाता है, तो बिल्ड को फिर से चलाने पर, किसी भी टारगेट को फिर से नहीं बनाना चाहिए. अगर हर बिल्ड स्टेप को दो बार या अलग-अलग सिस्टम पर चलाया जाता है, तो फ़ाइल के कॉन्टेंट के हैश की तुलना करें. अगर आपको अलग-अलग नतीजे मिलते हैं, तो बिल्ड को फिर से नहीं बनाया जा सकता. - संभावित क्लाइंट मशीनों से लोकल कैश हिट को डीबग करने के लिए, स्टेप चलाएं. इससे यह पक्का किया जा सकेगा कि क्लाइंट एनवायरमेंट के कार्रवाइयों में लीक होने के सभी मामलों को पकड़ा जा सके.
- डॉकटर कंटेनर में बिल्ड एक्ज़ीक्यूट करें. इसमें चेक-आउट किया गया सोर्स ट्री और होस्ट टूल की साफ़ तौर पर दी गई सूची के अलावा कुछ नहीं होना चाहिए. बिल्ड ब्रेक होने और गड़बड़ी के मैसेज से, सिस्टम की इंप्लिसिट डिपेंडेंसी का पता चलेगा.
- रिमोट एक्ज़ीक्यूशन के नियमों का इस्तेमाल करके, हर्मेटिसिटी से जुड़ी समस्याओं का पता लगाएं और उन्हें ठीक करें.
- हर कार्रवाई के लेवल पर, सख्त सैंडबॉक्सिंग चालू करें, क्योंकि बिल्ड में कार्रवाइयां स्टेटफ़ुल हो सकती हैं. साथ ही, ये बिल्ड या आउटपुट पर असर डाल सकती हैं.
- वर्कस्पेस के नियमों
से, डेवलपर बाहरी वर्कस्पेस में डिपेंडेंसी जोड़ सकते हैं. हालांकि, ये नियम इतने
बेहतर होते हैं कि प्रोसेस में मनमानी प्रोसेसिंग की जा सकती है. Bazel कमांड में
--experimental_workspace_rules_log_file=PATHफ़्लैग जोड़कर, Bazel वर्कस्पेस के नियमों में, संभावित तौर पर नॉन-हर्मेटिक कार्रवाइयों का लॉग पाया जा सकता है.
Bazel के साथ हर्मेटिसिटी
Bazel के साथ हर्मेटिक बिल्ड का इस्तेमाल करके, अन्य प्रोजेक्ट को मिली सफलता के बारे में ज़्यादा जानने के लिए, BazelCon की ये बातचीत देखें:
- Bazel की मदद से रीयल-टाइम सिस्टम बनाना (SpaceX)
- Bazel रिमोट एक्ज़ीक्यूशन और रिमोट कैशिंग (Uber और Two Sigma)
- रिमोट एक्ज़ीक्यूशन और कैशिंग की मदद से, तेज़ी से बिल्ड करना
- Bazel को फ़्यूज़ करना: तेज़ी से इंक्रीमेंटल बिल्ड करना
- रिमोट एक्ज़ीक्यूशन बनाम लोकल एक्ज़ीक्यूशन
- रिमोट कैशिंग की यूज़ेबिलिटी को बेहतर बनाना (IBM)
- Bazel की मदद से, ड्राइवरलेस कारें बनाना (BMW)
- Bazel की मदद से, ड्राइवरलेस कारें बनाना + सवाल-जवाब (GM Cruise)