इस पेज पर, हर्मेटिसिटी, हर्मेटिक बिल्ड का इस्तेमाल करने के फ़ायदों, और अपने बिल्ड में नॉन-हर्मेटिक व्यवहार की पहचान करने की रणनीतियों के बारे में बताया गया है.
खास जानकारी
एक ही इनपुट सोर्स कोड और प्रॉडक्ट कॉन्फ़िगरेशन देने पर, हर्मेटिक बिल्ड सिस्टम हमेशा एक जैसा आउटपुट देता है. ऐसा इसलिए, क्योंकि यह बिल्ड को होस्ट सिस्टम में होने वाले बदलावों से अलग रखता है.
बिल्ड को अलग रखने के लिए, हर्मेटिक बिल्ड, लोकल या रिमोट होस्ट मशीन पर इंस्टॉल की गई लाइब्रेरी और अन्य सॉफ़्टवेयर के हिसाब से काम नहीं करते. ये बिल्ड टूल के खास वर्शन, जैसे कि कंपाइलर और डिपेंडेंसी, जैसे कि लाइब्रेरी पर निर्भर करते हैं. इससे बिल्ड की प्रोसेस, अपने-आप पूरी हो जाती है, क्योंकि यह बिल्ड एनवायरमेंट के बाहर की सेवाओं पर निर्भर नहीं होती.
हर्मेटिसिटी के दो अहम पहलू हैं:
- आइसोलेशन: हर्मेटिक बिल्ड सिस्टम, टूल को सोर्स कोड के तौर पर मानते हैं. ये टूल की कॉपी डाउनलोड करते हैं. साथ ही, मैनेज किए गए फ़ाइल ट्री में उनके स्टोरेज और इस्तेमाल को मैनेज करते हैं. इससे होस्ट मशीन और लोकल उपयोगकर्ता के बीच आइसोलेशन बनता है. इसमें भाषाओं के इंस्टॉल किए गए वर्शन भी शामिल हैं.
- सोर्स की पहचान: हर्मेटिक बिल्ड सिस्टम, इनपुट एक जैसे होने की कोशिश करते हैं. कोड रिपॉज़िटरी, जैसे कि 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 और TwoSigma)
- रिमोट एक्ज़ीक्यूशन और कैशिंग की मदद से, तेज़ी से बिल्ड करना
- Bazel को फ़्यूज़ करना: तेज़ी से इंक्रीमेंटल बिल्ड करना
- रिमोट एक्ज़ीक्यूशन बनाम लोकल एक्ज़ीक्यूशन
- रिमोट कैशिंग की यूज़ेबिलिटी को बेहतर बनाना (IBM)
- Bazel की मदद से, ड्राइवरलेस कारें बनाना (BMW)
- Bazel की मदद से, ड्राइवरलेस कारें बनाना + सवाल-जवाब (GM Cruise)