如何在多个服务器上为Web应用程序实现自动更新功能?

5
我需要一个关于以下问题实现的想法: 1. 想要构建一个Python应用程序,当新的补丁可用时将自动更新 2. 它将运行单元测试来检查补丁是否成功部署 3. 如果在安装期间出现任何故障,它将自动回滚
我不知道的内容: A. 不确定如何从源代码构建补丁 B. 检查新更新的算法/标准过程 C. 自动部署/回滚过程
有什么建议/链接吗?

你的问题对于StackOverflow来说太过宽泛了。 - lanzz
我们写了一篇关于如何在PythonAnywhere上使用Git post-receive钩子进行基于git-push的代码部署的文章,其中包括一个示例,您可以运行单元测试,并在测试失败时拒绝提交。也许它会对您有所帮助?http://blog.pythonanywhere.com/87/ - hwjp
1个回答

4
我实现了一个服务器,可以识别已更改的源代码并拉取新代码。它托管在pythonanywhere.com上的此URL,代码在github上。本答案基于我实现更新功能时的经验。
当您使用git版本控制您的代码时,通常会:
  • 有一个工作正常的主分支或部署分支
  • 有一个开发分支,在所有测试通过后合并到主分支->部署分支。
这样,您只需要知道何时更改了部署分支,以便确定何时重启。在没有停机时间的情况下应先运行测试。如果在部署系统上运行测试,则可能需要太长时间才能完成或者无效的代码会破坏该系统。因此,部署分支之所以有效是因为事先进行了测试。
对于自动化测试,您可以使用像travis这样的连续集成服务器来下载代码并对其进行测试。可以询问特定提交的测试运行情况。
当您将代码托管在github上时,可以指定一个推送http地址。我使用了http://server/update。每当存储库更改时,github会通知您的服务器。
然后,您可以通过从git拉取源代码更新它,如果部署分支真的发生了变化,那么您可以重新启动应用程序。我不能在服务器上做到这一点,但您可能可以。 场景:
  1. I push code to github
  2. github sends a POST to http://server/update
  3. @post('/update') # bottle code
    def pull_own_source_code_and_restart():
        with inDirectory(server_repository):
            previous_commit = last_commit()
            text = git.pull()
            current_commit = last_commit()
        if previous_commit != current_commit:
            restart()
        return "Git says: {}".format(text)
    

    have a look at these two files:

版本控制系统通常为每个版本进行“打补丁”。我使用Git。如果您现在不了解Git,请学习一下!这是有关Python Django和Git的研讨会材料:http://www.opentechschool.org/material.html

如果您认为这些信息足以在Django中实现此功能,请在完成后在此处发布您的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接