-
Notifications
You must be signed in to change notification settings - Fork 8
/
aws.js
99 lines (89 loc) · 3.26 KB
/
aws.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
const { argv } = require('yargs');
const prompt = require('gulp-prompt');
const rename = require('gulp-rename');
const awspublish = require('gulp-awspublish');
const invalidate = require('gulp-cloudfront-invalidate-aws-publish');
const gulp = require('gulp');
const fail = require('gulp-fail');
const gulpIf = require('gulp-if');
const gutil = require('gulp-util');
const fs = require('fs-extra');
const path = require('path');
const open = require('open');
const revAll = require('gulp-rev-all');
const querystring = require('querystring');
module.exports = () => {
const target = argv.production ?
'com.politico.interactives.politico.com' :
'staging.interactives.politico.com';
const region = 'us-east-1';
const publishParams = {
Bucket: target,
};
if (argv.production) {
publishParams['Cloudfront'] = 'E3V6OHE700RHMR';
}
const meta = fs.readJsonSync(
path.resolve(process.cwd(), 'meta.json'));
const publisher = awspublish.create({
accessKeyId: process.env.awsAccessKey,
secretAccessKey: process.env.awsSecretKey,
region,
params: publishParams,
});
const awsDirectory = meta.publishPath;
const headers = {
'Cache-Control': 'max-age=300, no-transform, public',
};
// Ignore these files during versioning
const versionIgnore = [
'.html', // html files (not regex)
/.*images.*$/, // images
/.*\.json$/, // application data
/.*\.csv$/, // application data
];
const cloudFrontConfig = {
distribution: 'E3V6OHE700RHMR',
accessKeyId: process.env.awsAccessKey,
secretAccessKey: process.env.awsSecretKey,
indexRootPath: true,
};
return gulp.src('./dist/**/*')
.pipe(gulpIf(() => {
// As a dumb check against syncing the entire bucket
// we check to make sure you're putting your project at
// least 2 directories deep.
const depth = awsDirectory.replace(/\/$/, '').split('/').length;
return depth < 2;
}, fail(`Can't publish to ${awsDirectory}. Check meta.json and your publishPath setting.`)))
.on('end', () => {
gutil.log(
gutil.colors.cyan(`You're about to publish this project to AWS under directory ${gutil.colors.bold.black.bgYellow(awsDirectory)}. This will sync this directory with your local dist folder and may cause files to be deleted.`));
})
.pipe(prompt.confirm('Are you sure?'))
.pipe(rename((pubPath) => {
// eslint-disable-next-line no-param-reassign
pubPath.dirname = path.join(awsDirectory, pubPath.dirname.replace('.\\', ''));
}))
.pipe(revAll.revision({
dontRenameFile: versionIgnore,
dontUpdateReference: versionIgnore,
}))
.pipe(awspublish.gzip())
.pipe(publisher.publish(headers, { force: false }))
.pipe(publisher.sync(awsDirectory))
// eslint-disable-next-line no-extra-boolean-cast
.pipe(!!gutil.env.invalidate ? invalidate(cloudFrontConfig) : gutil.noop())
.pipe(publisher.cache())
.pipe(awspublish.reporter())
.on('end', () => {
setTimeout(() => {
const metaUrl = argv.production ? meta.url : meta.stagingUrl;
const q = querystring.stringify({ q: metaUrl });
if (argv.production) {
open(`https://developers.facebook.com/tools/debug/sharing/?${q}`);
}
open(metaUrl);
}, 1000);
});
};