summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Cole <dave@developmentseed.org>2013-04-30 15:16:54 -0400
committerDave Cole <dave@developmentseed.org>2013-04-30 15:16:54 -0400
commit904f777f8b3934e791ed0577054bcc3aadfcaac2 (patch)
treee11e50261d9be8685ec75842f55b46fae9c16cc9
parent9cd2172060a665118e8e67ffc8024d5afeb68217 (diff)
Add queue to manage simultaneous requests.
-rwxr-xr-xjekyll-hook.js97
-rw-r--r--package.json3
2 files changed, 57 insertions, 43 deletions
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);
});
diff --git a/package.json b/package.json
index 6348faf..f2cd59d 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,8 @@
"version": "0.1.0",
"dependencies": {
"express": "3.x",
- "emailjs": "0.3.4"
+ "emailjs": "0.3.4",
+ "queue-async": "1.0.x"
},
"private": true
}