2014-09-03 75 views
6

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

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

所以我想知道:

  • 是否有NPM模块如果提交本地和远程的Git仓库的比赛可以看吗?
  • 还是建议使用Redis的Pub/Sub和git钩子来通知应用程序这种方式的更新?
  • 或者您会推荐一种完全不同的方法吗?

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

+0

我认为gitlab的web钩子将非常适合这个。例如,gitlabhook模块可以监听钩子,但是我自己实现这个功能时遇到了一些问题。我自己做了一件非常黑的东西,但会对更合适的解决方案感兴趣。 – 2014-09-03 22:51:40

+0

这似乎是一件有趣的事情,但它看起来像钉子吗?我的意思是,你有使用应用程序自我更新?有很多经过验证和测试的连续部署工具,不需要增加Node应用程序的复杂性。 – Zlatko 2014-09-05 13:10:12

+0

@Zlatko:我已经看到了一些工具,但从未理解它们是如何工作的。如果我看到一个,它谈到自动发布新版本等......它让我困惑。所以我寻求一个解决方案,听起来更像我所需要的 - 可以更新自身并重新启动的代码。但是,如果你有一个好的软件来推荐,那么我会仔细研究它。 – 2014-09-05 18:03:24

回答

1

经过一番研究,我确实找到了一个解决方案,实际上它似乎也起作用。几乎没有记载和有点马​​车 - 但它应该自我更新的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!"); 
} 

要解释:

  • 配置是一个全局对象,存储应用程序特定的东西。 config.base等于主脚本的路径。
  • BIRD3是应用程序的名称。
  • BIRD3对象是通过整个应用程序共享的EventEmitter。
  • updater.js向redis服务器发送一条消息 - 通过应用程序的另一半,它将转换为适当的事件。
  • 我正在生成.json文件,仅仅是因为我即将移动服务器。为了保持动态,我决定处理这个问题。
  • Gitlabhooks需要单独提供的配置文件名和目录。在调用过程中提供任务对象将导致不查找配置文件。回调接收到一个对象,其布局如下:https://gist.github.com/IngwiePhoenix/d08629af01ce93e39e4b

我看到这个模块有很大的潜力,并希望它可以进一步发展。

但是,如果您有其他解决方案也可以使用,请分享它。我相信其他可能会阅读此内容的人会发现它很有用,因为它是连续部署的一个很好的功能。