diff --git a/Gruntfile.js b/Gruntfile.js index 1f4058f2de..6cbbfd4fd0 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,6 +6,7 @@ var browserifyTask = require('./grunt/tasks/browserify'); var populistTask = require('./grunt/tasks/populist'); var webdriverPhantomJSTask = require('./grunt/tasks/webdriver-phantomjs'); var webdriverJasmineTasks = require('./grunt/tasks/webdriver-jasmine'); +var sauceTunnelTask = require('./grunt/tasks/sauce-tunnel'); var npmTask = require('./grunt/tasks/npm'); var releaseTasks = require('./grunt/tasks/release'); @@ -46,6 +47,8 @@ module.exports = function(grunt) { grunt.registerMultiTask('populist', populistTask); + grunt.registerTask('sauce-tunnel', sauceTunnelTask); + grunt.registerMultiTask('webdriver-jasmine', webdriverJasmineTasks); grunt.registerMultiTask('npm', npmTask); diff --git a/grunt/tasks/sauce-tunnel.js b/grunt/tasks/sauce-tunnel.js new file mode 100644 index 0000000000..dc3de1164a --- /dev/null +++ b/grunt/tasks/sauce-tunnel.js @@ -0,0 +1,36 @@ +var grunt = require('grunt'); +var SauceTunnel = require('sauce-tunnel'); + +module.exports = function(){ + var task = this; + var config = task.data; + var shouldStayAliveForever = task.flags.keepalive; + + var SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY; + if (!SAUCE_ACCESS_KEY) grunt.fatal('Requires the environment variable SAUCE_ACCESS_KEY to be set'); + + var SAUCE_USERNAME = process.env.SAUCE_USERNAME; + if (!SAUCE_USERNAME) grunt.fatal('Requires the environment variable SAUCE_USERNAME to be set'); + + var taskCompletedSuccessfully = task.async(); + + var stunnel = new SauceTunnel(SAUCE_USERNAME, SAUCE_ACCESS_KEY, /*identifier*/null, /*tunneled*/true, /*tunnelTimeout*/10e3); + process.on('exit', stunnel.stop.bind(stunnel, function(){})); + + stunnel.on('log:error', grunt.log.error.bind(grunt.log)); + stunnel.on('log:writeln', grunt.log.writeln.bind(grunt.log)); + + stunnel.on('verbose:ok', grunt.verbose.ok.bind(grunt.verbose)); + stunnel.on('verbose:error', grunt.verbose.error.bind(grunt.verbose)); + stunnel.on('verbose:debug', grunt.verbose.debug.bind(grunt.verbose)); + stunnel.on('verbose:writeln', grunt.verbose.writeln.bind(grunt.verbose)); + + stunnel.openTunnel(function(isOpen){ + if (shouldStayAliveForever && isOpen){ + grunt.verbose.writeln('Keeping the sauce-tunnel open forever because you used the keepalive flag `' + task.name + '`'); + return; + } + grunt.verbose.writeln('To keep the sauce-tunnel open forever, use the grunt task `' + task.name + ':keepalive`'); + taskCompletedSuccessfully(isOpen); + }); +}; diff --git a/package.json b/package.json index bb21489676..3788776cae 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,8 @@ "jasmine-tapreporter": "~0.2.2", "grunt-contrib-connect": "~0.5.0", "es5-shim": "~2.1.0", - "wd": "~0.2.2" + "wd": "~0.2.2", + "sauce-tunnel": "~1.1.0" }, "engines": { "node": ">=0.10.0"