چگونه تمام شعب را بدون دست زدن به حتی یک دستگاه به‌روزرسانی کردم

من یک ابزار دسکتاپ داخلی با استفاده از Electron ساختم. این ابزار روی دستگاه‌های بسیاری از شعب مختلف اجرا می‌شود. این شعب دارای شبکه‌های متفاوت و سطوح مختلفی از مهارت‌های IT هستند.

هفته گذشته، نیاز داشتم که یک اصلاحیه (fix) را بلافاصله به تمام دستگاه‌ها برسانم. به هیچ شعبی سر نزدم. فایل‌های نصب را ایمیل نکردم. از کسی هم نخواستم که روی نصب کلیک کند.

من دو دستور در ترمینالم اجرا کردم و از آنجا دور شدم. تا صبح روز بعد، تمام دستگاه‌ها به‌روزرسانی شده بودند.

این روش به این دلیل کار کرد که ماه‌ها پیش، یک سیستم به‌روزرسانی خودکار با استفاده از electron-updater ساخته بودم.

وقتی نرم‌افزار را به مکان‌های دوردست ارسال می‌کنید، با این مشکلات روبرو می‌شوید:

  • نمی‌توانید برای اجرای فایل‌های نصب به کاربران تکیه کنید.
  • نمی‌توانید فرض کنید که پشتیبانی IT در محل حضور دارد.
  • دسترسی از راه دور قابلیت مقیاس‌پذیری ندارد.
  • توزیع دستی به بزرگترین گلوگاه شما تبدیل می‌شود.

راه حل این است که فایل نصب را از این فرآیند حذف کنید.

سیستم من از یک HTTP provider عمومی استفاده می‌کند. من به‌روزرسانی‌ها را از طریق SFTP روی یک وب‌سرور خصوصی میزبانی می‌کنم. این کار باعث می‌شود نرم‌افزارهای داخلی از مخازن عمومی مانند GitHub دور بمانند.

این فرآیند چهار لایه دارد:

  • ساخت و انتشار (Build and publish): کامپایل کردن اپلیکیشن و آپلود فایل‌ها روی سرور.
  • فرآیند اصلی (Main process): بررسی نسخه‌های جدید و دانلود بی‌صدای آن‌ها.
  • پل پیش‌بارگذاری (Preload bridge): انتقال ایمن رویدادهای به‌روزرسانی به رابط کاربری (UI).
  • رابط کاربری رندرکننده (Renderer UI): نمایش پیشرفت کار به کاربر بدون اجازه دادن به او برای متوقف کردن آن.

روند به‌روزرسانی به این صورت است:

  1. من یک اسکریپت انتشار (publish script) اجرا می‌کنم. این اسکریپت اپلیکیشن را می‌سازد و فایل‌ها را آپلود می‌کند.
  2. اپلیکیشن از یک فایل latest.yml برای بررسی به‌روزرسانی‌ها استفاده می‌کند. این فایل شامل نسخه و یک هش امنیتی (security hash) است.
  3. هنگام اجرا، اپلیکیشن سرور را بررسی می‌کند.
  4. اگر نسخه جدیدی وجود داشته باشد، آن را به‌طور خودکار دانلود می‌کند.
  5. پس از اتمام دانلود، اپلیکیشن بسته شده و به‌روزرسانی را نصب می‌کند.

من از autoDownload: true استفاده می‌کنم. این یعنی کاربران مجبور نیستند روی چیزی کلیک کنند. همچنین یک نوار پیشرفت (progress bar) در UI نشان می‌دهم. این کار به کاربران دید کافی می‌دهد بدون اینکه آن‌ها را مجبور به تصمیم‌گیری کند.

درس‌هایی برای ساخت نرم‌افزارهای دسکتاپ داخلی:

  • برای کنترل کامل، از یک HTTP provider عمومی استفاده کنید.
  • همیشه در هنگام آپلود، فایل‌های متادیتا (metadata) را بازنویسی کنید.
  • برای اتصالات ناپایدار، منطق ادامه دانلود (resume logic) را در اسکریپت آپلود خود بگنجانید.
  • از دانلودهای بی‌صدا استفاده کنید اما یک نوار پیشرفت قابل مشاهده نشان دهید.
  • همیشه به‌روزرسانی‌ها را با یک هش SHA-512 تأیید کنید.

ساخت این خط لوله (pipeline) در مراحل اولیه، روزها از کار دستی من را ذخیره کرد.

منبع: https://dev.to/vinniharu/how-i-pushed-a-critical-update-to-every-company-branch-without-touching-a-single-machine-electron-4pk1