2014-09-03 16 views
6

Possiedo un progetto eseguito principalmente su NodeJS. Durante l'avvio, crea un server socket.io + http e alcuni lavoratori (principalmente listener di eventi che svolgono il proprio lavoro su eventi specifici).Utilizzo di NodeJS per l'aggiornamento automatico del progetto

Ora vorrei implementare un processo di lavoro che controlla automaticamente se un nuovo commit è disponibile su un repository git ospitato tramite GitLab sullo stesso server.

Quindi vorrei sapere:

  • C'è un modulo NPM che può guardare in alto se una partita repository git locale e remoto in commit?
  • Oppure sarebbe più consigliabile utilizzare Pub/Sub di Redis e un hook git per notificare all'applicazione un aggiornamento in questo modo?
  • O c'è un approccio completamente diverso che consiglieresti?

Attualmente questo progetto è in esecuzione come server di sviluppo e potrei disattivare la funzione di aggiornamento automatico una volta che è in stato produttivo. Ma dal momento che sviluppo sul mio portatile ma test sul mio server remoto, un auto-programma di aggiornamento sarebbe utile.

+0

Penso che i ganci Web di Gitlab sarebbero perfetti per questo. Ci sono ad esempio il modulo gitlabhook che può ascoltare i ganci, ma ho avuto alcuni problemi nell'implementarlo da solo. Ho fatto una cosa veramente hacky, ma sarei davvero interessato a una soluzione più adeguata. –

+0

Questa sembra una cosa interessante da fare, ma sembra davvero un chiodo? Voglio dire, hai usato l'app per l'aggiornamento automatico?Esistono molti strumenti di distribuzione continua collaudati e ben collaudati, che non richiedono l'aumento della complessità dell'app Node. – Zlatko

+0

@Zlatko: ho visto alcuni degli strumenti, ma non ho mai capito come funzionavano in generale. Se ne vedevo uno, parlava di rilasciare automaticamente nuove versioni ecc ... mi confondeva. Quindi ho cercato un cappello solutiont più simile a quello che mi serve - codice che può aggiornarsi e riavviare sé stesso. Però, se hai un buon software da consigliare, lo cercherò di sicuro. –

risposta

1

Dopo alcune ricerche, ho trovato una soluzione, che in realtà sembra funzionare anche. A malapena documentato e un po 'buggy - ma dovrebbe funzionare con lo scopo di base di un auto-aggiornamento NodeJS app: http://registry.npmjs.org/gitlabhook

Ecco come ho codificato esso (presi direttamente dal mio codice):

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!"); 
} 

Per spiegare:

  • config è un oggetto globale che memorizza le applicazioni specifiche. config.base è uguale al percorso dello script principale.
  • BIRD3 è il nome dell'app.
  • L'oggetto BIRD3 è un EventEmitter condiviso attraverso l'intera applicazione.
  • updater.js invia un messaggio a un server redis - che, da un'altra metà dell'app, viene trasformato in un evento appropriato.
  • Sto generando il file .json, semplicemente perché sto per spostare i server. Per mantenere le cose dinamiche, ho deciso di lavorare con questo approccio.
  • Gitlabhooks richiede il nome file di configurazione e la directory fornita separatamente. Fornendo l'oggetto tasks durante la chiamata, il file di configurazione non verrà cercato. Il callback riceve un oggetto con il seguente layout: https://gist.github.com/IngwiePhoenix/d08629af01ce93e39e4b

Vedo molto potenziale in questo modulo e spero che possa svilupparsi ulteriormente.

Tuttavia, se hai un'altra soluzione che funziona, condividila. Sono sicuro che altre persone che potrebbero leggere questo troveranno utile, in quanto è una caratteristica essenziale per la distribuzione continua.