所以你说的是你需要使用
版本控制来更新你的部署,如果更新破坏了它可以恢复。它还必须能够使用安全源进行更新并且必须与 Heroku & co 兼容?
呼,这要求很高。
听起来你想要像Docker这样的东西。 https://www.docker.com/
与 Heroku 一起使用:
https ://devcenter.heroku.com/articles/container-registry-and-runtime
那么什么是 Docker? 好吧,简而言之,它就像 github,但用于部署。它不是对源代码的版本控制,而是对整个环境的版本控制。所以你可以让你的脚本在 Windows 上的 Ubuntu 环境中运行。它可以使用特定版本的 node.js。然后使用已经安装的一组特定的 NPM 依赖项。在构建所有这些层之后,它可以在该环境中使用您的应用程序的特定版本。您可以完全控制部署映像中包含的所有内容,并且它可以在 docker 运行的所有操作系统上运行(包括 heroku)。(请注意,您不能使用 Windows 环境,除非在另一台装有 Docker 的 Windows 机器上)
因此,使用 Docker,您无需让脚本运行 npm 更新,而是在开发版本上运行 npm install 并在测试后推送到您的 Docker 映像。然后,您的部署服务器可以在您的 Docker 映像上运行拉取以更新应用程序、所有依赖项,甚至操作系统更新,以确保它按预期运行。如果更新中断了安装,那么您可以恢复使用早期的 Docker 映像,就像您可以从 github 删除提交一样,您可以删除对映像的拉取然后运行它,就好像更新从未发生过一样。如果需要,您甚至可以通过创建新的映像构建来生成具有不同环境和版本的多个 Docker 实例。
好的,这样就可以处理您的部署版本控制。呸!
但是自动检查更新和检测损坏的安装等呢?
您仍然需要构建一个更新程序脚本来获得您想要的那种行为您 不能指望更新程序工具知道如何调试您的安装并确定它是否“损坏”。也许您的脚本旨在引发错误。第三方更新程序脚本如何充分理解您的应用程序,从而确定是否需要回滚?
因此,您的更新程序脚本应该管理 Docker 镜像的拉取和恢复。它可以在启动应用程序之前运行拉后测试。如果您希望它能够自我修复,您还应该确保您的应用程序能够处理错误。也就是说,由您的应用程序决定是否需要执行回滚。Docker 使您的主应用程序可以(通过它的版本控制系统)与您的更新程序通信需要回滚。然后,您的更新程序脚本会在您的主应用程序退出后执行回滚到最后一个已知良好的 Docker 映像(并且可能在下一个版本发布之前不会再次执行拉取)。
仅举几个示例用例:
您创建一个包含您的程序的 Docker 映像。你让它在 Ubuntu 16.04 环境中运行。它包含所有需要的 NPM 安装和 Node 8。您上传到 Docker 存储库服务器。然后,您将映像部署到另一台机器并在那里运行它。您的应用程序现在正在用完另一台机器上的 Docker 容器。
稍后,您在 dev 构建上更新 NPM 包并将新映像发布到您的 Docker 存储库在线。您的生产服务器检测到新构建,关闭应用程序,执行拉取以更新其本地 Docker 映像,并使用其本地 Docker 映像再次启动应用程序实例。由于所需 NPM 模块的某些新版本破坏了所有内容,您的应用程序开始崩溃。它处理错误并在返回 20 个错误后,向更新程序脚本发出信号以执行回滚并退出。由于您的应用程序关闭,Docker 容器将关闭。更新程序脚本现在从本地映像中删除最后一个 Docker 拉取,并使用恢复的映像再次重新生成应用程序映像的实例。对图像中的数据文件造成的任何类型的损坏都消失了。也许更新程序还将错误的版本号写入 JSON 文件,因此它可以跟踪不执行拉取的版本。您的应用程序现在运行得像蛤蜊一样快乐。
但不满足于有一个损坏的版本并希望更新您的其他包,您可以解决错误并恢复导致开发构建问题的 NPM 包。您将更改推送到在线 Docker 存储库并增加版本号。您的应用程序检测到新的 docker 构建,检查以确保它不是“禁止构建”,然后向更新程序发出信号以运行拉取,优雅地退出。Docker 实例结束,更新程序执行新的拉取。这一次,一切都很好,工作正常,所以不需要回滚。
但是现在让我们稍后再说,您真的在为您的应用程序着力,并且为它添加了各种很棒的功能。它现在的能力提高了 5000%,但速度也降低了 5000%。如果您之前发布了一个简单但快速的应用程序“版本 1”,并且它完成了您在另一台服务器上进行某些部署所需的操作,那么从你的 Docker 存储库。如果您需要更高版本,请生成它。或者可能会在各地的 20 台不同的机器上产生各种各样的版本。无需预先设置,无需安装节点或 NPM 包等依赖项。无需从源代码构建东西或检查以确保所需的特定工具与此版本的 MacOSX 或 windows 或某种 linux 兼容。无需查看某个新版本的模块是否会破坏您的应用程序的早期版本。该应用程序将始终在 Ubuntu 16.04 环境中运行,其中包含当时适用的所有必需软件。如果有人真的想更新环境的某些方面,他们可以创建一个分叉。