From 904f777f8b3934e791ed0577054bcc3aadfcaac2 Mon Sep 17 00:00:00 2001 From: Dave Cole Date: Tue, 30 Apr 2013 15:16:54 -0400 Subject: Add queue to manage simultaneous requests. --- jekyll-hook.js | 97 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 55 insertions(+), 42 deletions(-) (limited to 'jekyll-hook.js') diff --git a/jekyll-hook.js b/jekyll-hook.js index 399bbe5..78533cf 100755 --- a/jekyll-hook.js +++ b/jekyll-hook.js @@ -4,6 +4,8 @@ var config = require('./config.json'); var fs = require('fs'); var express = require('express'); var app = express(); +var queue = require('queue-async'); +var tasks = queue(1); var spawn = require('child_process').spawn; var email = require('emailjs/email'); var mailer = email.server.connect(config.email); @@ -11,61 +13,72 @@ var mailer = email.server.connect(config.email); app.use(express.bodyParser()); // Receive webhook post -app.post('/hooks/jekyll/:branch', function(req, res){ - var data = JSON.parse(req.body.payload); - var branch = req.params.branch; - var params = []; - - // Parse webhook data for internal variables - data.repo = data.repository.name; - data.branch = data.ref.split('/')[2]; - data.owner = data.repository.owner.name; +app.post('/hooks/jekyll/:branch', function(req, res) { // Close connection res.send(202); - // End early if not permitted account - if (config.accounts.indexOf(data.owner) === -1) { - console.log(data.owner + ' is not an authorized account.'); - return; - } + // Queue request handler + tasks.defer(function(req, res, cb) { + var data = JSON.parse(req.body.payload); + var branch = req.params.branch; + var params = []; - // End early if not permitted branch - if (data.branch !== branch) { - console.log('Not ' + branch + ' branch.'); - return; - } + // Parse webhook data for internal variables + data.repo = data.repository.name; + data.branch = data.ref.split('/')[2]; + data.owner = data.repository.owner.name; + + // End early if not permitted account + if (config.accounts.indexOf(data.owner) === -1) { + console.log(data.owner + ' is not an authorized account.'); + return; + } - // Process webhook data into params for scripts - /* repo */ params.push(data.repo); - /* branch */ params.push(data.branch); - /* owner */ params.push(data.owner); - /* giturl */ params.push('git@' + config.gh_server + ':' + data.owner + '/' + data.repo + '.git'); - /* source */ params.push(config.temp + '/' + data.owner + '/' + data.repo + '/' + data.branch + '/' + 'code'); - /* build */ params.push(config.temp + '/' + data.owner + '/' + data.repo + '/' + data.branch + '/' + 'site'); - - // Run build script - run(config.scripts.build, params, function(err) { - if (err) { - console.log('Failed to build: ' + data.owner + '/' + data.repo); - send('Your website at ' + data.owner + '/' + data.repo + ' failed to build.', 'Error building site', data); + // End early if not permitted branch + if (data.branch !== branch) { + console.log('Not ' + branch + ' branch.'); return; } - // Run publish script - run(config.scripts.publish, params, function(err) { + // Process webhook data into params for scripts + /* repo */ params.push(data.repo); + /* branch */ params.push(data.branch); + /* owner */ params.push(data.owner); + /* giturl */ params.push('git@' + config.gh_server + ':' + data.owner + '/' + data.repo + '.git'); + /* source */ params.push(config.temp + '/' + data.owner + '/' + data.repo + '/' + data.branch + '/' + 'code'); + /* build */ params.push(config.temp + '/' + data.owner + '/' + data.repo + '/' + data.branch + '/' + 'site'); + + // Run build script + run(config.scripts.build, params, function(err) { if (err) { - console.log('Failed to publish: ' + data.owner + '/' + data.repo); - send('Your website at ' + data.owner + '/' + data.repo + ' failed to publish.', 'Error publishing site', data); + console.log('Failed to build: ' + data.owner + '/' + data.repo); + send('Your website at ' + data.owner + '/' + data.repo + ' failed to build.', 'Error building site', data); + + if (typeof cb === 'function') cb(); return; } - // Done running scripts - console.log('Successfully rendered: ' + data.owner + '/' + data.repo); - send('Your website at ' + data.owner + '/' + data.repo + ' was succesfully published.', 'Succesfully published site', data); + // Run publish script + run(config.scripts.publish, params, function(err) { + if (err) { + console.log('Failed to publish: ' + data.owner + '/' + data.repo); + send('Your website at ' + data.owner + '/' + data.repo + ' failed to publish.', 'Error publishing site', data); + if (typeof cb === 'function') cb(); + return; + } + + // Done running scripts + console.log('Successfully rendered: ' + data.owner + '/' + data.repo); + send('Your website at ' + data.owner + '/' + data.repo + ' was succesfully published.', 'Succesfully published site', data); + + if (typeof cb === 'function') cb(); + return; + }); }); - }); + }, req, res); + }); // Start server @@ -78,11 +91,11 @@ function run(file, params, cb) { process.stdout.on('data', function (data) { console.log('' + data); }); - + process.stderr.on('data', function (data) { console.warn('' + data); }); - + process.on('exit', function (code) { if (typeof cb === 'function') cb(code !== 0); }); -- cgit v1.2.3