Wie ich jede Filiale aktualisiert habe, ohne auch nur eine einzige Maschine anzufassen

Ich habe ein internes Desktop-Tool mit Electron entwickelt. Es läuft auf Rechnern in vielen verschiedenen Filialen. Diese Standorte verfügen über unterschiedliche Netzwerke und unterschiedliche IT-Kenntnisse.

Letzte Woche musste ich sofort einen Fix an alle Rechner ausrollen. Ich habe keine Filiale besucht. Ich habe keine Setup-Dateien per E-Mail verschickt. Ich habe niemanden gebeten, auf „Installieren“ zu klicken.

Ich habe zwei Befehle in meinem Terminal ausgeführt und mich dann zurückgezogen. Bis zum nächsten Morgen hatte jeder Rechner das Update erhalten.

Das hat funktioniert, weil ich vor Monaten ein Auto-Update-System mit electron-updater gebaut habe.

Wenn man Software an entfernte Standorte ausliefert, stößt man auf folgende Probleme:

  • Man kann sich nicht darauf verlassen, dass Benutzer Installer ausführen.
  • Man kann nicht davon ausgehen, dass IT-Support vor Ort ist.
  • Remote-Zugriff lässt sich nicht skalieren.
  • Die manuelle Verteilung wird zum größten Flaschenhals.

Die Lösung besteht darin, den Installer aus dem Prozess zu entfernen.

Mein System verwendet einen generischen HTTP-Provider. Ich hoste die Updates auf einem privaten Webserver via SFTP. So bleibt interne Software außerhalb öffentlicher Repositories wie GitHub.

Der Prozess besteht aus vier Ebenen:

  • Build und Publish: Die App kompilieren und Dateien auf den Server hochladen.
  • Main Process: Nach neuen Versionen suchen und diese im Hintergrund (silent) herunterladen.
  • Preload Bridge: Update-Events sicher an das UI weiterleiten.
  • Renderer UI: Dem Benutzer den Fortschritt anzeigen, ohne ihm die Möglichkeit zu geben, ihn zu stoppen.

So sieht der Update-Ablauf aus:

  1. Ich führe ein Publish-Skript aus. Es baut die App und lädt die Dateien hoch.
  2. Die App nutzt eine latest.yml-Datei, um nach Updates zu suchen. Diese Datei enthält die Version und einen Sicherheits-Hash.
  3. Beim Start prüft die App den Server.
  4. Wenn eine neue Version existiert, wird sie automatisch heruntergeladen.
  5. Sobald der Download abgeschlossen ist, beendet sich die App und installiert das Update.

Ich verwende autoDownload: true. Das bedeutet, dass die Benutzer nichts anklicken müssen. Ich zeige zudem einen Fortschrittsbalken im UI an. Das bietet den Benutzern Transparenz, ohne sie zu einer Entscheidung zwingen zu müssen.

Lektionen für die Entwicklung interner Desktop-Software:

  • Verwenden Sie einen generischen HTTP-Provider für die volle Kontrolle.
  • Überschreiben Sie beim Upload immer die Metadaten-Dateien.
  • Integrieren Sie eine Resume-Logik in Ihr Upload-Skript für instabile Verbindungen.
  • Nutzen Sie Silent-Downloads, aber zeigen Sie einen sichtbaren Fortschrittsbalken an.
  • Verifizieren Sie Updates immer mit einem SHA-512-Hash.

Der frühzeitige Aufbau dieser Pipeline hat mir Tage an manueller Arbeit erspart.

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