监视远程更改并自动在本地复制它们

时间:2017-03-06 17:05:45

标签: javascript node.js fs forever

我的客户端计算机上有一个本地的Node.js项目,我希望能够监控远程位置以更改两个文件(server.js& amp; ; logging.js),自动停止节点服务器,在本地复制远程更改的文件,并使用新复制的本地文件重新启动服务器。

  

这将在我们的生产环境中用于部署sprint测试结束的更改,以便我们不必定期为我们的服务部门运行安装。

我尝试过使用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 SO answer接近我正在寻找的东西,但他正在监控日志文件,而不是服务器本身。

This is another SO question这与我想要解决的问题非常相似。

2 个答案:

答案 0 :(得分:0)

你真的需要两件事:

  1. 将文件与某个远程位置同步
  2. 更改服务器时重新启动服务器
  3. 你可以采用几种方法。

    例如,您可以在服务器上托管git repo并从某个远程位置推送到它以更新代码并触发将重新部署并重新启动服务器的git挂钩。

    或者您可以定期在服务器上运行一个脚本来检查远程仓库,更新本地仓库并重新启动服务器。

    或者,您可以使用与更改的仓库挂钩的CI服务,在测试通过时运行测试并进行部署。

    请注意,在大多数情况下,我所说的是代码回购,而不仅仅是两个带有硬编码名称的文件,因为能够重构代码,添加文件等等,还有更多的未来证明。但是你也可以yse rsync,scp或sftp来复制文件。有很多方法可以做到这一点,但是添加一些结构并使用一些可以扩展且易于维护的测试工具很有用。

    无论您做什么,只需记住一件事:确保在运行之前可以验证您正在下载的内容。所以永远不要通过HTTP下载任何东西,除非你有所有加密签名的东西。并确保siggning过程也是安全的。 Git非常好,因为你可以验证你正在下载的内容。

答案 1 :(得分:0)

我们最终放弃使用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脚本,因此我们的小型串行小部件始终在后台运行:

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实例,一个运行nodemon,它正在监视第二个serverMon.js,同时监视远程文件的更改,然后第三个server.js启动为serverMon.js的子进程。

引用:
Copying node files with streams and pipes

Spawning a node child server