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 ADDED
@@ -0,0 +1,12 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ doc
6
+ .yardoc
7
+ pkg
8
+ .idea
9
+ .bundle
10
+ .rvmrc
11
+ perftools
12
+
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in capistrano-clouddeploy.gemspec
4
+ gemspec
5
+
6
+ gem 'amazon-ec2', :git => "git://github.com/rrollins/amazon-ec2.git"
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,12 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+
12
+ task :default => :test
@@ -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,3 @@
1
+ module CapistranoCloudDeploy
2
+ VERSION = "1.0.1"
3
+ end
@@ -0,0 +1 @@
1
+ require 'capistrano-clouddeploy/aws_manager.rb'
@@ -0,0 +1,11 @@
1
+
2
+ blank_environment: #Leave this environment blank
3
+ bucket_name: ''
4
+ access_key_id: ''
5
+ secret_access_key: ''
6
+ region: 'us-east-1'
7
+ test:
8
+ bucket_name: 'dfasfd'
9
+ access_key_id: 'asdfadsf'
10
+ secret_access_key: 'asdfasdf'
11
+ region: 'us-east-1'
@@ -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