प्रतिनिधि इंटरव्यू विषय

सामान्य तकनीकी साक्षात्कार: आप एक नॉन-रिप्रॉड्यूसिबल बिल्ड को कैसे डीबग और फिक्स करेंगे?

सामान्यकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

समान कमिट (commit) डेवलपर मशीन और CI पर अलग-अलग बाइनरी डाइजेस्ट बनाता है। बताएं कि आप अंतर का पता कैसे लगाएंगे, बिल्ड को कैसे ठीक करेंगे, और यह कैसे साबित करेंगे कि स्वतंत्र बिल्डर्स इसे दोबारा पुनरुत्पादित (reproduce) कर सकते हैं।

प्रॉम्प्ट और संदर्भ

समान कमिट (commit) डेवलपर मशीन और CI पर अलग-अलग बाइनरी डाइजेस्ट बनाता है। बताएं कि आप अंतर का पता कैसे लगाएंगे, बिल्ड को कैसे ठीक करेंगे, और यह कैसे साबित करेंगे कि स्वतंत्र बिल्डर्स इसे दोबारा पुनरुत्पादित (reproduce) कर सकते हैं।

यह व्यवस्थित डीबगिंग, प्रयोग डिजाइन और सप्लाई-चेन सीमाओं का परीक्षण करता है। एक सिग्नेचर या प्रोवेनेंस स्टेटमेंट यह दिखा सकता है कि आर्टिफैक्ट बनाने का दावा कौन करता है, लेकिन यह स्वचालित रूप से यह नहीं दिखाता है कि दो बिल्ड समान बाइट्स उत्पन्न करते हैं।

साक्षात्कारकर्ता क्या मूल्यांकन करता है

अंतर को सीमित करना

आपको कमिट, डिपेंडेंसीज, टूलचेन, एनवायरनमेंट वेरिएबल्स और टारगेट प्लेटफॉर्म को फ्रीज करना चाहिए, फिर एक न्यूनतम प्रयोग के साथ पहले भिन्न इनपुट या आउटपुट का पता लगाना चाहिए।

गैर-नियतात्मकता (Nondeterminism) की पहचान करना

बिल्ड को आंख मूंदकर दोबारा चलाने के बजाय टाइमस्टैम्प, फ़ाइल क्रम, रैंडम सीड्स, पाथ्स, होस्टनेम, पैरेलल रेस, कंप्रेसर और साइनिंग कीज की जांच करें।

समाधान साबित करना

बार-बार निर्माण करने के लिए स्वतंत्र परिवेशों का उपयोग करें, डाइजेस्ट्स, फ़ाइल मैनिफ़ेस्ट्स और इंटरमीडिएट आर्टिफ़ैक्ट्स की तुलना करें, और स्पष्टीकरण के साथ विफल नमूनों को सुरक्षित रखें।

विश्वास सीमाओं (Trust Boundaries) को संभालना

रिप्रॉड्यूसिबल बिल्ड्स, सिग्नेचर, SBOMs और प्रोवेनेंस में अंतर स्पष्ट करें; प्रत्येक प्रकार का साक्ष्य एक अलग प्रश्न का उत्तर देता है।

पूछने के लिए स्पष्टीकरण प्रश्न

  • क्या अंतर एक ही प्लेटफॉर्म पर है या ऑपरेटिंग सिस्टम, आर्किटेक्चर और कंपाइलर के बीच है?
  • क्या डिपेंडेंसीज लॉक और चेकसम की गई हैं, या फ्लोटिंग वर्जन्स से हल की गई हैं?
  • क्या आउटपुट एक बाइनरी, कंटेनर इमेज, संग्रह (archive), या डीबग जानकारी वाला आर्टिफैक्ट है?
  • क्या पूरा डाइजेस्ट अलग है, या केवल मेटाडेटा की थोड़ी मात्रा?
  • क्या बिल्ड समय, रैंडमनेस, पाथ्स, नेटवर्क संसाधनों या सीक्रेट्स को पढ़ता है?
  • क्या बाइट-दर-बाइट समानता आवश्यक है, या केवल सत्यापन योग्य मूल (origin) और अखंडता (integrity)?

30-सेकंड उत्तर ढांचा

