监控远程更改并自动将其复制到本地
Monitor remote changes and automatically copy them locally
我有一个 Node.js 项目,它位于我们客户端机器的本地,我希望能够监控远程位置对两个文件的更改(server.js & logging.js), 自动停止节点服务器,将远程更改的文件复制到本地并使用新复制的本地文件重新启动服务器。
This would be used in our production environment to deploy end-of-sprint tested changes so that we don't have to regularly go run installs for our Service department.
我试过使用 Forever 和 Nodemon,它们都乐于监视远程文件的更改,但只重启本地(未更改的)副本,因此这些更改不会传播到本地副本.
我计划在生产环境中使用 Forever 来帮助解决我们偶尔遇到的本地服务器崩溃问题,因此理想情况下,任何解决方案都可以通过 Forever 的 -c
开关 运行。我还调查了使用他们的底层代码 chokidar,但没有看到在更改时复制文件的能力。
我们的部署环境全部基于 Windows,因此我使用的是 Forever-Win,但是,我们正在努力使我们正在 运行 的应用程序与平台无关.
可能类似于:
forever start --watch \server\share\server.js --watch \server\share\logging.js -c [remote monitoring copy locally package name] server.js
我希望找到一个已经存在的 NPM 包,这样我就不必自己动手了。
接近我要找的东西,但他正在监视日志文件,而不是服务器本身。
This is another SO question这与我要解决的问题非常相似。
你真的需要两件事:
- 将您的文件与某个远程位置同步
- 更改后重新启动服务器
有几种方法可以做到。
例如,您可以在您的服务器上托管一个 git 存储库并从某个远程位置推送到它以更新代码并触发 git 挂钩,这些挂钩将重新部署并重新启动服务器。
或者您可以在您的服务器上定期 运行 一个脚本来检查远程存储库、更新本地存储库并重新启动服务器。
或者您可以使用 CI 挂钩到您不断变化的存储库的服务,运行 测试并在测试通过后进行部署。
请注意,在大多数情况下,我谈论的是代码回购,而不仅仅是两个具有硬编码名称的文件,因为它是未来能够重构代码、添加文件等的更多证据。但是你可以还可以使用 rsync、scp 或 sftp 来复制文件。有很多方法可以做到这一点,但是向其中添加一些结构并使用一些经过测试的工具是很有用的,这些工具可以扩展并且在长期 运行.
中易于维护。
无论您做什么,请牢记一件事:确保您可以在 运行 下载之前验证您正在下载的内容。因此,除非您对所有内容都进行了加密签名,否则永远不要通过 HTTP 下载任何内容。并确保签名过程也是安全的。 Git 对此非常有用,因为您可以验证正在下载的内容。
我们最终放弃了使用 Forever,我无法让它与 Nodemon 一起正常工作并同时监视远程目录。我们认为能够根据命令推送代码更改比在服务器崩溃时重新启动服务器更重要(这种情况根本不会经常发生)。当我们进行代码推送时,服务器无论如何都会重新启动。
我创建了一个名为 serverMon.js 的服务器监控文件,其中包含(请参阅下面的引用以获取我修改为自己使用的代码的链接):
const fs = require('fs');
const child_process = require('child_process');
//production path
var widgetPath = '\\server\share\sbSerialWidget\';
var widgetFiles = ['sbNodeLog.js', 'server.js'];
var passedInFileName, infile, outfile;
for(var i = 0; i < widgetFiles.length; i++){
fs.createReadStream(widgetPath + widgetFiles[i]).pipe(fs.createWriteStream(widgetFiles[i]));
}
//spawn server.js passing it's stdio, stderr, stdout back through this node instance
server = child_process.spawn('node', ['server.js'], {stdio: 'inherit'}, function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: ' + error.code);
console.log('Server.js error received: ' + error.signal);
}
console.log('Server.js STDOUT: ' + stdout);
console.log('Server.js STDERR: ' + stderr);
});
server.on('exit', function (code) {
server.kill('SIGTERM');
console.log('Child process exited with exit code '+code);
});
这是由 .VBS 文件中包含的 nodemon 脚本监视的:
CreateObject("Wscript.Shell").Run "nodemon serverMon.js --exitcrash --watch \server\share\sbSerialWidget", 0, True
这又是由放置在 %ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup
中的 CMD 脚本 运行,因此它会在启动时启动 .VBS 脚本,所以我们的小串行小部件总是 运行ning背景:
REM @echo off
REM cls
GOTO START
:START
IF EXIST "%ProgramFiles%\sbserialwidget\server.js" GOTO WIN32
IF EXIST "%ProgramFiles(x86)%\sbSerialWidget\server.js" GOTO WIN64
ECHO End start
GOTO END
:WIN32
cls
echo Inside 32 bit
PUSHD "%ProgramFiles%"\sbserialwidget
GOTO RUNVBS
GOTO END
:WIN64
echo Inside 64 bit
PUSHD "%ProgramFiles(x86)%"\sbSerialWidget
GOTO RUNVBS
GOTO END
:RUNVBS
echo Inside RUNVBS
start runNodemon.vbs
GOTO END
:END
popd
EXIT
我们最终在 Taskmanager 中得到三个 node.exe 运行ning 实例,一个 运行ning nodemon,它正在监视第二个 serverMon.js,同时监视更改远程文件,然后第三个 server.js 作为 serverMon.js.
的子进程启动
我有一个 Node.js 项目,它位于我们客户端机器的本地,我希望能够监控远程位置对两个文件的更改(server.js & logging.js), 自动停止节点服务器,将远程更改的文件复制到本地并使用新复制的本地文件重新启动服务器。
This would be used in our production environment to deploy end-of-sprint tested changes so that we don't have to regularly go run installs for our Service department.
我试过使用 Forever 和 Nodemon,它们都乐于监视远程文件的更改,但只重启本地(未更改的)副本,因此这些更改不会传播到本地副本.
我计划在生产环境中使用 Forever 来帮助解决我们偶尔遇到的本地服务器崩溃问题,因此理想情况下,任何解决方案都可以通过 Forever 的 -c
开关 运行。我还调查了使用他们的底层代码 chokidar,但没有看到在更改时复制文件的能力。
我们的部署环境全部基于 Windows,因此我使用的是 Forever-Win,但是,我们正在努力使我们正在 运行 的应用程序与平台无关.
可能类似于:
forever start --watch \server\share\server.js --watch \server\share\logging.js -c [remote monitoring copy locally package name] server.js
我希望找到一个已经存在的 NPM 包,这样我就不必自己动手了。
This is another SO question这与我要解决的问题非常相似。
你真的需要两件事:
- 将您的文件与某个远程位置同步
- 更改后重新启动服务器
有几种方法可以做到。
例如,您可以在您的服务器上托管一个 git 存储库并从某个远程位置推送到它以更新代码并触发 git 挂钩,这些挂钩将重新部署并重新启动服务器。
或者您可以在您的服务器上定期 运行 一个脚本来检查远程存储库、更新本地存储库并重新启动服务器。
或者您可以使用 CI 挂钩到您不断变化的存储库的服务,运行 测试并在测试通过后进行部署。
请注意,在大多数情况下,我谈论的是代码回购,而不仅仅是两个具有硬编码名称的文件,因为它是未来能够重构代码、添加文件等的更多证据。但是你可以还可以使用 rsync、scp 或 sftp 来复制文件。有很多方法可以做到这一点,但是向其中添加一些结构并使用一些经过测试的工具是很有用的,这些工具可以扩展并且在长期 运行.
中易于维护。无论您做什么,请牢记一件事:确保您可以在 运行 下载之前验证您正在下载的内容。因此,除非您对所有内容都进行了加密签名,否则永远不要通过 HTTP 下载任何内容。并确保签名过程也是安全的。 Git 对此非常有用,因为您可以验证正在下载的内容。
我们最终放弃了使用 Forever,我无法让它与 Nodemon 一起正常工作并同时监视远程目录。我们认为能够根据命令推送代码更改比在服务器崩溃时重新启动服务器更重要(这种情况根本不会经常发生)。当我们进行代码推送时,服务器无论如何都会重新启动。
我创建了一个名为 serverMon.js 的服务器监控文件,其中包含(请参阅下面的引用以获取我修改为自己使用的代码的链接):
const fs = require('fs');
const child_process = require('child_process');
//production path
var widgetPath = '\\server\share\sbSerialWidget\';
var widgetFiles = ['sbNodeLog.js', 'server.js'];
var passedInFileName, infile, outfile;
for(var i = 0; i < widgetFiles.length; i++){
fs.createReadStream(widgetPath + widgetFiles[i]).pipe(fs.createWriteStream(widgetFiles[i]));
}
//spawn server.js passing it's stdio, stderr, stdout back through this node instance
server = child_process.spawn('node', ['server.js'], {stdio: 'inherit'}, function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: ' + error.code);
console.log('Server.js error received: ' + error.signal);
}
console.log('Server.js STDOUT: ' + stdout);
console.log('Server.js STDERR: ' + stderr);
});
server.on('exit', function (code) {
server.kill('SIGTERM');
console.log('Child process exited with exit code '+code);
});
这是由 .VBS 文件中包含的 nodemon 脚本监视的:
CreateObject("Wscript.Shell").Run "nodemon serverMon.js --exitcrash --watch \server\share\sbSerialWidget", 0, True
这又是由放置在 %ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup
中的 CMD 脚本 运行,因此它会在启动时启动 .VBS 脚本,所以我们的小串行小部件总是 运行ning背景:
REM @echo off
REM cls
GOTO START
:START
IF EXIST "%ProgramFiles%\sbserialwidget\server.js" GOTO WIN32
IF EXIST "%ProgramFiles(x86)%\sbSerialWidget\server.js" GOTO WIN64
ECHO End start
GOTO END
:WIN32
cls
echo Inside 32 bit
PUSHD "%ProgramFiles%"\sbserialwidget
GOTO RUNVBS
GOTO END
:WIN64
echo Inside 64 bit
PUSHD "%ProgramFiles(x86)%"\sbSerialWidget
GOTO RUNVBS
GOTO END
:RUNVBS
echo Inside RUNVBS
start runNodemon.vbs
GOTO END
:END
popd
EXIT
我们最终在 Taskmanager 中得到三个 node.exe 运行ning 实例,一个 运行ning nodemon,它正在监视第二个 serverMon.js,同时监视更改远程文件,然后第三个 server.js 作为 serverMon.js.
的子进程启动