Node.js 使用NodeJS自更新项目

Node.js 使用NodeJS自更新项目,node.js,git,auto-update,Node.js,Git,Auto Update,我有一个主要在NodeJS上运行的项目。在启动过程中,它会创建一个socket.io+http服务器和几个worker(主要是对特定事件执行任务的事件侦听器) 现在,我想实现一个工作进程,自动检查通过GitLab托管在同一服务器上的git repo上是否有新提交 所以我想知道: 是否有一个npm模块可以在提交中查找本地和远程git存储库是否匹配 或者更明智的做法是使用Redis的Pub/Sub和git钩子以这种方式通知应用程序更新 或者你会推荐一种完全不同的方法吗 目前这个项目是作为开发服务

我有一个主要在NodeJS上运行的项目。在启动过程中,它会创建一个socket.io+http服务器和几个worker(主要是对特定事件执行任务的事件侦听器)

现在,我想实现一个工作进程,自动检查通过GitLab托管在同一服务器上的git repo上是否有新提交

所以我想知道:

  • 是否有一个npm模块可以在提交中查找本地和远程git存储库是否匹配
  • 或者更明智的做法是使用Redis的Pub/Sub和git钩子以这种方式通知应用程序更新
  • 或者你会推荐一种完全不同的方法吗

目前这个项目是作为开发服务器运行的,我可能会在它处于生产状态时关闭自动更新功能。但由于我在笔记本电脑上开发,但在远程服务器上测试,所以自动更新程序会很方便。

经过一些研究,我确实找到了一个解决方案,实际上似乎也很有效。几乎没有文档记录,而且有点问题-但它应该可以用于自更新NodeJS应用程序的基本目的:

下面是我如何编码的(直接取自我的代码):

解释:

  • config是一个全局对象,存储特定于应用程序的内容。config.base等于主脚本的路径
  • BIRD3是应用程序的名称
  • BIRD3对象是整个应用程序共享的EventEmitter
  • updater.js
    向redis服务器发送一条消息,该消息被应用程序的另一半转化为一个适当的事件
  • 我正在生成.json文件,只是因为我将要移动服务器。为了让事情保持动态,我决定用这个方法
  • Gitlabhooks需要单独提供配置文件名和目录。在调用期间提供tasks对象将导致无法查找配置文件。回调接收具有以下布局的对象:
我看到这个模块有很大的潜力,希望它能进一步发展


然而,如果你有另一个同样有效的解决方案,请分享它。我相信其他可能读过这篇文章的人会发现它很有用,因为它是一个用于连续部署的简洁功能。

我认为gitlab的web钩子非常适合于此。例如,gitlabhook模块可以监听钩子,但我自己在实现它时遇到了一些问题。我自己做了一件非常粗糙的事情,但我真的对一个更合适的解决方案很感兴趣。这似乎是一件有趣的事情,但它真的看起来像钉子吗?我是说,你有没有使用该应用程序进行自我更新?有许多经验证且经过良好测试的连续部署工具,不需要增加节点应用程序的复杂性。@Zlatko:我见过其中一些工具,但从未了解它们的工作原理。如果我看到一个,它谈到自动发布新版本等等…这让我困惑。所以我寻找了一个听起来更像我需要的解决方案——代码可以自我更新,也可以自我重启。不过,如果你有一个好的软件要重新编译,我肯定会研究它。
var fs=require("fs");
module.exports = function() {
    // Dynamically write this config.
    var obj = {
        tasks: {
            "*": [
                "cd '"+config.base+"'",
                "git pull",
                "git submodule update",
                "npm install",
                "node lib/updater.js '%m'"
            ],
        }
    }, str = JSON.stringify(obj), glConf = config.base+"/config/gitlabhook.json";

    log.info("BIRD3 Autp updater: Generating config to "+glConf);
    fs.writeFileSync(glConf, str);

    // Set it up
    var gitlabhook = require("gitlabhook"),
        gitlab = gitlabhook({
            host: config.host,
            configFile: "gitlabhook.json",
            configPathes: [ config.base+"/config" ],
            logger: log,
        });

    log.info("BIRD3 Auto updater: Starting");
    gitlab.listen();
    BIRD3.on("update", function(){
        setTimeout(function(){
            log.info("BIRD3 Auto updater: Exiting to allow update.");
            process.exit(2);
        }, 200);
    });
    log.info("BIRD3 Auto Updater -> Online!");
}