capistrano-clouddeploy 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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