使用NodeJS自我更新项目

Ing*_*nix 8 git auto-update node.js

我有一个主要在NodeJS上运行的项目.在启动期间,它会创建一个socket.io + http服务器和一些工作者(主要是在特定事件上完成工作的事件监听器).

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

所以我想知道:

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

目前该项目作为开发服务器运行,一旦处于生产状态,我可能会关闭自动更新功能.但是,由于我在笔记本电脑上开发但在远程服务器上进行测试,因此自动更新程序会很方便.

Ing*_*nix 2

经过一番研究,我确实找到了一个解决方案,实际上似乎也有效。几乎没有记录,而且有点错误 - 但它应该可以用于自我更新 NodeJS 应用程序的基本目的: http: //registry.npmjs.org/gitlabhook

这是我的编码方式(直接取自我的代码):

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!");
}
Run Code Online (Sandbox Code Playgroud)

解释:

  • config 是一个全局对象,存储特定于应用程序的内容。config.base 等于主脚本的路径。
  • BIRD3 是应用程序的名称。
  • BIRD3 对象是一个在整个应用程序中共享的 EventEmitter。
  • updater.js向 Redis 服务器发送一条消息 - 该消息由应用程序的另一半转换为正确的事件。
  • 我正在生成 .json 文件,只是因为我即将移动服务器。为了保持动态,我决定采用这种方法。
  • Gitlabhooks 需要单独提供的配置文件名和目录。在调用期间提供任务对象将导致不查找配置文件。回调接收具有以下布局的对象:https://gist.github.com/IngwiePhoenix/d08629af01ce93e39e4b

我看到了这个模块的巨大潜力,并希望它能够进一步发展。

但是,如果您有其他可行的解决方案,请分享。我相信其他可能阅读本文的人会发现它很有用,因为它是持续部署的一个巧妙功能。