2014-09-03 70 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

我看到這個模塊有很大的潛力,並希望它可以進一步發展。

但是,如果您有其他解決方案也可以使用,請分享它。我相信其他可能會閱讀此內容的人會發現它很有用,因爲它是連續部署的一個很好的功能。