jekyll-s3 2.7.0 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -10,6 +10,7 @@ Deploy your jekyll site to S3.
10
10
  * Upload your site to AWS S3
11
11
  * Help you use AWS Cloudfront to distribute your Jekyll blog
12
12
  * Create an S3 website for you
13
+ * Improve page speed with HTTP cache control and gzipping
13
14
 
14
15
  ## Install
15
16
 
@@ -31,6 +32,10 @@ s3_bucket: your.blog.bucket.com
31
32
 
32
33
  * Run `jekyll-s3` to push your Jekyll blog to S3. Congratulations! You are live.
33
34
 
35
+ (If you are using `jekyll-s3` on an [EC2 instance with IAM
36
+ roles](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances),
37
+ you can omit the `s3_id` and `s3_secret` keys in the config file.)
38
+
34
39
  ### Using environment variables
35
40
 
36
41
  You can use ERB in your `_jekyll_s3.yml` file which incorporates environment variables:
@@ -150,7 +155,21 @@ thus force the CDN system to reload the changes from your Jekyll S3 bucket.
150
155
  #### Specifying custom settings for your CloudFront distribution
151
156
 
152
157
  The gem `configure-s3-website`, which is a dependency of `jekyll-s3`, lets you
153
- define custom settings for your CloudFront distribution. See the [gem's
158
+ define custom settings for your CloudFront distribution.
159
+
160
+ For example, like this you can define a your own TTL and CNAME:
161
+
162
+ ```yaml
163
+ cloudfront_distribution_config:
164
+ default_cache_behavior:
165
+ min_TTL: <%= 60 * 60 * 24 %>
166
+ aliases:
167
+ quantity: 1
168
+ items:
169
+ CNAME: your.website.com
170
+ ```
171
+
172
+ See the [gem's
154
173
  documentation](https://github.com/laurilehmijoki/configure-s3-website) for more
155
174
  info.
156
175
 
@@ -166,7 +185,30 @@ Enable the headless mode by adding the `--headless` or `-h` argument after
166
185
 
167
186
  ### Configuring redirects on your Jekyll S3 website
168
187
 
169
- You can set HTTP redirects on your Jekyll S3 website by adding the following
188
+ You can set HTTP redirects on your Jekyll S3 website in two ways. If you only
189
+ need simple "301 Moved Premanently" redirects for certain keys, use the
190
+ Simple Redirects method. Otherwise, use the Routing Rules method.
191
+
192
+ #### Simple Redirects
193
+
194
+ For simple redirects Jekyll S3 uses Amazon S3's
195
+ [`x-amz-website-redirect-location`](http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html)
196
+ metadata. It will create zero-byte objects for each path you want
197
+ redirected with the appropriate `x-amz-website-redirect-location` value.
198
+
199
+ For setting up simple redirect rules, simply list each path and target
200
+ as key-value pairs under the `redirects` configuration option:
201
+
202
+ ```yaml
203
+ redirects:
204
+ index.php: /
205
+ about.php: about.html
206
+ music-files/promo.mp4: http://www.youtube.com/watch?v=dQw4w9WgXcQ
207
+ ```
208
+
209
+ #### Routing Rules
210
+
211
+ You can configure more complex redirect rules by adding the following
170
212
  configuration into the `_jekyll_s3.yml` file:
171
213
 
172
214
  ```yaml
@@ -213,6 +255,11 @@ Jekyll::S3::Uploader.run('/path/to/your/jekyll-site/_site/', config, in_headless
213
255
  The code above will assume that you have the `_jekyll_s3.yml` in the directory
214
256
  `/path/to/your/jekyll-site`.
215
257
 
258
+ ## Example configurations
259
+
260
+ See
261
+ <https://github.com/laurilehmijoki/jekyll-s3/blob/master/example-configurations.md>.
262
+
216
263
  ## Known issues
217
264
 
218
265
  None. Please send a pull request if you spot any.
data/changelog.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  This project uses [Semantic Versioning](http://semver.org).
4
4
 
5
+ ## 2.8.0
6
+
7
+ * Add support for simple redirects
8
+
5
9
  ## 2.7.0
6
10
 
7
11
  * Allow s3_id and s3_secret to be omitted
@@ -0,0 +1,43 @@
1
+ # Example `jekyll-s3` configurations
2
+
3
+ This document shows examples of complete `_jekyll_s3.yml` configurations.
4
+
5
+ ## Minimal
6
+
7
+ ````yaml
8
+ s3_id: abcd
9
+ s3_secret: 2s+x92
10
+ s3_bucket: your.domain.net
11
+ ````
12
+
13
+ ## Minimal with EC2 AIM roles
14
+
15
+ ````yaml
16
+ s3_bucket: your.domain.net
17
+ ````
18
+
19
+ If you run `jekyll-s3` on an EC2 instance with IAM roles, it is possible to omit
20
+ the `s3_id` and `s3_secret`.
21
+
22
+ ## Optimised for speed: using CloudFront, gzip and cache headers
23
+
24
+ ````yaml
25
+ s3_id: <%= ENV['your_domain_net_aws_key'] %>
26
+ s3_secret: <%= ENV['your_domain_net_aws_secret'] %>
27
+ s3_bucket: your.domain.net
28
+ cloudfront_distribution_id: <%= ENV['your_domain_net_cloudfront_distribution_id'] %>
29
+ cloudfront_distribution_config:
30
+ default_cache_behavior:
31
+ min_TTL: <%= 60 * 60 * 24 %>
32
+ aliases:
33
+ quantity: 1
34
+ items:
35
+ CNAME: your.domain.net
36
+ max_age: 120
37
+ gzip: true
38
+ ````
39
+
40
+ Above, we store the AWS credentials and the id of the CloudFront distribution as
41
+ environment variables. It's convenient, since you can keep the `_jekyll_s3.yml`
42
+ in a public Git repo, and thus have your deployment configurations
43
+ version-controlled.
@@ -0,0 +1,384 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net?max-keys=1000
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Content-Type:
11
+ - ''
12
+ User-Agent:
13
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
14
+ Date:
15
+ - Tue, 28 May 2013 16:44:09 GMT
16
+ Authorization:
17
+ - AWS foo:foo
18
+ Accept:
19
+ - ! '*/*'
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ X-Amz-Id-2:
26
+ - kGCga6NIm0ybqHxPbkdrzL4YTE2Ik7Az88+JBSXk1uPWgj0a0ozR9z5BdOUOZSKy
27
+ X-Amz-Request-Id:
28
+ - 87A0319E10B35221
29
+ Date:
30
+ - Tue, 28 May 2013 16:43:53 GMT
31
+ Content-Type:
32
+ - application/xml
33
+ Transfer-Encoding:
34
+ - chunked
35
+ Server:
36
+ - AmazonS3
37
+ body:
38
+ encoding: US-ASCII
39
+ string: ! '<?xml version="1.0" encoding="UTF-8"?>
40
+
41
+ <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>jekyll-s3-test.net</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>.gitkeep</Key><LastModified>2013-05-28T16:27:36.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>'
42
+ http_version:
43
+ recorded_at: Tue, 28 May 2013 16:44:09 GMT
44
+ - request:
45
+ method: head
46
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/.gitkeep
47
+ body:
48
+ encoding: US-ASCII
49
+ string: ''
50
+ headers:
51
+ Content-Type:
52
+ - ''
53
+ User-Agent:
54
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
55
+ Date:
56
+ - Tue, 28 May 2013 16:44:09 GMT
57
+ Authorization:
58
+ - AWS foo:foo
59
+ Accept:
60
+ - ! '*/*'
61
+ response:
62
+ status:
63
+ code: 200
64
+ message: OK
65
+ headers:
66
+ X-Amz-Id-2:
67
+ - bAn0wcE+zU2espZy2XzUQAoKBVY42UbUZ6ELx6Vm4MFsCynvMspnh9xHuPpbw4BR
68
+ X-Amz-Request-Id:
69
+ - 16821C1979EFD9FB
70
+ Date:
71
+ - Tue, 28 May 2013 16:43:54 GMT
72
+ Last-Modified:
73
+ - Tue, 28 May 2013 16:27:36 GMT
74
+ Etag:
75
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
76
+ Accept-Ranges:
77
+ - bytes
78
+ Content-Type:
79
+ - ''
80
+ Content-Length:
81
+ - '0'
82
+ Server:
83
+ - AmazonS3
84
+ body:
85
+ encoding: US-ASCII
86
+ string: ''
87
+ http_version:
88
+ recorded_at: Tue, 28 May 2013 16:44:10 GMT
89
+ - request:
90
+ method: head
91
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/.gitkeep
92
+ body:
93
+ encoding: US-ASCII
94
+ string: ''
95
+ headers:
96
+ Content-Type:
97
+ - ''
98
+ User-Agent:
99
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
100
+ Date:
101
+ - Tue, 28 May 2013 16:44:10 GMT
102
+ Authorization:
103
+ - AWS foo:foo
104
+ Accept:
105
+ - ! '*/*'
106
+ response:
107
+ status:
108
+ code: 200
109
+ message: OK
110
+ headers:
111
+ X-Amz-Id-2:
112
+ - S4qbXk9empwOUKpUl3teDUGS60qYOg0CxRm7v8ccxa1Z5Y9K60DWvq8v7YHWAPWc
113
+ X-Amz-Request-Id:
114
+ - 62DB5F01C0BEF2BA
115
+ Date:
116
+ - Tue, 28 May 2013 16:43:54 GMT
117
+ Last-Modified:
118
+ - Tue, 28 May 2013 16:27:36 GMT
119
+ Etag:
120
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
121
+ Accept-Ranges:
122
+ - bytes
123
+ Content-Type:
124
+ - ''
125
+ Content-Length:
126
+ - '0'
127
+ Server:
128
+ - AmazonS3
129
+ body:
130
+ encoding: US-ASCII
131
+ string: ''
132
+ http_version:
133
+ recorded_at: Tue, 28 May 2013 16:44:10 GMT
134
+ - request:
135
+ method: head
136
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/.gitkeep
137
+ body:
138
+ encoding: US-ASCII
139
+ string: ''
140
+ headers:
141
+ Content-Type:
142
+ - ''
143
+ User-Agent:
144
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
145
+ Date:
146
+ - Tue, 28 May 2013 16:44:10 GMT
147
+ Authorization:
148
+ - AWS foo:foo
149
+ Accept:
150
+ - ! '*/*'
151
+ response:
152
+ status:
153
+ code: 200
154
+ message: OK
155
+ headers:
156
+ X-Amz-Id-2:
157
+ - KIW+hvipZEv+PgPc03LeddPDEcI7EzDH/CuoxrksuGUIHeA3ecmbIA+jlOgpMCi7
158
+ X-Amz-Request-Id:
159
+ - CFFC7DE02A902B74
160
+ Date:
161
+ - Tue, 28 May 2013 16:43:55 GMT
162
+ Last-Modified:
163
+ - Tue, 28 May 2013 16:27:36 GMT
164
+ Etag:
165
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
166
+ Accept-Ranges:
167
+ - bytes
168
+ Content-Type:
169
+ - ''
170
+ Content-Length:
171
+ - '0'
172
+ Server:
173
+ - AmazonS3
174
+ body:
175
+ encoding: US-ASCII
176
+ string: ''
177
+ http_version:
178
+ recorded_at: Tue, 28 May 2013 16:44:11 GMT
179
+ - request:
180
+ method: head
181
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/welcome.php
182
+ body:
183
+ encoding: US-ASCII
184
+ string: ''
185
+ headers:
186
+ Content-Type:
187
+ - ''
188
+ User-Agent:
189
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
190
+ Date:
191
+ - Tue, 28 May 2013 16:44:11 GMT
192
+ Authorization:
193
+ - AWS foo:foo
194
+ Accept:
195
+ - ! '*/*'
196
+ response:
197
+ status:
198
+ code: 404
199
+ message: Not Found
200
+ headers:
201
+ X-Amz-Request-Id:
202
+ - C3D38989428864B4
203
+ X-Amz-Id-2:
204
+ - iEtbd2+jBo4YB/bWQF7S0nIPD04ctKzv8FpUL3vTPUQzwpVE70mCORaHuXASL/6V
205
+ Content-Type:
206
+ - application/xml
207
+ Transfer-Encoding:
208
+ - chunked
209
+ Date:
210
+ - Tue, 28 May 2013 16:43:54 GMT
211
+ Server:
212
+ - AmazonS3
213
+ body:
214
+ encoding: US-ASCII
215
+ string: ''
216
+ http_version:
217
+ recorded_at: Tue, 28 May 2013 16:44:12 GMT
218
+ - request:
219
+ method: put
220
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/welcome.php
221
+ body:
222
+ encoding: ASCII-8BIT
223
+ string: !binary ""
224
+ headers:
225
+ Content-Type:
226
+ - ''
227
+ Content-Length:
228
+ - '0'
229
+ X-Amz-Website-Redirect-Location:
230
+ - /welcome
231
+ User-Agent:
232
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
233
+ Date:
234
+ - Tue, 28 May 2013 16:44:12 GMT
235
+ Authorization:
236
+ - AWS foo:foo
237
+ Accept:
238
+ - ! '*/*'
239
+ response:
240
+ status:
241
+ code: 200
242
+ message: OK
243
+ headers:
244
+ X-Amz-Id-2:
245
+ - shxpzCHDkXgP6Ru7MjzBbiiONhv8O72UHLa12njGg/Ml16sNy9kGzzCEUp4T450a
246
+ X-Amz-Request-Id:
247
+ - 73AD74BF97A9FE39
248
+ Date:
249
+ - Tue, 28 May 2013 16:43:56 GMT
250
+ Etag:
251
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
252
+ Content-Length:
253
+ - '0'
254
+ Server:
255
+ - AmazonS3
256
+ body:
257
+ encoding: US-ASCII
258
+ string: ''
259
+ http_version:
260
+ recorded_at: Tue, 28 May 2013 16:44:12 GMT
261
+ - request:
262
+ method: head
263
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/pets/dogs
264
+ body:
265
+ encoding: US-ASCII
266
+ string: ''
267
+ headers:
268
+ Content-Type:
269
+ - ''
270
+ User-Agent:
271
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
272
+ Date:
273
+ - Tue, 28 May 2013 16:44:12 GMT
274
+ Authorization:
275
+ - AWS foo:foo
276
+ Accept:
277
+ - ! '*/*'
278
+ response:
279
+ status:
280
+ code: 404
281
+ message: Not Found
282
+ headers:
283
+ X-Amz-Request-Id:
284
+ - 720BC22A793D95A4
285
+ X-Amz-Id-2:
286
+ - pc2CHQG08/lLFwc/Cq3upvG3Sm+wDzsmf1FsA+YuUjkfojvJB45NbkL5LCX35bpi
287
+ Content-Type:
288
+ - application/xml
289
+ Transfer-Encoding:
290
+ - chunked
291
+ Date:
292
+ - Tue, 28 May 2013 16:43:55 GMT
293
+ Server:
294
+ - AmazonS3
295
+ body:
296
+ encoding: US-ASCII
297
+ string: ''
298
+ http_version:
299
+ recorded_at: Tue, 28 May 2013 16:44:13 GMT
300
+ - request:
301
+ method: put
302
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net/pets/dogs
303
+ body:
304
+ encoding: ASCII-8BIT
305
+ string: !binary ""
306
+ headers:
307
+ Content-Type:
308
+ - ''
309
+ Content-Length:
310
+ - '0'
311
+ X-Amz-Website-Redirect-Location:
312
+ - /cats-and-dogs/wuf
313
+ User-Agent:
314
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
315
+ Date:
316
+ - Tue, 28 May 2013 16:44:13 GMT
317
+ Authorization:
318
+ - AWS foo:foo
319
+ Accept:
320
+ - ! '*/*'
321
+ response:
322
+ status:
323
+ code: 200
324
+ message: OK
325
+ headers:
326
+ X-Amz-Id-2:
327
+ - qnGdeAUFkp76ErkCyx64T/eUilvlp2Y/b7QSCg5u+ghYyTtlR20szfiw0+tO/p7+
328
+ X-Amz-Request-Id:
329
+ - A38BEDA58C01CC5A
330
+ Date:
331
+ - Tue, 28 May 2013 16:43:57 GMT
332
+ Etag:
333
+ - ! '"d41d8cd98f00b204e9800998ecf8427e"'
334
+ Content-Length:
335
+ - '0'
336
+ Server:
337
+ - AmazonS3
338
+ body:
339
+ encoding: US-ASCII
340
+ string: ''
341
+ http_version:
342
+ recorded_at: Tue, 28 May 2013 16:44:14 GMT
343
+ - request:
344
+ method: get
345
+ uri: https://s3.amazonaws.com/jekyll-s3-test.net?max-keys=1000
346
+ body:
347
+ encoding: US-ASCII
348
+ string: ''
349
+ headers:
350
+ Content-Type:
351
+ - ''
352
+ User-Agent:
353
+ - aws-sdk-ruby/1.8.5 ruby/1.9.3 x86_64-darwin11.4.2
354
+ Date:
355
+ - Tue, 28 May 2013 16:44:14 GMT
356
+ Authorization:
357
+ - AWS foo:foo
358
+ Accept:
359
+ - ! '*/*'
360
+ response:
361
+ status:
362
+ code: 200
363
+ message: OK
364
+ headers:
365
+ X-Amz-Id-2:
366
+ - SEAH/XjpATFm0o1XovAZAXLIsYIktpmxg986HNG//aMuvy+sDLmbee5d+fPpO+x0
367
+ X-Amz-Request-Id:
368
+ - 2C139CA22908CC7A
369
+ Date:
370
+ - Tue, 28 May 2013 16:43:58 GMT
371
+ Content-Type:
372
+ - application/xml
373
+ Transfer-Encoding:
374
+ - chunked
375
+ Server:
376
+ - AmazonS3
377
+ body:
378
+ encoding: US-ASCII
379
+ string: ! '<?xml version="1.0" encoding="UTF-8"?>
380
+
381
+ <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>jekyll-s3-test.net</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>.gitkeep</Key><LastModified>2013-05-28T16:27:36.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>pets/dogs</Key><LastModified>2013-05-28T16:43:57.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>welcome.php</Key><LastModified>2013-05-28T16:43:56.000Z</LastModified><ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag><Size>0</Size><Owner><ID>3855ebae0f370c3dd0c8d8031863792112bd2a2cb18fa310d3f463ae0dea62f1</ID><DisplayName>fluid83</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>'
382
+ http_version:
383
+ recorded_at: Tue, 28 May 2013 16:44:14 GMT
384
+ recorded_with: VCR 2.3.0
@@ -21,3 +21,9 @@ Feature: Using Jekyll-s3 as a library
21
21
  When my Jekyll site is in "features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi"
22
22
  Then jekyll-s3 will push my blog to S3 and invalidate the Cloudfront distribution
23
23
  And report that it invalidated 2 Cloudfront item
24
+
25
+ @create-redirect
26
+ Scenario: Developer wants feedback on how many redirects Jekyll-s3 created
27
+ When my Jekyll site is in "features/support/test_site_dirs/create-redirects"
28
+ Then jekyll-s3 will push my blog to S3
29
+ And report that it created 2 new redirects
@@ -0,0 +1,16 @@
1
+ Feature: configure redirects
2
+
3
+ @create-redirect
4
+ Scenario: The user wants to configure new redirects for HTTP resources
5
+ When my Jekyll site is in "features/support/test_site_dirs/create-redirects"
6
+ Then jekyll-s3 will push my blog to S3
7
+ And the output should equal
8
+ """
9
+ Deploying _site/* to jekyll-s3-test.net
10
+ No new or changed files to upload
11
+ Creating new redirects ...
12
+ Redirect welcome.php to /welcome: Success!
13
+ Redirect pets/dogs to /cats-and-dogs/wuf: Success!
14
+ Done! Go visit: http://jekyll-s3-test.net.s3-website-us-east-1.amazonaws.com/index.html
15
+
16
+ """
@@ -31,6 +31,10 @@ Then /^report that it invalidated (\d+) Cloudfront item$/ do |expected|
31
31
  @amount_of_invalidated_items.should == expected.to_i
32
32
  end
33
33
 
34
+ Then /^report that it created (\d+) new redirects$/ do |expected|
35
+ @amount_of_new_redirects.should == expected.to_i
36
+ end
37
+
34
38
  Then /^report that it deleted (\d+) file from S3$/ do |amount_of_deleted_files|
35
39
  @amount_of_deleted_files.should == amount_of_deleted_files.to_i
36
40
  end
@@ -43,6 +47,7 @@ def do_run
43
47
  @amount_of_changed_files = result[:changed_files_count]
44
48
  @amount_of_deleted_files = result[:deleted_files_count]
45
49
  @amount_of_invalidated_items = result[:invalidated_items_count]
50
+ @amount_of_new_redirects = result[:changed_redirects_count]
46
51
  }
47
52
  end
48
53
 
@@ -0,0 +1,6 @@
1
+ s3_id: foo
2
+ s3_secret: foo
3
+ s3_bucket: jekyll-s3-test.net
4
+ redirects:
5
+ welcome.php: welcome
6
+ pets/dogs: cats-and-dogs/wuf
@@ -14,4 +14,5 @@ VCR.cucumber_tags do |t|
14
14
  t.tag '@s3-and-cloudfront'
15
15
  t.tag '@s3-and-cloudfront-when-updating-a-file'
16
16
  t.tag '@one-file-to-delete'
17
+ t.tag '@create-redirect'
17
18
  end
data/jekyll-s3.gemspec CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "jekyll-s3"
6
- s.version = "2.7.0"
6
+ s.version = "2.8.0"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Philippe Creux", "Lauri Lehmijoki"]
9
9
  s.email = ["pcreux@gmail.com", "lauri.lehmijoki@iki.fi"]
data/lib/jekyll-s3/cli.rb CHANGED
@@ -10,15 +10,16 @@ module Jekyll
10
10
  def run(site_dir, in_headless_mode = false)
11
11
  CLI.check_configuration site_dir
12
12
  config = Jekyll::S3::ConfigLoader.load_configuration site_dir
13
- new_files_count, changed_files_count, deleted_files_count, changed_files =
13
+ new_files_count, changed_files_count, deleted_files_count, changed_files, changed_redirects =
14
14
  Uploader.run(site_dir, config, in_headless_mode)
15
15
  invalidated_items_count =
16
- CLI.invalidate_cf_dist_if_configured(config, changed_files)
16
+ CLI.invalidate_cf_dist_if_configured(config, changed_files + changed_redirects)
17
17
  {
18
18
  :new_files_count => new_files_count,
19
19
  :changed_files_count => changed_files_count,
20
20
  :deleted_files_count => deleted_files_count,
21
- :invalidated_items_count => invalidated_items_count
21
+ :invalidated_items_count => invalidated_items_count,
22
+ :changed_redirects_count => changed_redirects.size
22
23
  }
23
24
  rescue JekyllS3Error => e
24
25
  puts e.message
@@ -16,14 +16,18 @@ module Jekyll
16
16
  s3, config, site_dir
17
17
  )
18
18
 
19
+ redirects = config['redirects'] || {}
20
+ changed_redirects = setup_redirects redirects, config, s3
21
+
19
22
  deleted_files_count = remove_superfluous_files(s3, { :s3_bucket => config['s3_bucket'],
20
23
  :site_dir => site_dir,
24
+ :redirects => redirects,
21
25
  :in_headless_mode => in_headless_mode,
22
26
  :ignore_on_server => config["ignore_on_server"] })
23
27
 
24
28
  print_done_report config
25
29
 
26
- [new_files_count, changed_files_count, deleted_files_count, changed_files]
30
+ [new_files_count, changed_files_count, deleted_files_count, changed_files, changed_redirects]
27
31
  end
28
32
 
29
33
  private
@@ -69,16 +73,53 @@ module Jekyll
69
73
  end
70
74
  end
71
75
 
76
+ def self.setup_redirects(redirects, config, s3)
77
+ operations = redirects.map do |path, target|
78
+ setup_redirect(path, target, s3, config)
79
+ end
80
+ performed_operations = operations.reject do |op|
81
+ op == :no_redirect_operation_performed
82
+ end
83
+ unless performed_operations.empty?
84
+ puts 'Creating new redirects ...'
85
+ end
86
+ performed_operations.each do |redirect_operation|
87
+ puts ' ' + redirect_operation[:report]
88
+ end
89
+ performed_operations.map do |redirect_operation|
90
+ redirect_operation[:path]
91
+ end
92
+ end
93
+
94
+ def self.setup_redirect(path, target, s3, config)
95
+ target = '/' + target unless target =~ %r{^(/|https?://)}
96
+ s3_object = s3.buckets[config['s3_bucket']].objects[path]
97
+
98
+ begin
99
+ current_head = s3_object.head
100
+ rescue AWS::S3::Errors::NoSuchKey
101
+ end
102
+
103
+ if current_head.nil? or current_head[:website_redirect_location] != target
104
+ s3_object.write('', :website_redirect_location => target)
105
+ {
106
+ :report => "Redirect #{path} to #{target}: Success!",
107
+ :path => path
108
+ }
109
+ else
110
+ :no_redirect_operation_performed
111
+ end
112
+ end
113
+
72
114
  def self.remove_superfluous_files(s3, options)
73
115
  s3_bucket_name = options.fetch(:s3_bucket)
74
116
  site_dir = options.fetch(:site_dir)
75
117
  in_headless_mode = options.fetch(:in_headless_mode)
76
118
 
77
119
  remote_files = s3.buckets[s3_bucket_name].objects.map { |f| f.key }
78
- local_files = load_all_local_files(site_dir)
120
+ local_files = load_all_local_files(site_dir) + options.fetch(:redirects).keys
79
121
  files_to_delete = build_list_of_files_to_delete(remote_files, local_files, options[:ignore_on_server])
80
122
 
81
-
82
123
  deleted_files_count = 0
83
124
  if in_headless_mode
84
125
  files_to_delete.each { |s3_object_key|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-22 00:00:00.000000000 Z
13
+ date: 2013-05-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws-sdk
@@ -240,6 +240,8 @@ files:
240
240
  - Rakefile
241
241
  - bin/jekyll-s3
242
242
  - changelog.md
243
+ - example-configurations.md
244
+ - features/cassettes/cucumber_tags/create-redirect.yml
243
245
  - features/cassettes/cucumber_tags/new-and-changed-files.yml
244
246
  - features/cassettes/cucumber_tags/new-files-for-sydney.yml
245
247
  - features/cassettes/cucumber_tags/new-files.yml
@@ -252,6 +254,7 @@ files:
252
254
  - features/jekyll-s3-as-library.feature
253
255
  - features/jekyll-s3-cloudfront.feature
254
256
  - features/jekyll-s3-delete.feature
257
+ - features/jekyll-s3-redirects.feature
255
258
  - features/jekyll-s3-upload.feature
256
259
  - features/jekyll-s3-website-performance.feature
257
260
  - features/step_definitions/steps.rb
@@ -262,6 +265,8 @@ files:
262
265
  - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_jekyll_s3.yml
263
266
  - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css
264
267
  - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html
268
+ - features/support/test_site_dirs/create-redirects/_jekyll_s3.yml
269
+ - features/support/test_site_dirs/create-redirects/_site/.gitkeep
265
270
  - features/support/test_site_dirs/index-and-assets.blog.fi/_jekyll_s3.yml
266
271
  - features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif
267
272
  - features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css
@@ -337,7 +342,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
337
342
  version: '0'
338
343
  segments:
339
344
  - 0
340
- hash: 4368343528403061082
345
+ hash: 1250183461535379030
341
346
  required_rubygems_version: !ruby/object:Gem::Requirement
342
347
  none: false
343
348
  requirements:
@@ -346,7 +351,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
346
351
  version: '0'
347
352
  segments:
348
353
  - 0
349
- hash: 4368343528403061082
354
+ hash: 1250183461535379030
350
355
  requirements: []
351
356
  rubyforge_project:
352
357
  rubygems_version: 1.8.25
@@ -354,6 +359,7 @@ signing_key:
354
359
  specification_version: 3
355
360
  summary: Push your Jekyll blog to S3
356
361
  test_files:
362
+ - features/cassettes/cucumber_tags/create-redirect.yml
357
363
  - features/cassettes/cucumber_tags/new-and-changed-files.yml
358
364
  - features/cassettes/cucumber_tags/new-files-for-sydney.yml
359
365
  - features/cassettes/cucumber_tags/new-files.yml
@@ -366,6 +372,7 @@ test_files:
366
372
  - features/jekyll-s3-as-library.feature
367
373
  - features/jekyll-s3-cloudfront.feature
368
374
  - features/jekyll-s3-delete.feature
375
+ - features/jekyll-s3-redirects.feature
369
376
  - features/jekyll-s3-upload.feature
370
377
  - features/jekyll-s3-website-performance.feature
371
378
  - features/step_definitions/steps.rb
@@ -376,6 +383,8 @@ test_files:
376
383
  - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_jekyll_s3.yml
377
384
  - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css
378
385
  - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html
386
+ - features/support/test_site_dirs/create-redirects/_jekyll_s3.yml
387
+ - features/support/test_site_dirs/create-redirects/_site/.gitkeep
379
388
  - features/support/test_site_dirs/index-and-assets.blog.fi/_jekyll_s3.yml
380
389
  - features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif
381
390
  - features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css