Pull to refresh

Тихое обновление без отрыва от работы

Reading time2 min
Views965
Я разрабатываю и поддерживаю один внутрикорпоративный инструмент. Если вкратце – довольно сложная автоматизированная система мониторинга, клиент работает под Windows. Собственно, проблема была в том, как обновлять программу. Основные препятствия:
Программа запущена на нескольких компьютерах, причём запущена постоянно.
Неплановый запуск программы – вещь очень нежелательная. Перезапуск занимает пару минут, но за это время может проскочить важное событие, которое не будет отслежено.
Программа запускается с общего сетевого ресурса через ссылку (так удобнее для всех), соответственно, пока на всех рабочих местах работа программы не будет завершена, заменить бинарный файл нельзя – он используется.

До какого-то времени обновление происходило так: я просил всех закрыть программу, и заменял старый бинарник на обновлённый. Часто приходилось ждать – вечно кто-то был занят, или не мог закрыть мониторинг, или ещё что-нибудь в этом духе.

Как я решил проблему обновления без отрыва от производства?

Как это обычно и бывает, сначала в голову лезли сложные и неэффективные способы решения проблемы. Например, принудительное самокопирование программы на винт запустившего, и запуск уже оттуда. Или запуск не самой программы, а её копии в оперативной памяти. В общем, поначалу я отталкивался от того, что запускаемый бинарник после запуска не должен был быть занят программой, и мог быть заменён.

Но конечное решение получилось очень простое и куда как более эффективное.
Я заменил основной exe-файл программы на программу, ищущую и запускающую самую новую версию мониторинга. Запущенная «обновлялка» ищет в своём каталоге все exe-файлы с именами, подходящими под заданную маску, проверяет версию файла и запускает тот файл, версия которого старше. Я решил отталкиваться от версии файла, а, скажем, не от имени или даты обновления — это надёжнее.

Для пользователей всё осталось по прежнему, не пришлось даже править ссылки. После того, как обновление выложено в сеть, оно будет запущено при первом же перезапуске мониторинга, который совершается тогда, когда возможен, а не тогда, когда это требуется. Старые версии бинарников удаляются вручную после того, как обновление будет протестировано в ходе работы. В случае чего – откат к старой версии тоже максимально упрощается, достаточно удалить обновление (правда уже по старинке).

Уже полгода способ работает как часы. Конечно, ничего нового и оригинального я не придумал — но, возможно, эта заметка поможет кому-то решить похожую проблему.
Tags:
Hubs:
Total votes 60: ↑52 and ↓8+44
Comments56

Articles