simple_deploy 0.4.0 → 0.4.1

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