1 | var aws
|
2 | var async
|
3 | var mime
|
4 | var fileStuff
|
5 | var glob
|
6 | var path
|
7 | var fs
|
8 |
|
9 | var manifest
|
10 |
|
11 | var exports = {
|
12 | deploy : deploy,
|
13 | isDeployable : isDeployable,
|
14 | getDeployableFiles : getDeployableFiles,
|
15 | doUpload : doUpload,
|
16 | getBucketObjects : getBucketObjects,
|
17 | shouldBeUploaded : shouldBeUploaded
|
18 | }
|
19 |
|
20 | module.exports = function(gulpManifest, deps) {
|
21 | if(deps) {
|
22 | aws = deps.awssdk
|
23 | async = deps.async
|
24 | mime = deps.mime
|
25 | fileStuff = deps.fileStuff
|
26 | glob = deps.glob
|
27 | fs = deps.fs
|
28 | path = deps.path
|
29 | }
|
30 | else {
|
31 | aws = require('aws-sdk')
|
32 | async = require('async')
|
33 | mime = require('mime')
|
34 | glob = require('glob')
|
35 | path = require('path')
|
36 | fs = require('fs')
|
37 | fileStuff = require(path.dirname(__filename) + '/fileStuff.js')()
|
38 | }
|
39 |
|
40 | manifest = gulpManifest
|
41 | return exports
|
42 | }
|
43 |
|
44 |
|
45 |
|
46 | function deploy(pkgIndex, destIndex, cb) {
|
47 |
|
48 | try{
|
49 |
|
50 | var dest = manifest[pkgIndex]["dest"][destIndex]
|
51 |
|
52 | if(!exports.isDeployable(dest)) {
|
53 | cb()
|
54 | return
|
55 | }
|
56 |
|
57 | var creds = new aws.SharedIniFileCredentials({profile: dest.awsCredentialsProfile});
|
58 | aws.config.credentials = creds
|
59 | var s3 = new aws.S3()
|
60 |
|
61 | exports.getBucketObjects(s3, dest.s3Bucket, function(err, data){
|
62 |
|
63 | if(err) {
|
64 | cb(err)
|
65 | return
|
66 | }
|
67 |
|
68 | var objects = data
|
69 |
|
70 | try{
|
71 | var deployableFiles = exports.getDeployableFiles(dest.directory)
|
72 | }
|
73 | catch(err){
|
74 | cb(err)
|
75 | return
|
76 | }
|
77 |
|
78 | var prefix = (dest.s3Prefix === undefined? "" : dest.s3Prefix + "/")
|
79 | var cacheControl = (dest.s3CacheControl === undefined? "" : dest.s3CacheControl)
|
80 | if(prefix === "/") prefix = ""
|
81 |
|
82 | async.each(deployableFiles, function(file, cb){
|
83 |
|
84 | if(exports.shouldBeUploaded(objects, file, prefix)){
|
85 | var filekey = prefix + file.key
|
86 | exports.doUpload(dest.s3Bucket, file.path, filekey, cacheControl, s3, cb)
|
87 | }
|
88 | else {
|
89 | cb()
|
90 | }
|
91 | },
|
92 | function(err) {
|
93 | if(err) cb(err)
|
94 | else {
|
95 | console.log("")
|
96 | console.log("DONE DEPLOYING")
|
97 | console.log("")
|
98 | cb()
|
99 | }
|
100 | })
|
101 | })
|
102 | }
|
103 | catch(err) {
|
104 | cb(err)
|
105 | return
|
106 | }
|
107 | }
|
108 |
|
109 | function getBucketObjects(s3, bucketName, cb){
|
110 | s3.listObjects({Bucket:bucketName}, function(err, data){
|
111 |
|
112 | if(err) {
|
113 | cb(err)
|
114 | return
|
115 | }
|
116 |
|
117 | var objects = []
|
118 |
|
119 | for(var i in data.Contents){
|
120 | objects.push({
|
121 | key: data.Contents[i].Key,
|
122 | lastModified: (new Date(data.Contents[i].LastModified)).getTime()
|
123 | })
|
124 | }
|
125 |
|
126 | cb(null, objects)
|
127 | })
|
128 | }
|
129 |
|
130 | function shouldBeUploaded(objects, file, prefix) {
|
131 |
|
132 | var fullKey = prefix + file.key
|
133 | var lastModified
|
134 |
|
135 | for(var i in objects){
|
136 | if(objects[i].key === fullKey) {
|
137 | lastModified = objects[i].lastModified
|
138 | break
|
139 | }
|
140 | }
|
141 |
|
142 | if(lastModified === undefined) {
|
143 | return true
|
144 | }
|
145 | else {
|
146 | return fileStuff.fileIsNewer(file.path, lastModified)
|
147 | }
|
148 | }
|
149 |
|
150 | function doUpload(bucket, filePath, key, cacheControl, s3, cb) {
|
151 | console.log("Uploading file: ", key)
|
152 |
|
153 | var params = { Bucket: bucket,
|
154 | Key: key,
|
155 | ContentType: mime.lookup(filePath),
|
156 | Body: fs.createReadStream(filePath),
|
157 | ACL: 'public-read'
|
158 | }
|
159 |
|
160 | if(cacheControl !== "") {
|
161 | params.CacheControl = cacheControl
|
162 | }
|
163 |
|
164 | var options = {}
|
165 |
|
166 | s3.upload(params, options, function(err, data){
|
167 | if(err) cb(err)
|
168 | else {
|
169 | console.log("Finished uploading: ", key)
|
170 | cb()
|
171 | }
|
172 | })
|
173 | }
|
174 |
|
175 |
|
176 | function isDeployable(dest) {
|
177 | if(dest.s3Bucket && dest.awsCredentialsProfile) return true
|
178 | return false
|
179 | }
|
180 |
|
181 |
|
182 | function getDeployableFiles(directory) {
|
183 |
|
184 | var distDirectory = path.normalize(directory)
|
185 | if(distDirectory !== "") distDirectory += "/"
|
186 |
|
187 |
|
188 | var allFiles = glob.sync(distDirectory + '**')
|
189 | var result = []
|
190 |
|
191 | for(var i in allFiles){
|
192 | if(!fileStuff.fileIsDirectory(allFiles[i])) {
|
193 | var key = path.relative(distDirectory, allFiles[i]).replace(/\\/g, '/')
|
194 | result.push({"path" : allFiles[i], "key" : key})
|
195 | }
|
196 | }
|
197 | return result
|
198 | }
|
199 |
|
200 |
|