我编写了一个Python应用程序,该程序作为守护程序在Linux服务器上运行。它的作用是侦听Rabbitmq主题。每当有新消息时,应用程序都会按照以下5个步骤处理消息。
主程序以多线程运行:
for i in range(2):
t = threading.Thread(target=process_msg, name='worker-%s' % i)
t.setDaemon(True)
t.start()
while True:
time.sleep(5)
回调函数process_msg
是执行5个步骤的方法。
当前,这就是我将更改部署到开发服务器的方式。
git pull
以获得更新对于开发人员来说,此手动过程是可以的,但对生产而言却没有好处。因为如果我在处理消息的过程中停止了该应用程序,则该应用程序将退出而不完成作业。在不中断过程的情况下,CICD此应用程序的最佳方法是什么?
答案 0 :(得分:1)
有很多方法可以做到这一点。 这是我为您想到的最简单的方法。
CI / CD
不要将git用作代码交付基础结构。 运行私有的pip存储库并每次创建版本化的pip包 您要发布新代码-还可以控制要发布的功能。
使用Jenkins自动化流程
当您要部署新代码时,您所要做的就是pip install -U my_app = 1.2.3 在服务器上,然后重新启动应用程序。
为了不中断进程,请选择几个选项。
这里是一个:
将代码作为服务运行(systemd,systemv,新贵)。
安装代码(希望使用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将pip包部署到目标服务器。
调整代码以侦听系统信号并采取相应措施
ps:
更高级的解决方案可能是(仅linux解决方案)是将您的代码打包到debian软件包中,然后进行交付。
您可以使用debpackager之类的工具来实现该目标