UNPKG

pancakes-syrup

Version:

Deployment build tasks for pancakes projects

182 lines (156 loc) 7.15 kB
/** * Author: Jeff Whelpley * Date: 1/20/15 * * */ var cssbuild = require('./streams.cssbuild'); var jsbuild = require('./streams.jsbuild'); var s3 = require('./streams.s3'); var awspublish = require('gulp-awspublish'); var aws = require('./streams.aws'); var Q = require('q'); var _ = require('lodash'); var eventStream = require('event-stream'); var streamqueue = require('streamqueue'); var rename = require('gulp-rename'); var concat = require('gulp-concat'); var replace = require('gulp-replace'); var uglify = require('gulp-uglify'); var minifyCSS = require('gulp-clean-css'); var gutil = require('gulp-util'); var path = require('path'); var delim = path.normalize('/'); var objMode = { objectMode: true }; module.exports = function (gulp, opts) { opts = opts || {}; opts.deploy = true; var timestamp = opts.timestamp || (new Date()).getTime() + ''; var outputPrefix = opts.outputPrefix; var config = opts.config || {}; var env = opts.env; var assetsDir = opts.assetsDir || (opts.rootDir + delim + 'assets'); var jsAssets = opts.jsAssets; var cssAssets = opts.cssAssets || []; var awsConfig = config.aws || {}; var s3opts = { accessKeyId: awsConfig.keyId, secretAccessKey: awsConfig.secret, params: { Bucket: awsConfig.assets && awsConfig.assets.bucket } }; return { fonts: function () { var stream = gulp.src([assetsDir + delim + 'fonts/*']) .pipe(rename(function (filePath) { filePath.basename += '.' + opts.timestamp; })); return s3.uploadFromStream(stream, 'fonts', s3opts); }, // copy all the local assets to the target s3 bucket assets: function () { if (!env) { throw new Error('env param must be set for deploy tasks'); } // create publisher for css assets var publisher = awspublish.create(s3opts); gutil.log('deploying assets to CDN'); return eventStream.merge( s3.uploadFiles(gulp, [assetsDir + delim + 'html/*'], 'html', s3opts), s3.uploadFiles(gulp, [assetsDir + delim + 'img/*'], 'img', s3opts), s3.uploadFiles(gulp, jsAssets, 'js', s3opts), // one off case for css assets which is the async font file gulp.src(cssAssets) .pipe(replace(/gh\.eot/g, 'gh.' + timestamp + '.eot')) .pipe(replace(/gh\.woff/g, 'gh.' + timestamp + '.woff')) .pipe(replace(/gh\.ttf/g, 'gh.' + timestamp + '.ttf')) .pipe(replace(/gh\.svg/g, 'gh.' + timestamp + '.svg')) .pipe(rename(function (filePath) { filePath.dirname = 'css'; })) .pipe(awspublish.gzip({})) .pipe(publisher.publish({ 'Cache-Control': 'max-age=315360000, no-transform, public' })) .pipe(awspublish.reporter({})) ); }, // deploy latest JavaScript and CSS jscss: function () { if (!env) { throw new Error('env param must be set for deploy tasks'); } var cssName = outputPrefix + '.all.' + timestamp + '.css'; var jsCommonName = outputPrefix + '.common.' + timestamp + '.js'; var jsLazyName = outputPrefix + '.lazy.' + timestamp + '.js'; var newFiles = [cssName, jsCommonName]; var cssStream = cssbuild.generateCss(gulp, opts) .pipe(replace(/gh\.eot/g, 'gh.' + timestamp + '.eot')) .pipe(replace(/gh\.woff/g, 'gh.' + timestamp + '.woff')) .pipe(replace(/gh\.ttf/g, 'gh.' + timestamp + '.ttf')) .pipe(replace(/gh\.svg/g, 'gh.' + timestamp + '.svg')) .pipe(rename(cssName)) .pipe(minifyCSS({ rebase: false })); var jsStream = streamqueue(objMode, jsbuild.generateLibJs(gulp, opts), jsbuild.generateCommonJs(gulp, opts).pipe(uglify()) ).pipe(concat(jsCommonName)); var lazyStream = jsbuild.generateLazyJs(gulp, opts) .pipe(rename(jsLazyName)); // array will contains streams for each custom JS and CSS file going to s3 var buildArr = [ s3.uploadFromStream(cssStream, 'css', s3opts), s3.uploadFromStream(jsStream, 'js', s3opts), s3.uploadFromStream(lazyStream, 'js', s3opts) ]; _.each(opts.appConfigs, function (appConfig, appName) { if (appName !== 'common') { var appFileName = outputPrefix + '.' + appName + '.combo.' + timestamp + '.js'; newFiles.push(appFileName); var appStream = jsbuild.generateComboJs(appName, gulp, opts) .pipe(rename(appFileName)) .pipe(uglify()); buildArr.push(s3.uploadFromStream(appStream, 'js', s3opts)); } }); // makes sure all JavaScript and CSS deployed var deferred = Q.defer(); eventStream.merge.apply(null, buildArr) .on('end', function () { // once jsbuild done, update the CLIENT_VERSION var clientVersion = { 'CLIENT_VERSION': timestamp }; aws.updateEnvironmentVariables(clientVersion, config.envVars, awsConfig) .then(function () { gutil.log('Updated CLIENT_VERSION to ' + timestamp); deferred.resolve(); }) .catch(function (err) { deferred.reject(err); }); }) .on('error', function (err) { deferred.reject(err); }); return deferred.promise; }, // deploy new app; if want to set version, need to pass it in via --version=1234 app: function () { if (!env) { throw new Error('env param must be set for deploy tasks'); } var envOverrides = opts.version ? { 'CLIENT_VERSION': opts.version } : {}; return aws.deploy(envOverrides, opts.target, config.aws); }, // deploy everything (i.e. assets, jscss, code) '': { deps: ['deploy.fonts', 'deploy.assets', 'deploy.jscss'], task: function () { if (!env) { throw new Error('env param must be set for deploy tasks'); } return aws.deploy({ 'CLIENT_VERSION': timestamp }, opts.target, config.aws); } } }; };