كيف قمت بتحديث كل فرع دون لمس جهاز واحد

قمت ببناء أداة سطح مكتب داخلية باستخدام Electron. تعمل هذه الأداة على أجهزة موزعة عبر العديد من الفروع. تمتلك هذه الفروع شبكات مختلفة ومستويات متفاوتة من المهارات التقنية.

في الأسبوع الماضي، احتجت إلى إرسال إصلاح لكل جهاز على الفور. لم أزر أي فرع، ولم أرسل ملفات التثبيت عبر البريد الإلكتروني، ولم أطلب من أي شخص النقر على "تثبيت".

قمت بتشغيل أمرين في واجهة السطر البرمجي (terminal) ثم تركت الأمر. وبحلول صباح اليوم التالي، كان التحديث قد وصل إلى كل جهاز.

نجح هذا الأمر لأنني قمت ببناء نظام تحديث تلقائي باستخدام electron-updater منذ عدة أشهر.

عندما تقوم بإرسال برمجيات إلى مواقع بعيدة، ستواجه هذه المشكلات:

  • لا يمكنك الاعتماد على المستخدمين لتشغيل ملفات التثبيت.
  • لا يمكنك افتراض وجود دعم تقني في الموقع.
  • الوصول عن بُعد لا يتوسع بشكل فعال.
  • يصبح التوزيع اليدوي هو أكبر عائق أمامك.

الحل هو إخراج ملف التثبيت من العملية.

يستخدم نظامي مزود HTTP عام. أقوم باستضافة التحديثات على خادم ويب خاص عبر SFTP. هذا يبقي البرمجيات الداخلية بعيدة عن المستودعات العامة مثل GitHub.

تتكون العملية من أربع طبقات:

  • البناء والنشر (Build and publish): تجميع التطبيق ورفع الملفات إلى الخادم.
  • العملية الرئيسية (Main process): التحقق من وجود إصدارات جديدة وتنزيلها بصمت.
  • جسر التحميل المسبق (Preload bridge): نقل أحداث التحديث إلى واجهة المستخدم بأمان.
  • واجهة المستخدم (Renderer UI): عرض التقدم للمستخدم دون السماح له بإيقافه.

إليك كيفية تدفق عملية التحديث:

  1. أقوم بتشغيل نص برمجي للنشر (publish script). يقوم ببناء التطبيق ورفع الملفات.
  2. يستخدم التطبيق ملف latest.yml للتحقق من التحديثات. يحتوي هذا الملف على الإصدار ورمز التحقق الأمني (security hash).
  3. عند التشغيل، يتحقق التطبيق من الخادم.
  4. إذا وجد إصدار جديد، يتم تنزيله تلقائيًا.
  5. بمجرد انتهاء التنزيل، يغلق التطبيق نفسه ويقوم بتثبيت التحديث.

أستخدم autoDownload: true. وهذا يعني أن المستخدمين ليس عليهم النقر على أي شيء. كما أعرض شريط تقدم في واجهة المستخدم، مما يمنح المستخدمين رؤية واضحة للعملية دون إجبارهم على اتخاذ قرار.

دروس لبناء برمجيات سطح مكتب داخلية:

  • استخدم مزود HTTP عامًا للتحكم الكامل.
  • قم دائمًا باستبدال ملفات البيانات الوصفية (metadata) أثناء الرفع.
  • قم ببناء منطق استئناف (resume logic) في النص البرمجي للرفع للتعامل مع الاتصالات غير المستقرة.
  • استخدم التنزيلات الصامتة ولكن اعرض شريط تقدم مرئيًا.
  • تحقق دائمًا من التحديثات باستخدام SHA-512 hash.

لقد وفر لي بناء هذا المسار (pipeline) مبكرًا أيامًا من العمل اليدوي.

المصدر: https://dev.to/vinniharu/how-i-pushed-a-critical-update-to-every-company-branch-without-touching-a-single-machine-electron-4pk1