2017-03-06 59 views
0

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

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

我永远使用& Nodemon,两者愉快地监控更改远程文件(S),但只有重新启动本地(不变)尝试复制,所以这些变化没有得到传播到本地复制。

我打算在生产环境中使用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这与我想解决的问题非常相似。

回答

0

我们结束了使用上永远放弃,我不能让它与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); 
}); 

这是通过包含在一个nodemon脚本观看。 VBS文件:

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 

我们最终在任务管理器运行node.exe,一个运行nodemon的三个实例,这是监控第二,serverMon.js,同时观察上的远程文件的更改,然后第三个服务器。 js作为serverMon.js的子进程启动。

引文:
Copying node files with streams and pipes

Spawning a node child server

0

你真的需要在这里两件事情:

  1. 同步您的文件有一些位置偏远
  2. 重新启动服务器时,他们改变

有几个方法可以做到这一点。

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

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

或者您可以使用挂钩到您正在更改的回购库的CI服务,在测试通过时运行测试和部署。

请注意,在大多数这些方式中,我讨论的是代码回购,而不仅仅是具有硬编码名称的两个文件,因为它能够重构代码,添加文件等等的未来证明更多。但是,您也可以使用rsync,scp或sftp复制文件。有很多方法可以做到这一点,但为此添加一些结构并使用一些经过测试的工具可以进行扩展并且从长远来看很容易维护。

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