איך עדכנתי כל סניף בלי לגעת במכונה אחת
בניתי כלי דסקטופ פנימי באמצעות Electron. הוא רץ על מכונות ברבים מסניפי החברה. לסניפים הללו יש רשתות שונות ורמות שונות של מיומנות IT.
בשבוע שעבר, הייתי צריך להפיץ תיקון לכל מכונה באופן מיידי. לא ביקרתי באף סניף. לא שלחתי קבצי התקנה במייל. לא ביקשתי מאף אחד ללחוץ על "התקן".
הרצתי שתי פקודות בטרמינל שלי והלכתי. עד למחרת בבוקר, לכל מכונה היה את העדכון.
זה עבד כי בניתי מערכת עדכון אוטומטי באמצעות electron-updater לפני חודשים.
כשמפיצים תוכנה למיקומים מרוחקים, נתקלים בבעיות הבאות:
- אי אפשר להסתמך על משתמשים שיריצו מתקינים.
- אי אפשר להניח שתמיכת IT נמצאת באתר (on-site).
- גישה מרחוק אינה ניתנת להרחבה (scale).
- הפצה ידנית הופכת לצוואר הבקבוק הגדול ביותר שלך.
הפתרון הוא להוציא את המתקין מהתהליך.
המערכת שלי משתמשת ב-HTTP provider גנרי. אני מארח עדכונים בשרת אינטרנט פרטי באמצעות SFTP. זה שומר על התוכנה הפנימית מחוץ למאגרים ציבוריים כמו GitHub.
לתהליך יש ארבע שכבות:
- Build ו-publish: קומפילציה של האפליקציה והעלאת הקבצים לשרת.
- Main process: בדיקת גרסאות חדשות והורדתן בשקט.
- Preload bridge: העברת אירועי עדכון ל-UI בצורה בטוחה.
- Renderer UI: הצגת התקדמות למשתמש מבלי לאפשר לו לעצור אותה.
כך זורם העדכון:
- אני מריץ סקריפט publish. הוא בונה את האפליקציה ומעלה את הקבצים.
- האפליקציה משתמשת בקובץ
latest.ymlכדי לבדוק אם יש עדכונים. קובץ זה מכיל את הגרסה ואת ה-security hash. - עם ההפעלה, האפליקציה בודקת את השרת.
- אם קיימת גרסה חדשה, היא מורידה אותה באופן אוטומטי.
- ברגע שההורדה מסתיימת, האפליקציה נסגרת ומתקינה את העדכון.
אני משתמש ב-autoDownload: true. זה אומר שמשתמשים לא צריכים ללחוץ על שום דבר. אני גם מציג סרגל התקדמות ב-UI. זה מעניק למשתמשים נראות (visibility) מבלי להכריח אותם לקבל החלטה.
לקחים לבניית תוכנת דסקטופ פנימית:
- השתמשו ב-HTTP provider גנרי לשליטה מלאה.
- תמיד דרסו קבצי מטא-דאטה במהלך ההעלאה.
- בנו לוגיקת resume בתוך סקריפט ההעלאה עבור חיבורים לא יציבים.
- השתמשו בהורדות שקטות אך הציגו סרגל התקדמות גלוי.
- תמיד ודאו עדכונים באמצעות SHA-512 hash.
בניית ה-pipeline הזה בשלב מוקדם חסכה לי ימים של עבודה ידנית.
