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:
- Uruchamiam skrypt publikacji. Buduje on aplikację i przesyła pliki.
- Aplikacja używa pliku
latest.ymldo sprawdzania aktualizacji. Plik ten zawiera wersję oraz skrót bezpieczeństwa (hash). - Przy uruchomieniu aplikacja sprawdza serwer.
- Jeśli istnieje nowa wersja, zostaje ona pobrana automatycznie.
- 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.