"मैं कमिट, लॉकफाइल, कंपाइलर, बेस इमेज, टारगेट आर्किटेक्चर और बिल्ड पैरामीटर्स को फ्रीज करूंगा, साथ ही पूरे लॉग्स और आर्टिफैक्ट मैनिफेस्ट को सुरक्षित रखूंगा। फिर मैं पाइपलाइन को बाईसेक्ट करूंगा: टाइमस्टैम्प, क्रम, रैंडमनेस, पाथ्स और नेटवर्क डाउनलोड से शुरुआत करते हुए इनपुट्स, प्रीप्रोसेसर आउटपुट, ऑब्जेक्ट फाइल्स और अंतिम पैकेजिंग की तुलना करूंगा। फिक्स के बाद, स्वतंत्र परिवेश बार-बार रीबिल्ड करेंगे और डाइजेस्ट्स व मुख्य इंटरमीडिएट्स की तुलना करेंगे; परिवेश और कमांड को रिकॉर्ड किया जाएगा। अंत में, मैं बिल्डर की पहचान और उत्पत्ति साबित करने के लिए सिग्नेचर या प्रोवेनेंस का उपयोग करूंगा, बिना उन्हें रिप्रॉड्यूसिबिलिटी के विकल्प के रूप में माने।"

चरण-दर-चरण गहन विश्लेषण

चरण 1: प्रयोग को फ्रीज करें

कमिट डाइजेस्ट, लॉकफाइल, पैकेज चेकसम, कंपाइलर और लिंकर संस्करण, बेस इमेज, टारगेट आर्किटेक्चर, बिल्ड कमांड, एनवायरनमेंट वेरिएबल्स और नेटवर्क एक्सेस रिकॉर्ड करें। आर्टिफैक्ट को फ़ाइल मैनिफ़ेस्ट, डाइजेस्ट और मेटाडेटा में विभाजित करें।

चरण 2: पहले अंतर का पता लगाएं

स्वच्छ परिवेशों में पुनः निर्माण करें और स्रोत अभिलेखागार (source archives), डिपेंडेंसी ट्री, प्रीप्रोसेसर आउटपुट, ऑब्जेक्ट फ़ाइलें, लिंकर आउटपुट और अंतिम पैकेजिंग की तुलना करें। जिस चरण में पहला अंतर होता है, वह अगले प्रयोग को निर्धारित करता है।

चरण 3: समय और क्रम भिन्नता को हटाएं

वर्तमान समय, फ़ाइल संशोधन समय, बिल्ड होस्टनेम और निरपेक्ष पथ (absolute paths) हटाएं। संग्रह क्रम, हैश ट्रैवर्सल क्रम, संपीड़न सेटिंग्स और लोकेल को ठीक करें। दीवार-घड़ी के समय का उपयोग करने के बजाय संस्करण जानकारी में कमिट डाइजेस्ट इंजेक्ट करें।

चरण 4: रैंडमनेस और पैरेललिज्म की जांच करें

रैंडम सीड्स को फिक्स करें, अंतर्निहित रैंडम स्रोतों को अक्षम करें, और उन समानांतर कार्यों का निरीक्षण करें जो अनियंत्रित संग्रह या रेस-प्रोन फ़ाइलें लिखते हैं। यदि रैंडमनेस को हटाया नहीं जा सकता है, तो सत्यापन योग्य रैंडम इनपुट रिकॉर्ड करें और स्थिरता सीमा का उल्लेख करें।

चरण 5: टूलचेन और इनपुट्स को लॉक करें

एक पिन किए गए कंटेनर या टूलचेन का उपयोग करें और डाउनलोड किए गए कंपाइलर, डिपेंडेंसीज और जनरेटर को सत्यापित करें। फ्लोटिंग यूआरएल, अनलॉक किए गए सिस्टम पैकेज, या होस्ट सेटिंग्स से बचें जो बिल्ड रिकॉर्ड से अनुपस्थित हैं।

चरण 6: स्वतंत्र रूप से पुनरुत्पादित करें और लगातार गेट करें

विभिन्न कार्यस्थानों या बिल्डरों से समान इनपुट से पुनर्निर्माण करवाएं और डाइजेस्ट्स, मैनिफेस्ट्स और प्रमुख मध्यवर्ती तत्वों की तुलना करें। CI में डुअल-बिल्ड चेक लगाएं; रीग्रेशन को रोकने के लिए विफल नमूनों, परिवेश विवरणों और अंतर वर्गों को बनाए रखें।

मजबूत नमूना उत्तर

"मैं कमिट, लॉकफाइल, टूलचेन, बेस इमेज और संपूर्ण परिवेश को सुरक्षित रखूंगा, फिर यह निर्धारित करूंगा कि क्या अंतर केवल अंतिम पैकेजिंग में है। दो स्वच्छ कार्यस्थान पाइपलाइन के प्रत्येक चरण की तुलना तब तक करेंगे जब तक कि पहली भिन्न ऑब्जेक्ट या प्रीप्रोसेसर फ़ाइल न मिल जाए।

