capistrano-clouddeploy 1.0.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 +12 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +102 -0
- data/Rakefile +12 -0
- data/capistrano-clouddeploy.gemspec +28 -0
- data/lib/capistrano-clouddeploy/aws_manager.rb +145 -0
- data/lib/capistrano-clouddeploy/cap_tasks.rb +79 -0
- data/lib/capistrano-clouddeploy/version.rb +3 -0
- data/lib/capistrano-clouddeploy.rb +1 -0
- data/test/amazon_ec2.yml +11 -0
- data/test/test_helper.rb +19 -0
- data/test/test_me.rb +100 -0
- metadata +176 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Royce Rollins
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# Capistrano::Clouddeploy
|
2
|
+
|
3
|
+
Use Capistrano Cloud Deploy Gem to deploy your Amazon EC2 instances.
|
4
|
+
Tag your instances with the the roles they get then on deployment Capistrano Cloud Deploy can
|
5
|
+
figure out the roles and load into the capistrano configuration.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'capistrano-clouddeploy'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install capistrano-clouddeploy
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
Within deploy.rb or whatever multistage cap config file place:
|
23
|
+
|
24
|
+
require 'capistrano-clouddeploy'
|
25
|
+
cloud_config_roles = []
|
26
|
+
cloud_required_roles = [ :app, :db, :web ]
|
27
|
+
stage = <STAGE>
|
28
|
+
configuration = YAML.load(File.open(File.dirname(__FILE__) + "/amazon_ec2.yml"))[stage]
|
29
|
+
set :deploy_manager, CapistranoCloudDeploy::AWSManager.new(self, application, stage, configuration)
|
30
|
+
deploy_manager.set_cap_roles cloud_required_roles, cloud_config_roles
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
To List Roles:
|
35
|
+
bundle exec cap deploy:list_roles
|
36
|
+
|
37
|
+
You'll see output similar to the following:
|
38
|
+
|
39
|
+
* executing `deploy:list_roles'
|
40
|
+
** ROLES:
|
41
|
+
**
|
42
|
+
** role: web
|
43
|
+
** ec2-23-**-27-232.compute-1.amazonaws.com
|
44
|
+
**
|
45
|
+
** role: db
|
46
|
+
** ec2-23-**-27-232.compute-1.amazonaws.com
|
47
|
+
**
|
48
|
+
** role: app
|
49
|
+
** ec2-23-**-27-232.compute-1.amazonaws.com
|
50
|
+
|
51
|
+
|
52
|
+
or if you're using multistage-ext you can type
|
53
|
+
|
54
|
+
bundle exec cap <STAGE> deploy:list_roles
|
55
|
+
|
56
|
+
|
57
|
+
Cloud deploy will use either the public dns or fall back to
|
58
|
+
elastic ip address of an ec2 instance
|
59
|
+
|
60
|
+
|
61
|
+
To get last deployed tag:
|
62
|
+
bundle exec cap deploy:last_deploy_tag
|
63
|
+
|
64
|
+
You'll see output similar to the following:
|
65
|
+
|
66
|
+
* executing `production_ec2'
|
67
|
+
triggering start callbacks for `deploy:last_deploy_tag'
|
68
|
+
* executing `multistage:ensure'
|
69
|
+
* executing `deploy:last_deploy_tag'
|
70
|
+
** last deploy tag: 1.0
|
71
|
+
|
72
|
+
|
73
|
+
or if you're using multistage-ext you can type
|
74
|
+
|
75
|
+
bundle exec cap <STAGE> deploy:last_deploy_tag
|
76
|
+
|
77
|
+
|
78
|
+
Tag Machines in Amazon with the following: (Name and Value)
|
79
|
+
|
80
|
+
<APP_NAME_AS_DEFINED_IN_CAPISTRANO>/enabled (true | false)
|
81
|
+
If set to false capistrano will ignore
|
82
|
+
|
83
|
+
|
84
|
+
<APP_NAME_AS_DEFINED_IN_CAPISTRANO>/multistage/environment (<STAGE_NAME>)
|
85
|
+
Stage is the stage that this instance applies to
|
86
|
+
|
87
|
+
|
88
|
+
<APP_NAME_AS_DEFINED_IN_CAPISTRANO>/capistrano/roles (web,db,app, ROLE, ...)
|
89
|
+
<APP_NAME_AS_DEFINED_IN_CAPISTRANO>/capistrano/roles is a comma separated list of roles that the machine has
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
## Contributing
|
94
|
+
|
95
|
+
1. Fork it
|
96
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
97
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
98
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
99
|
+
5. Create new Pull Request
|
100
|
+
|
101
|
+
|
102
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/capistrano-clouddeploy/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "capistrano-clouddeploy"
|
6
|
+
gem.version = CapistranoCloudDeploy::VERSION
|
7
|
+
gem.authors = ["Masahji Stewart", "Royce Rollins"]
|
8
|
+
gem.email = ["masahji@synctree.com", "royce@synctree.com"]
|
9
|
+
gem.homepage = "http://github.com/synctree/capistrano-clouddeploy"
|
10
|
+
gem.summary = "Cloud Deployment and configuration for Amazon EC2"
|
11
|
+
gem.description = "A Ruby library for capturing deployment configuration info from ec2 and future cloud services"
|
12
|
+
|
13
|
+
gem.add_development_dependency('mocha', '>= 0.9.9')
|
14
|
+
gem.add_development_dependency('test-unit', '>= 2.1.2')
|
15
|
+
gem.add_development_dependency('test-spec', '>= 0.10.0')
|
16
|
+
gem.add_development_dependency('ruby-debug19', '>= 0.11.6')
|
17
|
+
|
18
|
+
gem.add_dependency(%q<capistrano>)
|
19
|
+
gem.add_dependency(%q<aws-s3>)
|
20
|
+
gem.add_dependency(%q<amazon-ec2>)
|
21
|
+
|
22
|
+
|
23
|
+
gem.files = `git ls-files`.split($\)
|
24
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
25
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
26
|
+
gem.require_paths = ["lib"]
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'AWS'
|
2
|
+
require 'aws/s3'
|
3
|
+
|
4
|
+
module CapistranoCloudDeploy
|
5
|
+
class AWSManager
|
6
|
+
def initialize(cap, application, stage, aws_config )
|
7
|
+
@application = application
|
8
|
+
@stage = stage
|
9
|
+
@deploy_config_bucket = aws_config['deploy_config_bucket']
|
10
|
+
|
11
|
+
@aws_opts = {
|
12
|
+
:access_key_id => aws_config['access_key_id'] || ENV['AWS_ACCESS_KEY_ID'],
|
13
|
+
:secret_access_key => aws_config['secret_access_key'] || ENV['AWS_SECRET_ACCESS_KEY'],
|
14
|
+
:server => (
|
15
|
+
aws_config['server'] || "#{aws_config['region']}.ec2.amazonaws.com"
|
16
|
+
)
|
17
|
+
}
|
18
|
+
|
19
|
+
@ec2 = AWS::EC2::Base.new(@aws_opts)
|
20
|
+
#@as = AWS::Autoscaling::Base.new(@aws_opts) #future support for autoscaling
|
21
|
+
@cap = cap
|
22
|
+
end
|
23
|
+
|
24
|
+
def record_build(branch)
|
25
|
+
s3put("#{@application}/#{@stage}/latest-build", branch, @deploy_config_bucket)
|
26
|
+
end
|
27
|
+
|
28
|
+
def retrieve_build
|
29
|
+
begin
|
30
|
+
s3get("#{@application}/#{@stage}/latest-build", @deploy_config_bucket).value
|
31
|
+
rescue AWS::S3::NoSuchKey
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def each_role
|
38
|
+
roles = {}
|
39
|
+
|
40
|
+
@ec2.describe_instances['reservationSet']['item'].each do |reservation_set|
|
41
|
+
reservation_set['instancesSet']['item'].each do |instance|
|
42
|
+
tags = instance['tagSet'] && instance['tagSet']['item'].kind_of?(Array) ?
|
43
|
+
Hash[instance['tagSet']['item'].collect { |i| [i['key'],i['value'] ]}] : {}
|
44
|
+
|
45
|
+
# if we don't have an application tag then we will pull the application tag
|
46
|
+
# information from user-data if there is anything
|
47
|
+
if tags["#{@application}/enabled"].nil?
|
48
|
+
user_data = @ec2.describe_instance_attribute(
|
49
|
+
:instance_id => instance['instanceId'],
|
50
|
+
:attribute => 'userData'
|
51
|
+
)['userData']
|
52
|
+
|
53
|
+
begin
|
54
|
+
if user_data and user_data['value']
|
55
|
+
tags.update(YAML.load Base64.decode64(user_data['value']))
|
56
|
+
end
|
57
|
+
rescue Exception => ex
|
58
|
+
STDERR.puts("#{ex}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
next unless tags["#{@application}/enabled"] == "true" &&
|
63
|
+
tags["#{@application}/multistage/environment"] == @stage.to_s
|
64
|
+
|
65
|
+
instance_roles = (tags["#{@application}/capistrano/roles"] || "").split(/[,\|]/)
|
66
|
+
instance_roles.each do |role_name| roles[role_name] ||= []
|
67
|
+
roles[role_name].push(instance)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
roles.each_pair do |role_name, instances|
|
73
|
+
role_name = role_name.to_sym
|
74
|
+
yield(role_name, instances)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def s3put(dest, string_or_stream, bucket,
|
81
|
+
options = { :access => :public_read })
|
82
|
+
# Copy this file to S3
|
83
|
+
AWS::S3::Base.establish_connection!(
|
84
|
+
:access_key_id => @aws_opts[:access_key_id],
|
85
|
+
:secret_access_key => @aws_opts[:secret_access_key]
|
86
|
+
)
|
87
|
+
|
88
|
+
AWS::S3::S3Object.store(dest, string_or_stream, bucket, options)
|
89
|
+
end
|
90
|
+
|
91
|
+
def s3get(path, bucket)
|
92
|
+
AWS::S3::Base.establish_connection!(
|
93
|
+
:access_key_id => @aws_opts[:access_key_id],
|
94
|
+
:secret_access_key => @aws_opts[:secret_access_key]
|
95
|
+
)
|
96
|
+
|
97
|
+
AWS::S3::S3Object.find(path, bucket)
|
98
|
+
end
|
99
|
+
|
100
|
+
def public_address(instance)
|
101
|
+
return instance['vpcId'] ? instance['privateIpAddress'] : (
|
102
|
+
instance['dnsName'] || instance['ipAddress']
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
def set_cap_roles(required_roles = [], config_roles = [])
|
107
|
+
each_role do |role_name, instances|
|
108
|
+
if config_roles.include?(role_name)
|
109
|
+
@cap.set role_name, instances.first['privateDnsName']
|
110
|
+
elsif role_name == :db
|
111
|
+
if instances.size == 1
|
112
|
+
#use public dns or elastic ip address
|
113
|
+
public_addy = public_address(instances.first)
|
114
|
+
@cap.role role_name, public_addy, :primary => true
|
115
|
+
else
|
116
|
+
raise "You have more than one machine set to the db role:\n #{
|
117
|
+
instances.delete_if { |i| public_address(i).nil? }.
|
118
|
+
collect { |i| public_address(i) }.
|
119
|
+
join(",")
|
120
|
+
}\nand we don't know which one is primary"
|
121
|
+
end
|
122
|
+
else
|
123
|
+
@cap.role role_name do
|
124
|
+
instances.delete_if { |i| public_address(i).nil? }.
|
125
|
+
collect { |i| public_address(i) }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
config_roles.each do |role_name|
|
131
|
+
@cap.set role_name, nil unless @cap.respond_to?(role_name)
|
132
|
+
end
|
133
|
+
required_roles.each do |role_name|
|
134
|
+
if @cap.role(role_name).size == 0
|
135
|
+
@cap.role role_name do [] end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/aws_manager'
|
2
|
+
|
3
|
+
configuration = Capistrano::Configuration.respond_to?(:instance) ?
|
4
|
+
Capistrano::Configuration.instance(:must_exist) : Capistrano.configuration(:must_exist)
|
5
|
+
|
6
|
+
configuration.load do
|
7
|
+
namespace :deploy do
|
8
|
+
|
9
|
+
task :list_roles do
|
10
|
+
|
11
|
+
#TODO: auto discovery of roles
|
12
|
+
#
|
13
|
+
logger.info "ROLES:"
|
14
|
+
roles.keys.each do |role|
|
15
|
+
logger.info "\nrole: #{role}"
|
16
|
+
find_servers(:roles => role).each do |s|
|
17
|
+
logger.info "\t#{s}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
task :record_build, :roles => [:manager] do
|
23
|
+
if !respond_to?(:bootstrapping) && deploy_manager
|
24
|
+
deploy_manager.record_build(branch)
|
25
|
+
logger.info("recording #{branch}\n")
|
26
|
+
else
|
27
|
+
logger.info("bootstrapping so skipping record_build\n")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :last_deploy_tag, :roles => [:manager] do
|
32
|
+
if !respond_to?(:bootstrapping) && deploy_manager
|
33
|
+
t = deploy_manager.retrieve_build
|
34
|
+
if t
|
35
|
+
logger.info("last deploy tag: #{t}\n")
|
36
|
+
else
|
37
|
+
logger.info("last deploy tag not set\n")
|
38
|
+
end
|
39
|
+
else
|
40
|
+
logger.info("bootstrapping or deploy manager not set")
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
task :bootstrap do
|
46
|
+
set :bootstrapping, true
|
47
|
+
set :bootstrap, true
|
48
|
+
stop
|
49
|
+
cold
|
50
|
+
nginx.restart
|
51
|
+
cleanup
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
set :bootstrapping, bootstrap if respond_to?(:bootstrap)
|
57
|
+
after "deploy:symlink", "deploy:record_build"
|
58
|
+
|
59
|
+
set :branch do
|
60
|
+
default_tag = deploy_manager.retrieve_build if deploy_manager
|
61
|
+
if respond_to?(:deploy_tag)
|
62
|
+
tag = deploy_tag
|
63
|
+
|
64
|
+
elsif respond_to?(:bootstrap) && default_tag
|
65
|
+
tag = default_tag
|
66
|
+
|
67
|
+
else
|
68
|
+
default_tag ||= `git tag`.split("\n").last
|
69
|
+
|
70
|
+
tag = Capistrano::CLI.ui.ask "Tag to deploy (make sure to push the tag first): [#{default_tag}] "
|
71
|
+
tag = default_tag if tag.empty?
|
72
|
+
end
|
73
|
+
logger.info("branch is #{tag}")
|
74
|
+
tag
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'capistrano-clouddeploy/aws_manager.rb'
|
data/test/amazon_ec2.yml
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require "bundler/setup"
|
3
|
+
#require 'bundler'
|
4
|
+
#Bundler.setup
|
5
|
+
gem 'test-unit'
|
6
|
+
|
7
|
+
%w[ test/unit test/spec mocha ].each { |f|
|
8
|
+
begin
|
9
|
+
require f
|
10
|
+
rescue LoadError
|
11
|
+
abort "Unable to load required gem for test: #{f}"
|
12
|
+
end
|
13
|
+
}
|
14
|
+
|
15
|
+
require File.dirname(__FILE__) + '/../lib/capistrano-clouddeploy/aws_manager'
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
data/test/test_me.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
describe 'Cloud Deploy' do
|
4
|
+
|
5
|
+
setup do
|
6
|
+
|
7
|
+
#mock capistrano
|
8
|
+
@cap = mock()
|
9
|
+
@cap.stubs(:set)
|
10
|
+
@cap.stubs(:role)
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
#Config File
|
15
|
+
@aws_config = YAML.load(File.open(File.dirname(__FILE__) + "/amazon_ec2.yml"))['test']
|
16
|
+
|
17
|
+
@application = "capistrano_test_app"
|
18
|
+
@stage = "test"
|
19
|
+
@deploy_manager = CapistranoCloudDeploy::AWSManager.new(@cap, @application, @stage, @aws_config)
|
20
|
+
end
|
21
|
+
|
22
|
+
specify "throws error if not in config file" do
|
23
|
+
aws_config = YAML.load(File.open(File.dirname(__FILE__) + "/amazon_ec2.yml"))['blank_environment']
|
24
|
+
assert_raise do
|
25
|
+
CapistranoCloudDeploy::AWSManager.new(@cap, @application, @stage, aws_config)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
describe 'configuring environment' do
|
31
|
+
|
32
|
+
setup do
|
33
|
+
#mock amazon response
|
34
|
+
@amazon_response = { 'reservationSet' => {
|
35
|
+
'item' => [
|
36
|
+
{ 'instancesSet' => {
|
37
|
+
'item' => [
|
38
|
+
{ 'tagSet' => {
|
39
|
+
'item' => [
|
40
|
+
{'key' => "#{@application}/enabled", 'value' => "true"},
|
41
|
+
{'key' => "#{@application}/multistage/environment",
|
42
|
+
'value' => @stage
|
43
|
+
},
|
44
|
+
{'key' => "#{@application}/capistrano/roles",
|
45
|
+
'value' => "web"
|
46
|
+
}
|
47
|
+
]
|
48
|
+
},
|
49
|
+
"dnsName" => "web.localhost"
|
50
|
+
},
|
51
|
+
{ 'tagSet' => {
|
52
|
+
'item' => [
|
53
|
+
{'key' => "#{@application}/enabled", 'value' => "true"},
|
54
|
+
{'key' => "#{@application}/multistage/environment",
|
55
|
+
'value' => @stage
|
56
|
+
},
|
57
|
+
{'key' => "#{@application}/capistrano/roles",
|
58
|
+
'value' => "db"
|
59
|
+
}
|
60
|
+
]
|
61
|
+
},
|
62
|
+
"dnsName" => "db.localhost"
|
63
|
+
}
|
64
|
+
|
65
|
+
]
|
66
|
+
}
|
67
|
+
}
|
68
|
+
]
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
it "should be able to get env info" do
|
78
|
+
required_roles = [:web]
|
79
|
+
config_roles = [];
|
80
|
+
AWS::EC2::Base.any_instance.stubs(:describe_instances).returns(@amazon_response)
|
81
|
+
|
82
|
+
@cap.expects(:role).returns(["", ""])
|
83
|
+
@cap.expects(:role).with(:web)
|
84
|
+
@cap.expects(:role).with(:db)
|
85
|
+
|
86
|
+
@deploy_manager = CapistranoCloudDeploy::AWSManager.new(@cap, @application, @stage, @aws_config)
|
87
|
+
|
88
|
+
@deploy_manager.set_cap_roles required_roles, config_roles
|
89
|
+
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
#functional test
|
94
|
+
#test it hits amazon and gets the key info
|
95
|
+
#mock out ec2 and cap on manager
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-clouddeploy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Masahji Stewart
|
9
|
+
- Royce Rollins
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mocha
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.9.9
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 0.9.9
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: test-unit
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 2.1.2
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.1.2
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: test-spec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.10.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.10.0
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: ruby-debug19
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.11.6
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 0.11.6
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: capistrano
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :runtime
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: aws-s3
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: amazon-ec2
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
description: A Ruby library for capturing deployment configuration info from ec2 and
|
128
|
+
future cloud services
|
129
|
+
email:
|
130
|
+
- masahji@synctree.com
|
131
|
+
- royce@synctree.com
|
132
|
+
executables: []
|
133
|
+
extensions: []
|
134
|
+
extra_rdoc_files: []
|
135
|
+
files:
|
136
|
+
- .gitignore
|
137
|
+
- Gemfile
|
138
|
+
- LICENSE
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- capistrano-clouddeploy.gemspec
|
142
|
+
- lib/capistrano-clouddeploy.rb
|
143
|
+
- lib/capistrano-clouddeploy/aws_manager.rb
|
144
|
+
- lib/capistrano-clouddeploy/cap_tasks.rb
|
145
|
+
- lib/capistrano-clouddeploy/version.rb
|
146
|
+
- test/amazon_ec2.yml
|
147
|
+
- test/test_helper.rb
|
148
|
+
- test/test_me.rb
|
149
|
+
homepage: http://github.com/synctree/capistrano-clouddeploy
|
150
|
+
licenses: []
|
151
|
+
post_install_message:
|
152
|
+
rdoc_options: []
|
153
|
+
require_paths:
|
154
|
+
- lib
|
155
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
requirements: []
|
168
|
+
rubyforge_project:
|
169
|
+
rubygems_version: 1.8.23
|
170
|
+
signing_key:
|
171
|
+
specification_version: 3
|
172
|
+
summary: Cloud Deployment and configuration for Amazon EC2
|
173
|
+
test_files:
|
174
|
+
- test/amazon_ec2.yml
|
175
|
+
- test/test_helper.rb
|
176
|
+
- test/test_me.rb
|