CI रनर का VPN: क्या टनल बिल्ड से ज़्यादा टिकता है?
साझा CI रनर कामों के बीच रूट और प्रक्रियाएँ बनाए रखता है। काम से पहले, उसके दौरान और बाद में VPN की स्थितियों की योजना बनाएँ, और केवल उसी कनेक्शन को साफ़ करें जो काम का अपना है।
एक डिप्लॉयमेंट काम जुड़ता है, अपना आर्टिफ़ैक्ट कॉपी करता है और सफलता की सूचना देता है। उसने जो टनल खोला है वह अगला काम शुरू होने पर भी चालू हो सकता है, और उसने जो रूट बदला वह पूरे होस्ट का है। बिल्ड का नतीजा कमांड का वर्णन करता है, उस स्थिति का नहीं जो उसने पीछे छोड़ी। VPN को ऐसे संसाधन की तरह देखें जिसकी उम्र हो, किसी स्टेज की शुरुआत में एक पंक्ति की तरह नहीं।
इस होस्ट पर और क्या चलता है
एक Jenkins नोड एक साथ कई एग्ज़ीक्यूटर चला सकता है, और जो काम होस्ट के रूट, रिज़ॉल्वर सेटिंग्स या सिस्टम-व्यापी कनेक्शन बदलता है वह उन्हें सबके लिए बदल देता है। क्या कोई दूसरा काम इसे नोटिस करेगा, यह रूट और फ़िल्टरिंग नीति पर निर्भर है, VPN के बारे में किसी सामान्य नियम पर नहीं। रिपॉज़िटरी एक्सेस, आर्टिफ़ैक्ट एक्सेस और कंट्रोल चैनल अलग-अलग आवश्यकताएँ हैं जिनकी रनर को अब भी ज़रूरत है। पूरा टनल चुनने से पहले उन्हें डिप्लॉयमेंट गंतव्यों की सूची में जोड़ें।
अगर कंट्रोल चैनल टनल के आर-पार जाना है, तो डिज़ाइन को यह जानबूझकर कहना होगा। रोलबैक के दौरान इसका पता लगाना कोई योजना नहीं है। दो सूचियाँ लिखें: काम को निजी तौर पर कहाँ पहुँचना है, और रनर को हर हाल में कहाँ पहुँचना है।
क्या इस काम को निजी एक्सेस की ज़रूरत ही है?
टनल जोड़ने से पहले पूछें कि क्या बिल्ड स्टेज को इसकी ज़रूरत है। एक निजी डिप्लॉयमेंट एजेंट मंज़ूर आर्टिफ़ैक्ट लाकर डिप्लॉयमेंट कर सकता है, जिससे सामान्य बिल्ड स्टेज निजी नेटवर्क से बाहर रहता है। यह बँटवारा आम तौर पर हर बिल्ड चरण को टनल से रूट करना सिखाने से सस्ता है।
सीमा आदत से नहीं, कार्यप्रवाह से चुनें। अगर जवाब नहीं है, तो इस पेज का बाकी हिस्सा अनावश्यक है, और यही सबसे अच्छा उपलब्ध नतीजा है।
अगला काम जो स्थिति विरासत में लेता है
बताएँ कि काम से पहले, निजी एक्सेस रहते हुए और काम खत्म होने के बाद—रद्द होने सहित—क्या सच होना चाहिए। अंतिम स्थिति ही सबसे ज़्यादा अनकही रह जाती है, और वही अगला काम विरासत में लेता है। इसे किसी की याद में छोड़ने के बजाय pipeline के पास लिखें।
| Moment | What proves it | What leaks if it is skipped |
|---|---|---|
| Job start: pre-flight route check | The route table shows no tunnel from an earlier job, and the profile list is empty | A stale route sends deployment traffic into a dead tunnel |
| Job end: disconnect and shred | The profile is down and the temporary key file is gone | The next job inherits an open tunnel and a usable credential |
| Cancelled job: reboot or disposal | The host is replaced or rebooted before the next job starts | A killed process leaves the tunnel up with no owner |
समर्पित या एक बार इस्तेमाल होने वाला एजेंट इन सीमाओं को लागू करना आसान बनाता है। कंटेनर या नेमस्पेस तभी मदद करता है जब उसकी नेटवर्क और विशेषाधिकार व्यवस्था बदलाव को वाकई अलग करती हो।
प्रोग्राम नहीं, कनेक्शन रोकें
इस काम ने जो कनेक्शन शुरू किया उसे बंद करने और उसके अस्थायी क्रेडेंशियल हटाने के लिए pipeline के फ़ाइनलाइज़ेशन पथ का उपयोग करें। जिस होस्ट पर दूसरे काम चलते हैं वहाँ प्रक्रियाओं को प्रोग्राम के नाम से मिलाएँ नहीं; इसके बजाय उस विशिष्ट कनेक्शन को रोकें। नीचे दिए दो कमांड ही पूरी सफ़ाई हैं, और कोई भी प्रक्रिया खोजने पर निर्भर नहीं है।
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
फ़ाइनलाइज़ेशन अलगाव नहीं है: मरता हुआ रनर अपना खोला टनल रखे रहता है, और ज़बरदस्ती रोका गया प्रक्रिया ब्लॉक को पूरी तरह छोड़ देता है। इसीलिए सिर्फ़ सफ़ाई का कमांड पूरा डिज़ाइन नहीं हो सकता। व्यवहार में यह ऐसे विफल होता है: डिप्लॉयमेंट काम कॉपी चरण पर रद्द हो जाता है, फ़ाइनलाइज़ेशन ब्लॉक कभी नहीं चलता, और उसी होस्ट पर अगला काम जीवित टनल और ऐसे नेटवर्क की ओर जाते रूट के साथ शुरू होता है जहाँ वह पहुँच नहीं सकता। विफलता अगले बिल्ड में 'DNS' समस्या जैसी दिखती है, उस काम के खत्म होने के घंटों बाद जिसने उसे पैदा किया।
काम के आउटपुट में प्रोफ़ाइल का नाम और क्रेडेंशियल का पथ दर्ज करें। बिना किसी पहचानकर्ता वाला खाली डिस्कनेक्ट कमांड बाद में ऑडिट करना कठिन है। लॉग की पंक्ति भी वही है जो साबित करती है कि ब्लॉक चला था, जब बाद की जाँच पूछती है।
काम को ऐसा होस्ट दें जिसे कोई और इस्तेमाल न करता हो
निपटाए जाने योग्य अवसंरचना विरासत की समस्या को संभालने के बजाय हटा देती है। हर काम के लिए नया एजेंट बिना रूट, बिना प्रोफ़ाइल और बिना किसी और के क्रेडेंशियल के शुरू होता है, और उसका विनाश काम ने जो छोड़ा है उसे साफ़ कर देता है। इसका खर्च हर बिल्ड पर ज़्यादा है, और यह उस सीमा की ईमानदार कीमत है जो सफ़ाई कोड पर निर्भर नहीं है। प्रोडक्शन नेटवर्क को छूने वाले कामों के लिए, घटनाएँ गिनने के बाद आम तौर पर यही सस्ता विकल्प है।
जहाँ साझा रनर रहना ही हो, वहाँ विफलता और रद्दीकरण की जाँच सफल कॉपी जितनी ही सावधानी से करें। जाँच को दिखाना चाहिए कि अगर यह काम आधे रास्ते में रद्द होता तो अगला काम क्या देखता। काम तब पूरा होता है जब उसकी एक्सेस और अस्थायी स्थिति खत्म हो जाए, तब नहीं जब कॉपी कमांड शून्य लौटाए।