यदि संग्रह टाइमस्टैम्प, फ़ाइल क्रम, या निरपेक्ष पथ भिन्न हैं, तो मैं रनटाइम मानों को कमिट समय, स्थिर क्रम और पाथ मैपिंग से बदल दूंगा। यदि डिपेंडेंसीज या कंपाइलर ड्रिफ्ट होते हैं, तो मैं उनके डाइजेस्ट्स को पिन कर दूंगा और फ्लोटिंग नेटवर्क इनपुट्स को अस्वीकार कर दूंगा। यादृच्छिक या समानांतर चरणों के लिए, मैं सीड्स को ठीक करूंगा, राइट्स को सॉर्ट करूंगा, या समवर्तीता को कम करूंगा।

इसे ठीक करने के बाद, स्वतंत्र बिल्डर्स रिलीज में गेट प्रवेश करने से पहले अंतिम डाइजेस्ट्स और इंटरमीडिएट मैनिफेस्ट्स की बार-बार तुलना करेंगे। बिल्ड प्रोवेनेंस, सिग्नेचर और SBOMs को मूल, अखंडता और घटक इन्वेंट्री स्थापित करने के लिए अलग से रिकॉर्ड किया जाएगा, बिना यह दावा किए कि वे बाइट-स्तरीय रिप्रॉड्यूसिबिलिटी के बराबर हैं।"

सामान्य गलतियाँ

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

अनुवर्ती प्रश्न और उत्तर

अनुवर्ती 1: क्या साइनिंग नॉन-रिप्रॉड्यूसिबिलिटी को हल कर सकती है?

नहीं। एक सिग्नेचर किसी आर्टिफैक्ट को हस्ताक्षरकर्ता से जोड़ता है, और प्रोवेनेंस बिल्ड के दावे का वर्णन करता है। वे सत्यापन योग्य मूल और अखंडता में सुधार करते हैं लेकिन यह गारंटी नहीं देते हैं कि एक स्वतंत्र पुनर्निर्माण समान बाइट्स उत्पन्न करेगा।

अनुवर्ती 2: क्या परिणाम बाइट-दर-बाइट समान होना चाहिए?

खतरों और उपभोक्ताओं के आधार पर चयन करें। प्रकाशित बायनेरिज़, अनुपालन ऑडिट, या स्वतंत्र सत्यापन के लिए अक्सर बाइट-स्तरीय लक्ष्य की आवश्यकता होती है; अन्यथा अनुमत भिन्नता बताएं और मूल, मैनिफेस्ट और अंतर स्पष्टीकरण प्रदान करें।

अनुवर्ती 3: आप कंपाइलर अनिश्चितता को कैसे संभालते हैं?

एक नियंत्रित टूलचेन में कंपाइलर और लिंकर संस्करणों और डाइजेस्ट्स को पिन करें। यदि बूटस्ट्रैपिंग की आवश्यकता है, तो प्रत्येक चरण में इनपुट और आर्टिफैक्ट रिकॉर्ड करें और घोषित करें कि सत्यापन के बाहर क्या रहता है।

अनुवर्ती 4: क्या होगा यदि कंटेनर डाइजेस्ट अलग है लेकिन फाइलें मेल खाती हैं?

लेयर क्रम, टाइमस्टैम्प, कॉन्फ़िगरेशन, लेबल और संपीड़न मेटाडेटा को विभाजित करें। पैकेजिंग को सामान्य करें और फिर से तुलना करें, जबकि फ़ाइल-स्तरीय डाइजेस्ट को बनाए रखें ताकि पैकेजिंग भिन्नता को स्रोत या बाइनरी भिन्नता न समझ लिया जाए।

अनुवर्ती 5: आप रिप्रॉड्यूसिबिलिटी जांच को डिलीवरी धीमा करने से कैसे रोकते हैं?

मर्ज गेट्स पर एक छोटा डुअल बिल्ड चलाएं और रात में या रिलीज़ से पहले व्यापक क्रॉस-बिल्डर सत्यापन करें। कैश में केवल डाइजेस्ट-चेक किए गए इनपुट का पुनर्चक्रण करें, और चेक विफल होने पर अंतर आर्टिफैक्ट्स को बनाए रखें।

सार्वजनिक स्रोत

संबंधित प्रश्न