2014-09-03 3 views
6

У меня есть проект, который работает в основном на NodeJS. Во время запуска он создает сервер socket.io + http и несколько рабочих (в основном, прослушиватели событий, которые выполняют свою работу по определенным событиям).Использование NodeJS для самообновления проекта

Теперь я хотел бы реализовать рабочий процесс, который автоматически проверяет наличие новой фиксации в репозитории git, который размещается через GitLab на том же сервере.

Так что я хотел бы знать:

  • Есть ли модуль НПМ, который может выглядеть, если локальным и удаленным мерзавца матча хранилища в коммиты?
  • Или было бы более полезно использовать Redis Pub/Sub и git hook, чтобы уведомлять приложение об обновлении таким образом?
  • Или есть один совершенно другой подход, который вы бы порекомендовали?

В настоящее время этот проект работает как сервер разработки, и я могу отключить функцию автоматического обновления, когда она находится в рабочем состоянии. Но так как я развиваюсь на своем ноутбуке, но тестирую на своем удаленном сервере, автообновление было бы удобно.

+0

Я думаю, что веб-крючки gitlab были бы очень полезны для этого. Например, модуль gitlabhook, который может прослушивать крючки, но у меня были некоторые проблемы с его реализацией. Я сам сделал очень хладнокровную вещь, но был бы действительно заинтересован в более правильном решении. –

+0

Это похоже на интересную вещь, но действительно ли она похожа на гвоздь? Я имею в виду, вы используете приложение для самообновления?Есть много проверенных и проверенных инструментов непрерывного развертывания там, что нет необходимости увеличивать сложность вашего приложения Node. – Zlatko

+0

@Zlatko: Я видел некоторые инструменты, но никогда не понимал, как они работают в целом. Если я увидел один, он говорил о том, что автоматически выпускает новые версии и т. Д., Это меня смутило. Поэтому я искал шляпу solutiont, которая больше похожа на то, что мне нужно - код, который может обновить себя и снова перезапустить. Хотя, если у вас есть хорошее программное обеспечение, чтобы рекомендовать, я смотрю на него точно. –

ответ

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 - это глобальный объект, хранящий приложения. config.base равен пути основного скрипта.
  • BIRD3 - это имя приложения.
  • Объект BIRD3 является EventEmitter, общим для всего приложения.
  • updater.js отправляет сообщение серверу redis, который другой частью приложения превращается в соответствующее событие.
  • Я генерирую файл .json, просто потому, что я собираюсь переместить серверы. Чтобы сохранить динамику, я решил работать с этим вопросом.
  • Для Gitlabhooks требуется имя файла конфигурации и каталог, поставляемый отдельно. Поставка объекта задач во время вызова приведет к тому, что файл конфигурации не будет искать. Обратный вызов получает объект со следующим расположением: https://gist.github.com/IngwiePhoenix/d08629af01ce93e39e4b

Я вижу большой потенциал в этом модуле и надеюсь, что он сможет развиваться дальше.

Однако, если у вас есть другое решение, которое тоже работает, поделитесь им. Я уверен, что другие люди, которые могут это прочитать, посчитают это полезным, так как это удобная функция для непрерывного развертывания.

Смежные вопросы