如何在生产中更新Python应用程序

时间:2018-07-01 23:11:33

标签: python continuous-integration

我编写了一个Python应用程序,该程序作为守护程序在Linux服务器上运行。它的作用是侦听Rabbitmq主题。每当有新消息时,应用程序都会按照以下5个步骤处理消息。

  1. 查询数据库并获取String格式的音频数据。
  2. 将音频数据转换为WAV。
  3. 调用深度学习模型对音频进行预测
  4. 将WAV上载到S3存储桶
  5. 将结果发送回Web API。

主程序以多线程运行:

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个步骤的方法。

当前,这就是我将更改部署到开发服务器的方式。

  1. 杀死应用程序的活动进程
  2. 执行git pull以获得更新
  3. 再次启动应用。

对于开发人员来说,此手动过程是可以的,但对生产而言却没有好处。因为如果我在处理消息的过程中停止了该应用程序,则该应用程序将退出而不完成作业。在不中断过程的情况下,CICD此应用程序的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。 这是我为您想到的最简单的方法。

CI / CD

  1. 不要将git用作代码交付基础结构。 运行私有的pip存储库并每次创建版本化的pip包 您要发布新代码-还可以控制要发布的功能。

  2. 使用Jenkins自动化流程

  3. 当您要部署新代码时,您所要做的就是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之类的工具来实现该目标