एकाही मशीनला स्पर्श न करता मी प्रत्येक शाखेत अपडेट कसे केले
मी Electron वापरून एक अंतर्गत डेस्कटॉप टूल तयार केले आहे. ते अनेक शाखा कार्यालयांच्या मशीनवर चालते. या कार्यालयांचे नेटवर्क वेगवेगळे आहे आणि आयटी (IT) कौशल्याची पातळी देखील भिन्न आहे.
गेल्या आठवड्यात, मला तातडीने प्रत्येक मशीनवर एक 'फिक्स' (fix) पाठवणे आवश्यक होते. मी कोणत्याही शाखेत प्रत्यक्ष गेलो नाही. मी सेटअप फाइल्स ईमेल केल्या नाहीत. मी कोणालाही 'install' वर क्लिक करण्यास सांगितले नाही.
मी माझ्या टर्मिनलमध्ये दोन कमांड्स चालवल्या आणि काम सोडून दिले. दुसऱ्या दिवशी सकाळपर्यंत, प्रत्येक मशीनवर अपडेट झाले होते.
हे शक्य झाले कारण मी काही महिन्यांपूर्वी electron-updater वापरून एक ऑटो-अपडेट सिस्टम तयार केली होती.
जेव्हा तुम्ही रिमोट लोकेशन्सवर सॉफ्टवेअर पाठवता, तेव्हा तुम्हाला या समस्यांचा सामना करावा लागतो:
- इन्स्टॉलर्स चालवण्यासाठी तुम्ही वापरकर्त्यांवर अवलंबून राहू शकत नाही.
- आयटी सपोर्ट (IT support) तिथे उपलब्ध असेल असे गृहीत धरता येत नाही.
- रिमोट ॲक्सेस मोठ्या प्रमाणावर वापरणे कठीण जाते (does not scale).
- मॅन्युअल वितरण ही तुमची सर्वात मोठी अडचण (bottleneck) बनते.
यावर उपाय म्हणजे या प्रक्रियेतून इन्स्टॉलर काढून टाकणे.
माझी सिस्टम एक generic HTTP provider वापरते. मी SFTP द्वारे एका खाजगी वेब सर्व्हरवर अपडेट्स होस्ट करतो. यामुळे अंतर्गत सॉफ्टवेअर GitHub सारख्या सार्वजनिक रिपॉझिटरीजपासून सुरक्षित राहते.
या प्रक्रियेचे चार स्तर आहेत:
- Build and publish: ॲप कंपाईल करा आणि सर्व्हरवर फाइल्स अपलोड करा.
- Main process: नवीन व्हर्जन तपासा आणि ती शांतपणे (silently) डाउनलोड करा.
- Preload bridge: अपडेट इव्हेंट्स सुरक्षितपणे UI कडे पाठवा.
- Renderer UI: वापरकर्त्याला प्रगती (progress) दाखवा, पण त्यांना ती थांबवू देऊ नका.
अपडेटची प्रक्रिया खालीलप्रमाणे चालते:
- मी एक publish script चालवतो. ते ॲप बिल्ड करते आणि फाइल्स अपलोड करते.
- ॲप अपडेट्स तपासण्यासाठी latest.yml फाईल वापरते. या फाईलमध्ये व्हर्जन आणि सिक्युरिटी हॅश (security hash) असतो.
- सुरू होताना, ॲप सर्व्हर तपासते.
- जर नवीन व्हर्जन उपलब्ध असेल, तर ते आपोआप डाउनलोड होते.
- डाउनलोड पूर्ण झाल्यावर, ॲप बंद होते आणि अपडेट इन्स्टॉल करते.
मी autoDownload: true वापरतो. याचा अर्थ वापरकर्त्यांना कशावरही क्लिक करण्याची गरज नाही. मी UI मध्ये प्रोग्रेस बार (progress bar) देखील दाखवतो. यामुळे वापरकर्त्यांना प्रगती दिसते, पण त्यांना कोणताही निर्णय घेण्याची गरज पडत नाही.
अंतर्गत डेस्कटॉप सॉफ्टवेअर तयार करण्यासाठी काही धडे:
- पूर्ण नियंत्रणासाठी generic HTTP provider वापरा.
- अपलोड करताना नेहमी मेटाडेटा फाइल्स ओव्हरराईट (overwrite) करा.
- अस्थिर कनेक्शनसाठी (flaky connections) तुमच्या अपलोड स्क्रिप्टमध्ये 'resume logic' तयार करा.
- सायलेंट डाउनलोड्स वापरा पण एक दृश्य प्रोग्रेस बार दाखवा.
- अपडेट्स नेहमी SHA-512 हॅशसह सत्यापित (verify) करा.
ही पाइपलाइन सुरुवातीलाच तयार केल्यामुळे माझे अनेक दिवसांचे मॅन्युअल काम वाचले.
