मैंने बिना किसी मशीन को छुए हर ब्रांच को कैसे अपडेट किया

मैंने Electron का उपयोग करके एक इंटरनल डेस्कटॉप टूल बनाया। यह कई ब्रांच ऑफिसों की मशीनों पर चलता है। इन ऑफिसों के नेटवर्क अलग-अलग हैं और आईटी कौशल (IT skill) का स्तर भी अलग-अलग है।

पिछले हफ्ते, मुझे तुरंत हर मशीन पर एक फिक्स (fix) भेजना था। मैं किसी भी ब्रांच में नहीं गया। मैंने सेटअप फाइलें ईमेल नहीं कीं। मैंने किसी से इंस्टॉल पर क्लिक करने के लिए नहीं कहा।

मैंने अपने टर्मिनल में दो कमांड चलाए और काम खत्म कर दिया। अगली सुबह तक, हर मशीन पर अपडेट आ चुका था।

यह इसलिए काम कर पाया क्योंकि मैंने महीनों पहले electron-updater का उपयोग करके एक ऑटो-अपडेट सिस्टम बनाया था।

जब आप रिमोट लोकेशन्स पर सॉफ्टवेयर भेजते हैं, तो आपको इन समस्याओं का सामना करना पड़ता है:

  • आप इंस्टॉलर्स चलाने के लिए यूजर्स पर भरोसा नहीं कर सकते।
  • आप यह मानकर नहीं चल सकते कि आईटी सपोर्ट ऑन-साइट मौजूद है।
  • रिमोट एक्सेस को स्केल (scale) करना मुश्किल होता है।
  • मैन्युअल डिस्ट्रीब्यूशन आपकी सबसे बड़ी बाधा बन जाता है।

इसका समाधान इंस्टॉलर को इस प्रक्रिया से बाहर करना है।

मेरा सिस्टम एक जेनेरिक HTTP प्रोवाइडर का उपयोग करता है। मैं SFTP के माध्यम से एक प्राइवेट वेब सर्वर पर अपडेट होस्ट करता हूँ। इससे इंटरनल सॉफ्टवेयर GitHub जैसे पब्लिक रिपॉजिटरी से बाहर रहता है।

इस प्रक्रिया के चार लेयर्स (layers) हैं:

  • बिल्ड और पब्लिश: ऐप को कंपाइल करें और फाइलों को सर्वर पर अपलोड करें।
  • मेन प्रोसेस: नए वर्जन की जांच करें और उन्हें साइलेंटली (silently) डाउनलोड करें।
  • प्रीलोड ब्रिज: अपडेट इवेंट्स को सुरक्षित रूप से UI तक पहुँचाएँ।
  • रेंडरर UI: यूजर को प्रोग्रेस दिखाएं लेकिन उन्हें इसे रोकने न दें।

अपडेट का फ्लो इस प्रकार है:

  1. मैं एक पब्लिश स्क्रिप्ट चलाता हूँ। यह ऐप को बिल्ड करती है और फाइलों को अपलोड करती है।
  2. ऐप अपडेट चेक करने के लिए latest.yml फाइल का उपयोग करता है। इस फाइल में वर्जन और एक सिक्योरिटी हैश (security hash) होता है।
  3. लॉन्च होने पर, ऐप सर्वर की जांच करता है।
  4. यदि कोई नया वर्जन मौजूद है, तो यह उसे ऑटोमैटिकली डाउनलोड कर लेता है।
  5. डाउनलोड पूरा होने के बाद, ऐप बंद हो जाता है और अपडेट इंस्टॉल कर देता है।

मैं autoDownload: true का उपयोग करता हूँ। इसका मतलब है कि यूजर्स को कुछ भी क्लिक करने की आवश्यकता नहीं है। मैं UI में एक प्रोग्रेस बार भी दिखाता हूँ। इससे यूजर्स को बिना कोई निर्णय लिए प्रोग्रेस की जानकारी मिल जाती है।

इंटरनल डेस्कटॉप सॉफ्टवेयर बनाने के लिए सबक:

  • पूर्ण नियंत्रण के लिए जेनेरिक HTTP प्रोवाइडर का उपयोग करें।
  • अपलोड के दौरान हमेशा मेटाडेटा फाइलों को ओवरराइट करें।
  • खराब कनेक्शन (flaky connections) के लिए अपने अपलोड स्क्रिप्ट में रिज्यूम लॉजिक (resume logic) शामिल करें।
  • साइलेंट डाउनलोड का उपयोग करें लेकिन एक दृश्य प्रोग्रेस बार दिखाएं।
  • हमेशा SHA-512 हैश के साथ अपडेट को वेरीफाई करें।

इस पाइपलाइन को पहले ही बना लेने से मेरे मैन्युअल काम के कई दिन बच गए।

स्रोत: https://dev.to/vinniharu/how-i-pushed-a-critical-update-to-every-company-branch-without-touching-a-single-machine-electron-4pk1