Есть много способов сделать это.
Вот самый простой способ, который я могу придумать для вас.
CI / CD
не используйте git в качестве инфраструктуры доставки кода.
запустить частное хранилище пипов и каждый раз создавать версионные пип пакеты
Вы хотите выпустить новый код - вы также получите контроль над тем, какие функции выпускаются ..
Используйте Jenkins для автоматизации процесса
Когда вы устанавливаете новый код, все, что вам нужно сделать, это установить pip -U my_app = 1.2.3
на сервере, а затем просто перезапустите приложение.
Чтобы не прерывать процесс, также есть несколько опций ..
вот один:
запустить ваш код как службу (systemd, systemv, upstart).
после того, как вы установите свой код (с надеждой на pip), вы можете использовать следующую команду service my_app restart
в вашем приложении добавьте код для прослушивания SIGTERM
например:
import signal
def handler_stop_signals(*args, **kwargs):
""" Handle system signals
only SIGTERM expected to trigger this"""
logger.info('Shutting down gracefully ')
# wait for all tasks to finish before exiting
signal.signal(signal.SIGTERM, handler_stop_signals)
Каждый раз, когда вы перезапускаете свое приложение, этот обработчик будет вызываться и выполнять логику, которую вы напишите, чтобы корректно завершить работу.
tldr
Используйте Jenkins для выпуска пакетов pip вашего кода.
Используйте Jenkins для развертывания ваших пип-пакетов на целевом сервере.
Настройте свой код для прослушивания системных сигналов и действуйте соответственно
пс:
Более продвинутым решением (решение только для Linux) является упаковка вашего кода в пакеты Debian и их доставка.
Вы можете использовать такие инструменты, как debpackager , чтобы достичь этого