capistrano_s3 0.1.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +12 -4
- data/lib/capistrano/recipes/deploy/strategy/s3_bucket.rb +54 -38
- data/lib/version.rb +3 -3
- data/test/deploy_s3_bucket_test.rb +2 -3
- metadata +19 -21
data/README
CHANGED
@@ -14,18 +14,26 @@ If the tarball is already in S3 (from a previous deployment, say to a staging in
|
|
14
14
|
= Installation
|
15
15
|
gem install capistrano_s3
|
16
16
|
|
17
|
+
= Usage
|
18
|
+
Please read carefully if upgrading from 0.1 as the options have changed.
|
19
|
+
|
17
20
|
To use it, specify properties in <tt>config/deploy.rb</tt>:
|
18
21
|
set :deploy_via, :s3_bucket
|
19
|
-
set :deploy_s3_bucket, 'com.example.releases' # The name of the S3 bucket that should get releases
|
20
22
|
s3_config = YAML::load(ERB.new(IO.read("secret/s3.yml")).result) # Follow this pattern and don't ckin your secrets
|
21
|
-
# s3_config = {
|
23
|
+
# s3_config = {
|
24
|
+
# 'access_key_id' => 'ABCDEFGHIJKLMNOPQRST',
|
25
|
+
# 'secret_access_key' => 'abcdefghijklmnopqrstuvwxyz01234567890ABC' ,
|
26
|
+
# 'bucket_name' => 'com.example.releases' # The name of the S3 bucket that should get releases
|
27
|
+
# }
|
22
28
|
set :s3_config, s3_config
|
23
29
|
|
24
30
|
Now regular capistrano deployment tasks will go through S3
|
25
31
|
|
26
32
|
= About
|
27
33
|
|
28
|
-
|
29
|
-
|
34
|
+
GitHub Project:: http://github.com/Viximo/capistrano-s3
|
35
|
+
Authors::
|
36
|
+
Bill Kirtley - bill.kirtley at [nospam] gmail dt com
|
37
|
+
Matt Griffin - matt@griffinonline.org
|
30
38
|
License:: Distributed under MIT License
|
31
39
|
Copyright:: 2008 Bill Kirtley, Virosity Inc.
|
@@ -1,11 +1,9 @@
|
|
1
1
|
require 'capistrano/recipes/deploy/strategy/copy'
|
2
|
-
require 'fileutils'
|
3
|
-
require 'tempfile' # Dir.tmpdir
|
4
2
|
|
5
3
|
#implementing a capistrano deploy strategy that:
|
6
4
|
# - Expects a deploy_bucket it can read from and write to
|
7
5
|
# - Uses configuration[:s3_config] to find creds
|
8
|
-
# - Names releases {
|
6
|
+
# - Names releases {package_prefix}_{revision}.tgz
|
9
7
|
# - Looks in the bucket for a file with that name - skip to actual deployment if found
|
10
8
|
# - Checks out the specified revision, bundles it up, and pushes to the S3 bucket
|
11
9
|
# - depends on the s3cmd command, perhaps installed with `gem install s3sync`
|
@@ -14,6 +12,9 @@ require 'tempfile' # Dir.tmpdir
|
|
14
12
|
# Distributed via MIT license
|
15
13
|
# Feedback appreciated: bill at [nospam] virosity dt com
|
16
14
|
|
15
|
+
# Note: this fork depends on a commit in this Capistrano fork which has not yet been pulled in
|
16
|
+
# http://github.com/Viximo/capistrano/commit/e9aa71293ae7d4150627891e3633b9e7bfecd437
|
17
|
+
|
17
18
|
module Capistrano
|
18
19
|
module Deploy
|
19
20
|
module Strategy
|
@@ -21,15 +22,15 @@ module Capistrano
|
|
21
22
|
class S3Bucket < Copy
|
22
23
|
|
23
24
|
def deploy!
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
if bucket_includes_package
|
26
|
+
logger.debug "#{package_name} already in bucket #{bucket_name}"
|
27
|
+
distribute!
|
28
|
+
else
|
29
|
+
logger.debug "#{package_name} not found in bucket #{bucket_name} so ckout to add it"
|
30
|
+
super
|
31
|
+
end
|
31
32
|
end
|
32
|
-
|
33
|
+
|
33
34
|
#!! implement me!
|
34
35
|
# Performs a check on the remote hosts to determine whether everything
|
35
36
|
# is setup such that a deploy could succeed.
|
@@ -37,44 +38,59 @@ module Capistrano
|
|
37
38
|
# end
|
38
39
|
|
39
40
|
private
|
41
|
+
def distribute!
|
42
|
+
put_package unless bucket_includes_package
|
43
|
+
run "#{s3cmd} get #{bucket_name}:#{package_name} #{remote_filename}"
|
44
|
+
run "cd #{configuration[:releases_path]} && #{decompress(remote_filename).join(" ")} && rm #{remote_filename}"
|
45
|
+
|
46
|
+
# Archive may have been cached from a previous release so rename the resulting dir
|
47
|
+
run "cd #{configuration[:releases_path]} && mv #{release_name} #{configuration[:release_path]}"
|
48
|
+
logger.debug "done!"
|
49
|
+
end
|
50
|
+
|
40
51
|
def aws_environment
|
41
|
-
@aws_environment ||= "
|
52
|
+
@aws_environment ||= "AWS_ACCESS_KEY_ID=#{configuration[:s3_config]['access_key_id']} AWS_SECRET_ACCESS_KEY=#{configuration[:s3_config]['secret_access_key']}"
|
42
53
|
end
|
54
|
+
|
55
|
+
def s3cmd
|
56
|
+
"env #{aws_environment} s3cmd"
|
57
|
+
end
|
58
|
+
|
43
59
|
# Responsible for ensuring that the package for the current revision is in the bucket
|
44
60
|
def put_package
|
45
|
-
set :release_name, revision
|
46
|
-
logger.debug "#{package_name} already in bucket #{bucket_name}" and return if bucket_includes_package
|
47
|
-
logger.debug "#{package_name} not found in bucket #{bucket_name} so ckout to add it"
|
48
|
-
|
49
|
-
# Do the checkout locally
|
50
|
-
system(command)
|
51
|
-
File.open(File.join(destination, "REVISION"), "w") { |f| f.puts(revision) }
|
52
|
-
|
53
|
-
# Compress it
|
54
|
-
logger.trace "compressing in #{destination}"
|
55
|
-
logger.trace compress('*', package_path).join(" ")
|
56
|
-
|
57
|
-
Dir.chdir(destination) { system(compress('*', package_path).join(" ")) }
|
58
|
-
|
59
|
-
# Put to S3
|
60
61
|
logger.trace "pushing to S3 bucket #{bucket_name} key #{package_name}"
|
61
|
-
system("s3cmd put #{bucket_name}:#{package_name} #{
|
62
|
+
system("#{s3cmd} put #{bucket_name}:#{package_name} #{filename}")
|
62
63
|
end
|
63
64
|
|
64
65
|
def bucket_includes_package
|
65
|
-
|
66
|
+
if @bucket_includes_package.nil?
|
67
|
+
@bucket_includes_package = /#{package_name}/.match(`#{s3cmd} list #{bucket_name}:#{package_name}`)
|
68
|
+
@bucket_includes_package = false if @bucket_includes_package.nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
@bucket_includes_package
|
66
72
|
end
|
67
73
|
|
74
|
+
def release_name
|
75
|
+
"#{configuration[:s3_config]['package_prefix']}_#{revision}"
|
76
|
+
end
|
77
|
+
|
68
78
|
def package_name
|
69
|
-
@package_name ||= "#{
|
79
|
+
@package_name ||= "#{release_name}.#{compression.extension}"
|
70
80
|
end
|
71
81
|
|
72
|
-
|
73
|
-
|
82
|
+
# Copy the checked out project to a directory using the name of the revision, not the release
|
83
|
+
# since the archive will be cached
|
84
|
+
def destination
|
85
|
+
@destination ||= File.join(tmpdir, release_name)
|
86
|
+
end
|
87
|
+
|
88
|
+
def remote_filename
|
89
|
+
@remote_filename ||= @remote_filename ||= File.join(remote_dir, package_name)
|
74
90
|
end
|
75
91
|
|
76
92
|
def bucket_name
|
77
|
-
configuration[:
|
93
|
+
configuration[:s3_config]['bucket_name']
|
78
94
|
end
|
79
95
|
|
80
96
|
def bucket
|
@@ -83,13 +99,13 @@ module Capistrano
|
|
83
99
|
|
84
100
|
def initialize(config={})
|
85
101
|
super(config)
|
86
|
-
|
102
|
+
|
87
103
|
raise "Failed to find :s3_config" unless configuration[:s3_config]
|
88
|
-
|
89
|
-
#
|
90
|
-
configuration[:s3_config]
|
104
|
+
|
105
|
+
# Set defaults
|
106
|
+
configuration[:s3_config]['package_prefix'] ||= 'release'
|
107
|
+
configuration[:s3_config]['bucket_name'] ||= 'capistrano_s3_deploy'
|
91
108
|
end
|
92
|
-
|
93
109
|
end
|
94
110
|
end
|
95
111
|
end
|
data/lib/version.rb
CHANGED
@@ -16,9 +16,8 @@ context "Capistrano::Deploy::Strategy::S3Bucket" do
|
|
16
16
|
:release_path => "/u/apps/test/releases/1234567890",
|
17
17
|
:real_revision => "154",
|
18
18
|
:deploy_s3_bucket => 'com.example.bucket',
|
19
|
-
:s3_config => {'
|
20
|
-
'
|
21
|
-
'AWS_SECRET_ACCESS_KEY' => 'abcdefghijklmnopqrstuvwxyz01234567890ABC' }
|
19
|
+
:s3_config => {'access_key_id' => 'ABCDEFGHIJKLMNOPQRST',
|
20
|
+
'secret_access_key' => 'abcdefghijklmnopqrstuvwxyz01234567890ABC' }
|
22
21
|
}
|
23
22
|
@source = mock("source")
|
24
23
|
@config.stubs(:source).returns(@source)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano_s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 1
|
9
8
|
- 2
|
10
|
-
|
9
|
+
- 1
|
10
|
+
version: 0.2.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Bill Kirtley
|
@@ -16,29 +16,30 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2011-03-30 00:00:00 -04:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
|
-
name: capistrano
|
24
23
|
prerelease: false
|
25
|
-
|
24
|
+
type: :runtime
|
25
|
+
name: capistrano
|
26
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
27
|
none: false
|
27
28
|
requirements:
|
28
29
|
- - ">="
|
29
30
|
- !ruby/object:Gem::Version
|
30
|
-
hash:
|
31
|
+
hash: 51
|
31
32
|
segments:
|
32
33
|
- 2
|
33
|
-
-
|
34
|
-
-
|
35
|
-
version: 2.
|
36
|
-
|
37
|
-
version_requirements: *id001
|
34
|
+
- 5
|
35
|
+
- 20
|
36
|
+
version: 2.5.20
|
37
|
+
requirement: *id001
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
|
-
name: s3sync
|
40
39
|
prerelease: false
|
41
|
-
|
40
|
+
type: :runtime
|
41
|
+
name: s3sync
|
42
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
43
|
none: false
|
43
44
|
requirements:
|
44
45
|
- - ">="
|
@@ -47,12 +48,9 @@ dependencies:
|
|
47
48
|
segments:
|
48
49
|
- 0
|
49
50
|
version: "0"
|
50
|
-
|
51
|
-
version_requirements: *id002
|
51
|
+
requirement: *id002
|
52
52
|
description: A deployment strategy for capistrano using S3
|
53
|
-
email:
|
54
|
-
- bill.kirtley@gmail.com
|
55
|
-
- matt@griffinonline.org
|
53
|
+
email: matt@griffinonline.org
|
56
54
|
executables: []
|
57
55
|
|
58
56
|
extensions: []
|
@@ -67,7 +65,7 @@ files:
|
|
67
65
|
- README
|
68
66
|
- MIT-LICENSE
|
69
67
|
has_rdoc: true
|
70
|
-
homepage: http://github.com/
|
68
|
+
homepage: http://github.com/Viximo/capistrano-s3
|
71
69
|
licenses: []
|
72
70
|
|
73
71
|
post_install_message:
|
@@ -95,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
93
|
version: "0"
|
96
94
|
requirements: []
|
97
95
|
|
98
|
-
rubyforge_project:
|
96
|
+
rubyforge_project:
|
99
97
|
rubygems_version: 1.3.7
|
100
98
|
signing_key:
|
101
99
|
specification_version: 3
|