Cách tôi cập nhật mọi chi nhánh mà không cần chạm vào bất kỳ máy tính nào
Tôi đã xây dựng một công cụ desktop nội bộ bằng Electron. Nó chạy trên các máy tính tại nhiều văn phòng chi nhánh khác nhau. Các văn phòng này có mạng lưới và trình độ IT khác nhau.
Tuần trước, tôi cần gửi một bản sửa lỗi đến mọi máy tính ngay lập tức. Tôi không đến bất kỳ chi nhánh nào. Tôi không gửi email các tệp cài đặt. Tôi cũng không yêu cầu bất kỳ ai phải nhấn nút cài đặt.
Tôi chỉ chạy hai câu lệnh trong terminal rồi rời đi. Đến sáng hôm sau, mọi máy tính đều đã được cập nhật.
Điều này thành công là nhờ tôi đã xây dựng một hệ thống tự động cập nhật bằng electron-updater từ nhiều tháng trước.
Khi bạn phân phối phần mềm đến các địa điểm từ xa, bạn sẽ đối mặt với những vấn đề sau:
- Bạn không thể dựa vào người dùng để chạy các trình cài đặt.
- Bạn không thể mặc định rằng luôn có hỗ trợ IT tại chỗ.
- Truy cập từ xa không có khả năng mở rộng.
- Phân phối thủ công sẽ trở thành nút thắt cổ chai lớn nhất của bạn.
Giải pháp là loại bỏ trình cài đặt ra khỏi quy trình.
Hệ thống của tôi sử dụng một HTTP provider thông thường. Tôi lưu trữ các bản cập nhật trên một máy chủ web riêng tư thông qua SFTP. Điều này giúp giữ các phần mềm nội bộ tránh khỏi các kho lưu trữ công khai như GitHub.
Quy trình này có bốn lớp:
- Build and publish: Biên dịch ứng dụng và tải các tệp lên máy chủ.
- Main process: Kiểm tra các phiên bản mới và tải chúng xuống một cách âm thầm.
- Preload bridge: Chuyển tiếp các sự kiện cập nhật đến UI một cách an toàn.
- Renderer UI: Hiển thị tiến trình cho người dùng mà không cho phép họ dừng lại.
Dưới đây là luồng cập nhật:
- Tôi chạy một script publish. Nó sẽ build ứng dụng và tải các tệp lên.
- Ứng dụng sử dụng tệp
latest.ymlđể kiểm tra cập nhật. Tệp này chứa phiên bản và một mã băm bảo mật (security hash). - Khi khởi chạy, ứng dụng sẽ kiểm tra máy chủ.
- Nếu có phiên bản mới, nó sẽ tự động tải xuống.
- Sau khi quá trình tải xuống hoàn tất, ứng dụng sẽ thoát và cài đặt bản cập nhật.
Tôi sử dụng autoDownload: true. Điều này có nghĩa là người dùng không cần phải nhấn bất cứ thứ gì. Tôi cũng hiển thị một thanh tiến trình (progress bar) trong UI. Việc này giúp người dùng nắm bắt được tình hình mà không cần phải đưa ra quyết định.
Bài học khi xây dựng phần mềm desktop nội bộ:
- Sử dụng một HTTP provider thông thường để có toàn quyền kiểm soát.
- Luôn ghi đè các tệp metadata trong quá trình tải lên.
- Xây dựng logic tiếp tục tải (resume logic) vào script tải lên của bạn để xử lý các kết nối chập chờn.
- Sử dụng tải xuống âm thầm nhưng hãy hiển thị thanh tiến trình rõ ràng.
- Luôn xác minh các bản cập nhật bằng mã băm SHA-512.
Việc xây dựng pipeline này từ sớm đã giúp tôi tiết kiệm được nhiều ngày làm việc thủ công.
