Github Post-Receive Hook en Nodejs

Estoy intentando crear un gancho post-recepción en Nodejs para actualizar mi server cuando se haya actualizado mi repository de Github.

He hecho esto antes en php. Ahora estoy usando Nodejs y no estoy seguro de cómo se debe lograr.

He visto esta publicación de blog sobre la configuration de nodejs en una instancia de ec2. Dice:

Create a post-recieve hook that will copy over new code after it's been pushed to the repository $ cat > hooks/post-receive #!/bin/sh GIT_WORK_TREE=/home/ubuntu/www export GIT_WORK_TREE git checkout -f $ chmod +x hooks/post-receive 

No estoy seguro de qué está haciendo exactamente el código anterior y cómo debe implementarse.

¿Alguna idea sobre la mejor manera de hacer esto?

Estoy ejecutando una instancia básica de 32 bits de Amazon Linux EC2.

Un repository de git bare no incluye el tree de trabajo. Entonces, para usar los files, debe verificarlos.

poniendo el script anterior en (pseudopaso) ec2: mybaregitrepo / hooks / post-recieve hará que se ejecute cada vez que presione ec2.

Lo que significa:

 #!/bin/sh //set git working tree (the files you can use) to the path /home/ubuntu/www GIT_WORK_TREE=/home/ubuntu/www export GIT_WORK_TREE //force git checkout so that your files will be put into the working tree. git checkout -f 

que:

 //make the post-recieve hook executable so that it can run when you push commits to ec2 chmod +x hooks/post-receive 

He aquí un recorrido decente de la configuration de un repo remoto remoto. http://toroid.org/ams/git-website-howto

Mi aplicación de node ( Express ) se ejecuta forever , por lo que utilizo el siguiente controller, que básicamente hace un git pull y se mata a sí mismo (por lo tanto, reaparece).

 function handleGitHub(req, res, next) { setTimeout(function() { var shouldRestart = !app.config.webhook || req.body.head_commit.message.indexOf(app.config.webhook) > -1; console.log('[GITHUB] WebHook Received for "%s" (WebHook: %s, Restart? %s)', req.body && req.body.head_commit.message, app.config.webhook && app.config.webhook, shouldRestart); if (!shouldRestart) { console.log('[GITHUB] Not restarting'); return; } if (app.server_https && app.server_https.close) { console.log('[GITHUB] Closing HTTPS'); app.server_https.close(); } if (app.server && app.server.close) { console.log('[GITHUB] Closing HTTP'); app.server.close(); } setTimeout(function() { var spawn = require('child_process').spawn; var shell = process.env.SHELL; var args = ['-c', 'git pull']; var path = require('path'); var projectPath = '/path/to/your/project/folder'; //or path.join(__dirname, '.... var opts = { cwd: projectPath }; console.log('[GITHUB] Spawning...', opts); var spawnProcess = spawn(shell, args, opts); spawnProcess.stdout.on('data', function(data) { // could log these }); spawnProcess.stderr.on('data', function(data) { // could log these }); spawnProcess.on('close', function(exitCode) { console.log('[GITHUB] Spawn finished', exitCode); console.log('[GITHUB] Exiting...'); console.log('-------------------------------------------------------'); process.exit(0); }); }, 1000); }, 500); res.send(200, 'OK'); } 

Ahora, solo usa una ruta que apunta a esta function:

 app.post('/some_path_you_setup_in_github_web_hooks', handleGitHub); 

Puede configurar su gancho de inserción en https://github.com/your_username/your_project/settings/hooks