How I Updated Every Branch Without Touching A Single Machine

Zbudowałem wewnętrzne narzędzie desktopowe przy użyciu Electrona. Działa ono na maszynach w wielu oddziałach. Biura te mają różne sieci i różny poziom umiejętności IT.

W zeszłym tygodniu musiałem natychmiast przesłać poprawkę na każdą maszynę. Nie odwiedziłem żadnego oddziału. Nie wysyłałem plików instalacyjnych e-mailem. Nie prosiłem nikogo o kliknięcie „instaluj”.

Uruchomiłem dwie komendy w terminalu i odszedłem od komputera. Następnego ranka każda maszyna miała już aktualizację.

Zadziałało to, ponieważ kilka miesięcy temu zbudowałem system automatycznych aktualizacji przy użyciu electron-updater.

Kiedy dostarczasz oprogramowanie do oddalonych lokalizacji, napotykasz następujące problemy:

  • Nie możesz polegać na tym, że użytkownicy uruchomią instalatory.
  • Nie możesz zakładać, że wsparcie IT jest na miejscu.
  • Dostęp zdalny nie skaluje się dobrze.
  • Ręczna dystrybucja staje się Twoim największym wąskim gardłem.

Rozwiązaniem jest wyeliminowanie instalatora z całego procesu.

Mój system korzysta z ogólnego dostawcy HTTP. Hostuję aktualizacje na prywatnym serwerze WWW za pomocą SFTP. Dzięki temu wewnętrzne oprogramowanie pozostaje poza publicznymi repozytoriami, takimi jak GitHub.

Proces składa się z czterech warstw:

  • Build and publish: Kompilacja aplikacji i przesyłanie plików na serwer.
  • Main process: Sprawdzanie nowych wersji i ich ciche pobieranie.
  • Preload bridge: Bezpieczne przekazywanie zdarzeń aktualizacji do UI.
  • Renderer UI: Pokazywanie użytkownikowi postępu bez możliwości jego zatrzymania.

Oto jak przebiega proces aktualizacji:

  1. Uruchamiam skrypt publikacji. Buduje on aplikację i przesyła pliki.
  2. Aplikacja używa pliku latest.yml do sprawdzania aktualizacji. Plik ten zawiera wersję oraz skrót bezpieczeństwa (hash).
  3. Przy uruchomieniu aplikacja sprawdza serwer.
  4. Jeśli istnieje nowa wersja, zostaje ona pobrana automatycznie.
  5. Po zakończeniu pobierania aplikacja zamyka się i instaluje aktualizację.

Używam autoDownload: true. Oznacza to, że użytkownicy nie muszą niczego klikać. Pokazuję również pasek postępu w UI. Daje to użytkownikom widoczność procesu, nie zmuszając ich do podejmowania decyzji.

Lekcje przy budowaniu wewnętrznego oprogramowania desktopowego:

  • Używaj ogólnego dostawcy HTTP, aby mieć pełną kontrolę.
  • Zawsze nadpisuj pliki metadanych podczas przesyłania.
  • Zaimplementuj logikę wznawiania w skrypcie przesyłania plików na wypadek niestabilnych połączeń.
  • Stosuj ciche pobieranie, ale pokazuj widoczny pasek postępu.
  • Zawsze weryfikuj aktualizacje za pomocą skrótu SHA-512.

Wczesne zbudowanie tego pipeline'u zaoszczędziło mi dni ręcznej pracy.

Źródło: https://dev.to/vinniharu/how-i-pushed-a-critical-update-to-every-company-branch-without-touching-a-single-machine-electron-4pk1