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.
fonte
2014-09-04 23:34:49
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. –
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
@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. –