simple_deploy 0.4.0 → 0.4.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/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ ## v0.4.1:
2
+
3
+ * Added notifier class and campfire notifications
4
+ * Added primary host env to deployment command
5
+ * Upgraded to stackster v0.2.8
6
+
1
7
  ## v0.4.0:
2
8
 
3
9
  * Added support for passing updates with deploy command
data/README.md CHANGED
@@ -27,6 +27,10 @@ environments:
27
27
  access_key: XXX
28
28
  secret_key: yyy
29
29
  region: us-west-1
30
+
31
+ notifications:
32
+ campfire:
33
+ token: XXX
30
34
  ```
31
35
 
32
36
  Configuration File
data/Rakefile CHANGED
@@ -1 +1,10 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ task :default => [:spec]
6
+
7
+ desc 'Run specs'
8
+ RSpec::Core::RakeTask.new do |t|
9
+ t.rspec_opts = %w(-fs --color)
10
+ end
@@ -22,23 +22,29 @@ EOS
22
22
  :default => 'info'
23
23
  opt :name, "Stack name(s) of stack to deploy", :type => :string,
24
24
  :multi => true
25
+ opt :quiet, "Quiet, do not send notifications"
25
26
  end
26
27
 
27
28
  CLI::Shared.valid_options? :provided => opts,
28
29
  :required => [:environment, :name]
29
30
 
30
- config = Config.new.environment opts[:environment]
31
31
  logger = SimpleDeployLogger.new :log_level => opts[:log_level]
32
32
 
33
- attributes = CLI::Shared.parse_attributes :attributes => opts[:attributes],
34
- :logger => logger
33
+ new_attributes = CLI::Shared.parse_attributes :attributes => opts[:attributes],
34
+ :logger => logger
35
35
  opts[:name].each do |name|
36
+ notifier = Notifier.new :stack_name => name,
37
+ :environment => opts[:environment],
38
+ :logger => logger
39
+
36
40
  stack = Stack.new :environment => opts[:environment],
37
41
  :name => name,
38
- :config => config,
39
42
  :logger => logger
40
- stack.update(:attributes => attributes) if attributes.any?
43
+
44
+ stack.update(:attributes => new_attributes) if new_attributes.any?
41
45
  stack.deploy opts[:force]
46
+
47
+ notifier.send_deployment_complete_message unless opts[:quiet]
42
48
  end
43
49
  end
44
50
  end
@@ -22,11 +22,6 @@ module SimpleDeploy
22
22
  def self.start
23
23
  cmd = ARGV.shift
24
24
 
25
- unless cmd
26
- puts "\nPlease specify a command.\n"
27
- exit 1
28
- end
29
-
30
25
  case cmd
31
26
  when 'attributes'
32
27
  CLI::Attributes.new.show
@@ -59,12 +54,13 @@ module SimpleDeploy
59
54
  when 'update'
60
55
  CLI::Update.new.update
61
56
  when '-h'
62
- puts "simple_deploy [attributes|create|destroy|environments|events|instances|list|template|outputs|parameters|resources|ssh|status|update]"
57
+ puts "simple_deploy [attributes|create|destroy|environments|events|instances|list|template|outputs|parameters|resources|ssh|status|update] [options]"
63
58
  puts "Append -h for help on specific subcommand."
64
59
  else
65
60
  puts "Unknown command: '#{cmd}'."
66
- puts "simple_deploy [attributes|create|destroy|environments|events|instances|list|template|outputs|parameters|resources|ssh|status|update]"
61
+ puts "simple_deploy [attributes|create|destroy|environments|events|instances|list|template|outputs|parameters|resources|ssh|status|update] [options]"
67
62
  puts "Append -h for help on specific subcommand."
63
+ exit 1
68
64
  end
69
65
  end
70
66
 
@@ -47,6 +47,10 @@ module SimpleDeploy
47
47
  environments[name]
48
48
  end
49
49
 
50
+ def notifications
51
+ config['notifications']
52
+ end
53
+
50
54
  def region(name)
51
55
  environment(name)['region']
52
56
  end
@@ -1,40 +1,31 @@
1
1
  module SimpleDeploy
2
2
  class SimpleDeployLogger
3
-
3
+
4
+ require 'forwardable'
5
+
6
+ extend Forwardable
7
+
8
+ def_delegators :@logger, :debug, :error, :info, :warn
9
+
4
10
  def initialize(args = {})
5
- @logger = args[:logger] ||= Logger.new(STDOUT)
6
11
  @log_level = args[:log_level] ||= 'info'
12
+ @logger = args[:logger] ||= new_logger(args)
13
+ end
7
14
 
8
- unless args[:logger]
9
- @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
10
- @logger.formatter = proc do |severity, datetime, progname, msg|
11
- "#{datetime}: #{msg}\n"
15
+ private
16
+ def new_logger(args)
17
+ Logger.new(STDOUT).tap do |l|
18
+ l.datetime_format = '%Y-%m-%dT%H:%M:%S%z'
19
+ l.formatter = proc do |severity, datetime, progname, msg|
20
+ "#{datetime} #{severity} : #{msg}\n"
12
21
  end
22
+ l.level = logger_level
13
23
  end
14
-
15
- case @log_level.downcase
16
- when 'info'
17
- @logger.level = Logger::INFO
18
- when 'debug'
19
- @logger.level = Logger::DEBUG
20
- when 'warn'
21
- @logger.level = Logger::WARN
22
- when 'error'
23
- @logger.level = Logger::ERROR
24
- end
25
- @logger
26
24
  end
27
25
 
28
- def debug(msg)
29
- @logger.debug msg
26
+ def logger_level
27
+ Logger.const_get @log_level.upcase
30
28
  end
31
29
 
32
- def info(msg)
33
- @logger.info msg
34
- end
35
-
36
- def error(msg)
37
- @logger.error msg
38
- end
39
30
  end
40
31
  end
@@ -0,0 +1,41 @@
1
+ require 'tinder'
2
+
3
+ module SimpleDeploy
4
+ class Notifier
5
+ class Campfire
6
+
7
+ def initialize(args)
8
+ @stack_name = args[:stack_name]
9
+ @environment = args[:environment]
10
+ @config = args[:config]
11
+ @logger = @config.logger
12
+
13
+ attributes = stack.attributes
14
+ @subdomain = attributes['campfire_subdomain']
15
+ @room_ids = attributes['campfire_room_ids'] ||= ''
16
+ @logger.debug "Campfire subdomain '#{@subdomain}'."
17
+ @logger.debug "Campfire room ids '#{@room_ids}'."
18
+ @token = @config.notifications['campfire']['token']
19
+ @campfire = Tinder::Campfire.new @subdomain, :token => @token
20
+ end
21
+
22
+ def send(message)
23
+ @room_ids.split(',').each do |room_id|
24
+ @logger.debug "Sending notification to Campfire room #{room_id}."
25
+ room = @campfire.find_room_by_id room_id.to_i
26
+ room.speak message
27
+ end
28
+ @logger.debug "Campfire notifications complete."
29
+ end
30
+
31
+ private
32
+
33
+ def stack
34
+ @stack ||= Stackster::Stack.new :environment => @environment,
35
+ :name => @stack_name,
36
+ :config => @config.environment(@environment),
37
+ :logger => @logger
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,50 @@
1
+ require 'simple_deploy/notifier/campfire'
2
+
3
+ module SimpleDeploy
4
+ class Notifier
5
+ def initialize(args)
6
+ @stack_name = args[:stack_name]
7
+ @environment = args[:environment]
8
+ @config = Config.new :logger => args[:logger]
9
+ @logger = @config.logger
10
+ @notifications = @config.notifications
11
+ end
12
+
13
+ def send_deployment_complete_message
14
+ message = "Deployment to #{@stack_name} complete."
15
+ attributes = stack.attributes
16
+
17
+ if attributes['app_github_url']
18
+ message += " App: #{attributes['app_github_url']}/commit/#{attributes['app']}"
19
+ end
20
+
21
+ if attributes['chef_repo_github_url']
22
+ message += " Chef: #{attributes['chef_repo_github_url']}/commit/#{attributes['chef_repo']}"
23
+ end
24
+
25
+ send message
26
+ end
27
+
28
+ def send(message)
29
+ @notifications.keys.each do |notification|
30
+ case notification
31
+ when 'campfire'
32
+ campfire = Notifier::Campfire.new :stack_name => @stack_name,
33
+ :environment => @environment,
34
+ :config => @config
35
+ campfire.send message
36
+ end
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def stack
43
+ @stack ||= Stackster::Stack.new :environment => @environment,
44
+ :name => @stack_name,
45
+ :config => @config.environment(@environment),
46
+ :logger => @logger
47
+ end
48
+
49
+ end
50
+ end
@@ -40,7 +40,7 @@ module SimpleDeploy
40
40
  get_artifact_endpoints.each_pair do |k,v|
41
41
  cmd += "#{k}=#{v} "
42
42
  end
43
- cmd += "PRIMARY=#{primary_instance} "
43
+ cmd += "PRIMARY_HOST=#{primary_instance} "
44
44
  cmd += @deploy_script
45
45
 
46
46
  @logger.info "Executing '#{cmd}.'"
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+
2
3
  module SimpleDeploy
3
4
  class StackReader
4
5
 
@@ -1,3 +1,3 @@
1
1
  module SimpleDeploy
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
data/lib/simple_deploy.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'simple_deploy/config'
2
2
  require 'simple_deploy/artifact'
3
3
  require 'simple_deploy/stack'
4
+ require 'simple_deploy/notifier'
4
5
  require 'simple_deploy/logger'
5
6
  require 'simple_deploy/version'
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_development_dependency "rspec"
22
22
 
23
23
  s.add_runtime_dependency "capistrano"
24
- s.add_runtime_dependency "stackster", '= 0.2.7'
24
+ s.add_runtime_dependency "stackster", '= 0.2.8'
25
+ s.add_runtime_dependency "tinder"
25
26
  s.add_runtime_dependency "trollop"
26
27
  end
data/spec/config_spec.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Config do
3
+ describe SimpleDeploy do
4
4
 
5
5
  it "should create a new config object" do
6
6
  config = SimpleDeploy::Config.new
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+
3
+ describe SimpleDeploy do
4
+
5
+ describe "with all required configurations" do
6
+ before do
7
+ config = { 'campfire' => { 'token' => 'tkn' } }
8
+
9
+ @config_mock = mock 'config mock'
10
+ @stack_mock = mock 'stack'
11
+ @logger_mock = mock 'logger mock'
12
+ @tinder_mock = mock 'tinder'
13
+ @config_mock.should_receive(:logger).and_return @logger_mock
14
+ @config_mock.should_receive(:notifications).and_return config
15
+ @config_mock.should_receive(:environment).and_return 'env_config'
16
+ Stackster::Stack.should_receive(:new).
17
+ with(:environment => 'test',
18
+ :name => 'stack_name',
19
+ :config => 'env_config',
20
+ :logger => @logger_mock).
21
+ and_return @stack_mock
22
+
23
+ Tinder::Campfire.should_receive(:new).
24
+ with('subdom', :token => 'tkn').and_return @tinder_mock
25
+ @stack_mock.should_receive(:attributes).
26
+ and_return( 'campfire_room_ids' => '1,2',
27
+ 'campfire_subdomain' => 'subdom' )
28
+ @logger_mock.should_receive(:debug).
29
+ with "Campfire subdomain 'subdom'."
30
+ @logger_mock.should_receive(:debug).
31
+ with "Campfire room ids '1,2'."
32
+ @campfire = SimpleDeploy::Notifier::Campfire.new :stack_name => 'stack_name',
33
+ :environment => 'test',
34
+ :config => @config_mock
35
+
36
+ end
37
+
38
+ it "should send a message to campfire rooms" do
39
+ room1_mock = mock 'tinder'
40
+ room2_mock = mock 'tinder'
41
+ @tinder_mock.should_receive(:find_room_by_id).with(1).
42
+ and_return room1_mock
43
+ @tinder_mock.should_receive(:find_room_by_id).with(2).
44
+ and_return room2_mock
45
+ @logger_mock.should_receive(:debug).
46
+ with "Sending notification to Campfire room 1."
47
+ @logger_mock.should_receive(:debug).
48
+ with "Sending notification to Campfire room 2."
49
+ @logger_mock.should_receive(:debug).
50
+ with "Campfire notifications complete."
51
+ room1_mock.should_receive(:speak).with :message => "heh you guys!"
52
+ room2_mock.should_receive(:speak).with :message => "heh you guys!"
53
+ @campfire.send(:message => 'heh you guys!')
54
+ end
55
+ end
56
+
57
+ describe "without valid attributes" do
58
+ before do
59
+ config = { 'campfire' => { 'token' => 'tkn' } }
60
+
61
+ @config_mock = mock 'config mock'
62
+ @stack_mock = mock 'stack'
63
+ @logger_mock = mock 'logger mock'
64
+ @tinder_mock = mock 'tinder'
65
+ @config_mock.should_receive(:logger).and_return @logger_mock
66
+ @config_mock.should_receive(:notifications).and_return config
67
+ @config_mock.should_receive(:environment).and_return 'env_config'
68
+ Stackster::Stack.should_receive(:new).
69
+ with(:environment => 'test',
70
+ :name => 'stack_name',
71
+ :config => 'env_config',
72
+ :logger => @logger_mock).
73
+ and_return @stack_mock
74
+
75
+ Tinder::Campfire.should_receive(:new).
76
+ with(nil, :token => 'tkn').and_return @tinder_mock
77
+ @stack_mock.should_receive(:attributes).
78
+ and_return({})
79
+ @logger_mock.should_receive(:debug).
80
+ with "Campfire subdomain ''."
81
+ @logger_mock.should_receive(:debug).
82
+ with "Campfire room ids ''."
83
+ @logger_mock.should_receive(:debug).
84
+ with "Campfire notifications complete."
85
+ @campfire = SimpleDeploy::Notifier::Campfire.new :stack_name => 'stack_name',
86
+ :environment => 'test',
87
+ :config => @config_mock
88
+ end
89
+
90
+ it "should not blow up if campfire_subdom & campfire_room_ids are not present" do
91
+ @campfire.send(:message => 'heh you guys!')
92
+ end
93
+ end
94
+
95
+ end
96
+
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe SimpleDeploy do
4
+
5
+ before do
6
+ @config_mock = mock 'config mock'
7
+ @logger_mock = mock 'logger mock'
8
+ SimpleDeploy::Config.should_receive(:new).
9
+ with(:logger => @logger_mock).
10
+ and_return @config_mock
11
+
12
+ @config_mock.should_receive(:notifications).
13
+ and_return({ 'campfire' => 'settings' })
14
+ @config_mock.should_receive(:logger).
15
+ and_return @logger_mock
16
+ @notifier = SimpleDeploy::Notifier.new :stack_name => 'stack_name',
17
+ :environment => 'test',
18
+ :logger => @logger_mock
19
+ end
20
+
21
+ it "should include the github app & chef links if attributes present" do
22
+ stack_mock = mock 'stack'
23
+ campfire_mock = mock 'campfire mock'
24
+ environment_mock = mock 'environment mock'
25
+ @config_mock.should_receive(:environment).
26
+ with('test').
27
+ and_return environment_mock
28
+ Stackster::Stack.should_receive(:new).
29
+ with(:environment => 'test',
30
+ :name => 'stack_name',
31
+ :config => environment_mock,
32
+ :logger => @logger_mock).
33
+ and_return stack_mock
34
+ stack_mock.should_receive(:attributes).
35
+ and_return({ 'app_github_url' => 'http://github.com/user/app',
36
+ 'chef_repo_github_url' => 'http://github.com/user/chef_repo',
37
+ 'app' => 'appsha',
38
+ 'chef_repo' => 'chefsha' })
39
+ SimpleDeploy::Notifier::Campfire.should_receive(:new).
40
+ and_return campfire_mock
41
+ campfire_mock.should_receive(:send).
42
+ with "Deployment to stack_name complete. App: http://github.com/user/app/commit/appsha Chef: http://github.com/user/chef_repo/commit/chefsha"
43
+ @notifier.send_deployment_complete_message
44
+ end
45
+
46
+ it "should send a message to each listed notification endpoint" do
47
+ campfire_mock = mock 'campfire mock'
48
+ SimpleDeploy::Notifier::Campfire.should_receive(:new).
49
+ with(:environment => 'test',
50
+ :stack_name => 'stack_name',
51
+ :config => @config_mock).
52
+ and_return campfire_mock
53
+ campfire_mock.should_receive(:send).with 'heh you guys!'
54
+ @notifier.send 'heh you guys!'
55
+ end
56
+
57
+ end
58
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-19 00:00:00.000000000 Z
12
+ date: 2012-07-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70136111742480 !ruby/object:Gem::Requirement
16
+ requirement: &70145775467200 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70136111742480
24
+ version_requirements: *70145775467200
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: capistrano
27
- requirement: &70136111740700 !ruby/object:Gem::Requirement
27
+ requirement: &70145775465720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,21 +32,32 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70136111740700
35
+ version_requirements: *70145775465720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: stackster
38
- requirement: &70136111738160 !ruby/object:Gem::Requirement
38
+ requirement: &70145775463980 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - =
42
42
  - !ruby/object:Gem::Version
43
- version: 0.2.7
43
+ version: 0.2.8
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70136111738160
46
+ version_requirements: *70145775463980
47
+ - !ruby/object:Gem::Dependency
48
+ name: tinder
49
+ requirement: &70145775444140 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70145775444140
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: trollop
49
- requirement: &70136111737680 !ruby/object:Gem::Requirement
60
+ requirement: &70145775441180 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,7 +65,7 @@ dependencies:
54
65
  version: '0'
55
66
  type: :runtime
56
67
  prerelease: false
57
- version_requirements: *70136111737680
68
+ version_requirements: *70145775441180
58
69
  description: I am designed to deploy artifacts uploaded by Heirloom
59
70
  email:
60
71
  - brett@weav.net
@@ -91,6 +102,8 @@ files:
91
102
  - lib/simple_deploy/cli/update.rb
92
103
  - lib/simple_deploy/config.rb
93
104
  - lib/simple_deploy/logger.rb
105
+ - lib/simple_deploy/notifier.rb
106
+ - lib/simple_deploy/notifier/campfire.rb
94
107
  - lib/simple_deploy/stack.rb
95
108
  - lib/simple_deploy/stack/deployment.rb
96
109
  - lib/simple_deploy/stack/stack_attribute_formater.rb
@@ -100,6 +113,8 @@ files:
100
113
  - script/ci_setup
101
114
  - simple_deploy.gemspec
102
115
  - spec/config_spec.rb
116
+ - spec/notifier/campfire_spec.rb
117
+ - spec/notifier_spec.rb
103
118
  - spec/spec_helper.rb
104
119
  homepage: ''
105
120
  licenses: []
@@ -115,7 +130,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
130
  version: '0'
116
131
  segments:
117
132
  - 0
118
- hash: 2716701710085273471
133
+ hash: 3053773763840016870
119
134
  required_rubygems_version: !ruby/object:Gem::Requirement
120
135
  none: false
121
136
  requirements:
@@ -124,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
139
  version: '0'
125
140
  segments:
126
141
  - 0
127
- hash: 2716701710085273471
142
+ hash: 3053773763840016870
128
143
  requirements: []
129
144
  rubyforge_project: simple_deploy
130
145
  rubygems_version: 1.8.16
@@ -133,4 +148,6 @@ specification_version: 3
133
148
  summary: I help with deployments
134
149
  test_files:
135
150
  - spec/config_spec.rb
151
+ - spec/notifier/campfire_spec.rb
152
+ - spec/notifier_spec.rb
136
153
  - spec/spec_helper.rb