我想创建一个Node.js应用程序,定期检查更新并安装它们。
基本组件对我来说很清楚:
然后,关于何时检查更新和安装更新可能有不同的策略:
应用程序甚至可以很难关闭并自动重启。
但仍有一些问题:
data
个文件夹?npm install
&合。对于新下载的软件包?一般情况下:您将如何尝试实现这样的系统?
答案 0 :(得分:2)
首先,您可以使用NPM本身进行打包和应用交付。其次,您可以添加脚本文件以在package.json文件中添加cron作业(例如“postinstall”或“update”)以进行定期更新过程。在此脚本中,您可以检查所需的所有内容,例如更新损坏。在Heroku中,您可以使用Scheduler Worker进行更新处理。
答案 1 :(得分:0)
如果您使用的是PM2,这是当今非常流行的方法扩展,并使用node.js运行应用程序。 然后,您可能需要研究他们提供的工具。 如: https://github.com/keymetrics/pm2-auto-pull
答案 2 :(得分:0)
不需要Web服务器。 Git是用于托管公共和私有代码的完美解决方案,并包括版本控制。对于私人存储库,您可以使用个人访问令牌。
我创建了一个模块,用于从git存储库中自动更新node.js应用程序。它将本地package.json与您的仓库中的本地package.json进行比较,然后自动克隆仓库并安装依赖项。您可以将应用程序配置为在应用程序开始,结束或安排例行检查时检查更新。
自动Git更新-https://github.com/chegele/AutoGitUpdate
import AutoGitUpdate from 'auto-git-update';
const config = {
repository: 'https://github.com/chegele/BackupPurger'
tempLocation: 'C:/Users/scheg/Desktop/tmp/',
ignoreFiles: ['util/config.js'],
executeOnComplete: 'C:\\Users\\scheg\\Desktop\\worksapce\\AutoGitUpdate\\startTest.bat',
exitOnComplete: true
}
const updater = new AutoGitUpdate(config);
updater.autoUpdate();
答案 3 :(得分:-1)
所以你要说的是你需要更新你的部署 版本控制,如果更新破坏,可以恢复。它还必须能够使用安全源来更新它必须是 兼容Heroku&合
Phew,他们要求很多。
听起来你想要像 Docker 这样的东西。 https://www.docker.com/
与Heroku一起使用 https://devcenter.heroku.com/articles/container-registry-and-runtime
那么什么是Docker?嗯,简单地说它就像github,但是用于部署。它不是对源代码进行版本控制,而是对整个环境进行版本控制。因此,您可以在Windows上的Ubuntu环境中运行脚本。它可以使用node.js的特定版本。然后使用已安装的一组特定的NPM依赖项。构建完所有这些图层后,它可以在该环境中使用特定版本的应用程序。您可以完全控制部署映像中包含的所有内容,并且它可以在docker运行的所有操作系统上运行(包括heroku)。 (请注意,除了在其他带有Docker的Windows计算机上,您不能使用Windows环境)
所以,使用Docker,而不是让你的脚本运行npm更新,你在开发版本上运行npm install并在测试后推送到你的Docker镜像。然后,您的部署服务器可以在您的Docker映像上运行以更新应用程序,所有依赖项,甚至操作系统更新,以确保它按预期运行。如果更新破坏了安装,那么你可以恢复使用早期的Docker镜像轻松,就像你可以从github中删除提交一样,你可以删除对图像的拉动,然后运行它就像更新从未发生过一样。如果需要,您甚至可以通过创建新的图像构建来生成具有不同环境和版本的多个Docker实例。
好的,这样可以处理您的部署版本控制。呼!
但是如何自动检查更新并检测损坏的安装等?
您仍然需要构建更新程序脚本以获得所需的行为您不能期望更新程序工具知道如何调试安装并确定它是否是&# 34;碎"或不。也许你的脚本被设计为抛出错误。第三方更新程序脚本如何能够很好地理解您的应用程序以确定是否需要回滚?
因此,您的更新程序脚本应该管理Docker镜像拉取和还原。它可以在启动应用程序之前运行拉后测试。如果您希望应用程序能够自我修复,您还应该确保应用程序处理错误。也就是说,由您的应用程序决定是否需要执行回滚。 Docker使您的主应用程序(使用它的版本控制系统)可以与您的更新程序进行通信,以便进行回滚。然后,您的更新程序脚本会在主应用程序退出后执行回滚到最后一个已知良好的Docker镜像(并且可能不再执行拉动,直到下一个版本发布)。
举几个例子:
使用您的程序创建Docker镜像。你拥有了它 在Ubuntu 16.04环境中运行。它包含所有需要的NPM 安装和节点8.您上传到Docker存储库服务器。您 然后将映像部署到另一台计算机并在那里运行。您的 应用程序现在在另一个上运行Docker容器 机。
稍后,您将在dev版本上更新NPM包并发布a 您的Docker存储库在线新图像。您的生产服务器 检测到新构建,关闭应用程序,执行拉动 更新它的本地Docker镜像,并启动它的实例 再次使用它的本地Docker镜像。你的申请 由于某些新版本的必需NPM模块而开始崩溃 打破一切。它处理错误,并在20个错误之后 返回,它向updater脚本发出信号以执行回滚和 退出。由于应用程序关闭,Docker容器将关闭。该 更新程序脚本现在从本地映像中删除最后一个Docker pull 使用恢复的图像再次重新生成应用程序图像的实例。任何形式的 对图像中的数据文件造成的损坏消失了。也许更新者也写道 错误的版本号到JSON文件,因此它可以跟踪什么 版本不执行拉动。您的应用程序现在正在运行 快乐如蛤蜊。
但不满足于那里有一个破碎的版本并且想要你的 更新了其他软件包,您可以解决错误并恢复NPM 导致dev构建问题的包。你推了 更改您的在线Docker存储库并增加版本 数。您的应用程序检测到新的docker构建,检查以确保它不是"禁止构建"然后发信号通知更新器运行拉,优雅地退出。该 Docker实例结束,更新程序执行新的拉取。这次 周围,一切都很好,工作正常,所以不需要回滚。
但是现在让我们稍后再说,你真的在抨击你 应用程序,您已经为它添加了各种强大的功能。 现在它的能力提高了5000%,但也慢了5000%。如果你有 之前发布了"版本1"应用程序很简单, 但速度很快,它可以满足您在另一台服务器上进行部署所需的操作,然后它非常容易 从Docker中生成该确切版本的实例 库。如果您需要更高版本,请生成它。或者可能会在20个不同的机器上产生彩虹版本。无需预先设置,无需安装依赖项,如节点或NPM包。无需从源代码构建内容或检查以确保所需的特定工具与此版本的MacOSX或Windows或某些版本的Linux兼容。无需查看某个新版本的模块是否会破坏应用程序的早期版本。该应用程序将始终在Ubuntu 16.04环境中运行,其中包含当时所有必需的软件。如果有人真的想要更新环境的某些方面,他们可以创建一个分支。