capistrano-s3 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +24 -0
- data/README.md +74 -0
- data/Rakefile +1 -0
- data/capistrano-s3.gemspec +21 -0
- data/lib/capistrano-s3.rb +79 -0
- metadata +104 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
LICENSE
|
2
|
+
|
3
|
+
The MIT License
|
4
|
+
|
5
|
+
Copyright (c) 2012-2013 Jean-Philippe Doyle, Hookt Studios inc., Joshua Delsman/miomoba, Inc.
|
6
|
+
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
8
|
+
a copy of this software and associated documentation files (the
|
9
|
+
"Software"), to deal in the Software without restriction, including
|
10
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
11
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
12
|
+
permit persons to whom the Software is furnished to do so, subject to
|
13
|
+
the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be
|
16
|
+
included in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
19
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
20
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
21
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
22
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
23
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
24
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# s3-static-site
|
2
|
+
|
3
|
+
> Allows static websites deployment to Amazon S3 website buckets using Capistrano.
|
4
|
+
|
5
|
+
## Hosting your website with Amazon S3
|
6
|
+
|
7
|
+
S3 provides special website enabled buckets that allows you to deliver website pages directly from S3.
|
8
|
+
The most important difference is that theses buckets serves an index document (ex. index.html) whenever a user specifies the URL for the root of your website, or a subfolder. And you can point your domain name directly to the S3 bucket cname.
|
9
|
+
|
10
|
+
To learn how to setup your website bucket, see [Amazon Documentation](http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?HostingWebsiteQS1.html).
|
11
|
+
|
12
|
+
## Getting started
|
13
|
+
|
14
|
+
Setup capistrano, create a public folder and set your S3 bucket configurations in `deploy.rb`.
|
15
|
+
|
16
|
+
$ capify .
|
17
|
+
$ mkdir public
|
18
|
+
$ touch config/deploy.rb #see config instructions bellow
|
19
|
+
$ cap deploy
|
20
|
+
|
21
|
+
### Configuring deployment
|
22
|
+
|
23
|
+
s3-static-site overrides the default Capistrano recipes for Rails projects with its own simple s3 publishing scripts.
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# config/deploy.rb
|
27
|
+
require 's3-static-site'
|
28
|
+
|
29
|
+
set :bucket, "www.cool-website-bucket.com"
|
30
|
+
set :access_key_id, "CHANGETHIS"
|
31
|
+
set :secret_access_key, "CHANGETHIS"
|
32
|
+
```
|
33
|
+
|
34
|
+
If you want to deploy to multiple buckets, have a look at
|
35
|
+
[Capistrano multistage](https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension)
|
36
|
+
and configure a bucket per stage configuration.
|
37
|
+
|
38
|
+
#### S3 write options
|
39
|
+
|
40
|
+
s3-static-site sets files `:content_type` and `:acl` to `:public_read`, add or override with :
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
set :bucket_write_options, {
|
44
|
+
cache_control: "max-age=94608000, public"
|
45
|
+
}
|
46
|
+
```
|
47
|
+
|
48
|
+
See aws-sdk [S3Object.write doc](http://rubydoc.info/github/amazonwebservices/aws-sdk-for-ruby/master/AWS/S3/S3Object#write-instance_method) for all available options.
|
49
|
+
|
50
|
+
### Advanced static website generation & assets management
|
51
|
+
|
52
|
+
If you wish to manage your assets with a packaging system, a simple way do to it
|
53
|
+
is using a combination of :
|
54
|
+
|
55
|
+
- [Sinatra](https://github.com/sinatra/sinatra) : simple web framework that we extend for our needs
|
56
|
+
- [Sinatra-AssetPack](https://github.com/rstacruz/sinatra-assetpack) : deals with version management for all kind of assets
|
57
|
+
- [Sinatra-Static](https://github.com/paulasmuth/sinatra-static) : generate your complete website in `public/`, allowing an `s3-static-site` deployment
|
58
|
+
|
59
|
+
IMPORTANT : to achieve `Sinatra-AssetPack` and `Sinatra-Static` compatibility, see [pull request #1](https://github.com/paulasmuth/sinatra-static/pull/1)
|
60
|
+
or use [a patched fork](https://github.com/hooktstudios/sinatra-static).
|
61
|
+
|
62
|
+
Once you get this together, add a capistrano task to trigger website generation before deploy :
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
# config/deploy.rb
|
66
|
+
before 'deploy' do
|
67
|
+
run_locally "bundle exec ruby app.rb"
|
68
|
+
run_locally "bundle exec rake assetpack:build"
|
69
|
+
end
|
70
|
+
```
|
71
|
+
|
72
|
+
## Copyright
|
73
|
+
|
74
|
+
Copyright (c) 2012 Josh Delsman & miomoba, Inc. See LICENSE.txt for details.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rake'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.authors = ["Jean-Philippe Doyle","Josh Delsman"]
|
5
|
+
gem.email = ["jeanphilippe.doyle@hooktstudios.com"]
|
6
|
+
gem.description = "Using Ruby and Capistrano, build and deploy a static website to Amazon S3"
|
7
|
+
gem.summary = "Using Ruby and Capistrano, build and deploy a static website to Amazon S3"
|
8
|
+
gem.homepage = "http://github.com/hooktstudios/capistrano-s3"
|
9
|
+
gem.licenses = ["MIT"]
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
12
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
13
|
+
gem.name = "capistrano-s3"
|
14
|
+
gem.require_paths = ["lib"]
|
15
|
+
gem.version = "0.2.1"
|
16
|
+
|
17
|
+
# Gem dependencies
|
18
|
+
gem.add_dependency("aws-sdk")
|
19
|
+
gem.add_dependency("capistrano")
|
20
|
+
gem.add_dependency("mime-types")
|
21
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'aws/s3'
|
2
|
+
require 'mime/types'
|
3
|
+
|
4
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
5
|
+
abort "capistrano-s3 requires Capistrano >= 2."
|
6
|
+
end
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(true).load do
|
9
|
+
def _cset(name, *args, &block)
|
10
|
+
set(name, *args, &block) if !exists?(name)
|
11
|
+
end
|
12
|
+
|
13
|
+
_cset :deployment_path, Dir.pwd.gsub("\n", "") + "/public"
|
14
|
+
|
15
|
+
def base_file_path(file)
|
16
|
+
file.gsub(deployment_path, "")
|
17
|
+
end
|
18
|
+
|
19
|
+
def files
|
20
|
+
Dir.glob("#{deployment_path}/**/*")
|
21
|
+
end
|
22
|
+
|
23
|
+
# Establishes the connection to Amazon S3
|
24
|
+
def establish_connection!
|
25
|
+
# Send logging to STDOUT
|
26
|
+
AWS.config(:logger => Logger.new(STDOUT))
|
27
|
+
|
28
|
+
AWS::S3.new(
|
29
|
+
:access_key_id => access_key_id,
|
30
|
+
:secret_access_key => secret_access_key
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Deployment recipes
|
35
|
+
namespace :deploy do
|
36
|
+
namespace :s3 do
|
37
|
+
desc "Empties bucket of all files. Caution when using this command, as it cannot be undone!"
|
38
|
+
task :empty do
|
39
|
+
_s3 = establish_connection!
|
40
|
+
_s3.buckets[bucket].clear!
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Upload files to the bucket in the current state"
|
44
|
+
task :upload_files do
|
45
|
+
_s3 = establish_connection!
|
46
|
+
|
47
|
+
files.each do |file|
|
48
|
+
if !File.directory?(file)
|
49
|
+
path = base_file_path(file)
|
50
|
+
path.gsub!(/^\//, "") # Remove preceding slash for S3
|
51
|
+
|
52
|
+
contents = case File.extname(path)
|
53
|
+
open(file)
|
54
|
+
|
55
|
+
types = MIME::Types.type_for(File.basename(file))
|
56
|
+
if types.empty?
|
57
|
+
options = {
|
58
|
+
:acl => :public_read
|
59
|
+
}
|
60
|
+
else
|
61
|
+
options = {
|
62
|
+
:acl => :public_read,
|
63
|
+
:content_type => types[0]
|
64
|
+
}
|
65
|
+
end
|
66
|
+
options.merge!(bucket_write_options)
|
67
|
+
_s3.buckets[bucket].objects[path].write(contents, options)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
task :update do
|
74
|
+
s3.upload_files
|
75
|
+
end
|
76
|
+
|
77
|
+
task :restart do; end
|
78
|
+
end
|
79
|
+
end
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-s3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jean-Philippe Doyle
|
9
|
+
- Josh Delsman
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-01-12 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: aws-sdk
|
17
|
+
prerelease: false
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
none: false
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
none: false
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: capistrano
|
33
|
+
prerelease: false
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
none: false
|
40
|
+
type: :runtime
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
none: false
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mime-types
|
49
|
+
prerelease: false
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
none: false
|
56
|
+
type: :runtime
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
none: false
|
63
|
+
description: Using Ruby and Capistrano, build and deploy a static website to Amazon
|
64
|
+
S3
|
65
|
+
email:
|
66
|
+
- jeanphilippe.doyle@hooktstudios.com
|
67
|
+
executables: []
|
68
|
+
extensions: []
|
69
|
+
extra_rdoc_files: []
|
70
|
+
files:
|
71
|
+
- .gitignore
|
72
|
+
- Gemfile
|
73
|
+
- LICENSE.txt
|
74
|
+
- README.md
|
75
|
+
- Rakefile
|
76
|
+
- capistrano-s3.gemspec
|
77
|
+
- lib/capistrano-s3.rb
|
78
|
+
homepage: http://github.com/hooktstudios/capistrano-s3
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
none: false
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
none: false
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 1.8.24
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: Using Ruby and Capistrano, build and deploy a static website to Amazon S3
|
103
|
+
test_files: []
|
104
|
+
has_rdoc:
|