ey-deploy 0.7.1 → 0.8.0

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.
@@ -10,36 +10,41 @@ module EY
10
10
  exit(1)
11
11
  end
12
12
 
13
- method_option :migrate, :type => :string,
14
- :desc => "Run migrations with this deploy",
15
- :aliases => ["-m"]
13
+ method_option :migrate, :type => :string,
14
+ :desc => "Run migrations with this deploy",
15
+ :aliases => ["-m"]
16
16
 
17
- method_option :branch, :type => :string,
18
- :desc => "Branch to deploy from, defaults to master",
19
- :aliases => ["-b"]
17
+ method_option :branch, :type => :string,
18
+ :desc => "Branch to deploy from, defaults to master",
19
+ :aliases => ["-b"]
20
20
 
21
- method_option :repo, :type => :string,
22
- :desc => "Remote repo to deploy",
23
- :aliases => ["-r"]
21
+ method_option :repo, :type => :string,
22
+ :desc => "Remote repo to deploy",
23
+ :aliases => ["-r"]
24
24
 
25
- method_option :app, :type => :string,
26
- :required => true,
27
- :desc => "Application to deploy",
28
- :aliases => ["-a"]
25
+ method_option :app, :type => :string,
26
+ :required => true,
27
+ :desc => "Application to deploy",
28
+ :aliases => ["-a"]
29
29
 
30
- method_option :config, :type => :string,
31
- :desc => "Additional configuration"
30
+ method_option :framework_env, :type => :string,
31
+ :required => true,
32
+ :desc => "Ruby web framework environment",
33
+ :aliases => ["-e"]
32
34
 
33
- method_option :stack, :type => :string,
34
- :desc => "Web stack (so we can restart it correctly)"
35
+ method_option :config, :type => :string,
36
+ :desc => "Additional configuration"
35
37
 
36
- method_option :instances, :type => :array,
37
- :desc => "Instances in cluster"
38
+ method_option :stack, :type => :string,
39
+ :desc => "Web stack (so we can restart it correctly)"
38
40
 
39
- method_option :verbose, :type => :boolean,
40
- :default => false,
41
- :desc => "Verbose output",
42
- :aliases => ["-v"]
41
+ method_option :instances, :type => :array,
42
+ :desc => "Instances in cluster"
43
+
44
+ method_option :verbose, :type => :boolean,
45
+ :default => false,
46
+ :desc => "Verbose output",
47
+ :aliases => ["-v"]
43
48
 
44
49
  desc "deploy", "Deploy code from /data/<app>"
45
50
  def deploy(default_task=:deploy)
@@ -51,20 +56,25 @@ module EY
51
56
  EY::Deploy.run(options.merge("default_task" => default_task))
52
57
  end
53
58
 
54
- method_option :app, :type => :string,
55
- :required => true,
56
- :desc => "Which application's hooks to run",
57
- :aliases => ["-a"]
59
+ method_option :app, :type => :string,
60
+ :required => true,
61
+ :desc => "Which application's hooks to run",
62
+ :aliases => ["-a"]
63
+
64
+ method_option :release_path, :type => :string,
65
+ :desc => "Value for #release_path in hooks (mostly for internal coordination)",
66
+ :aliases => ["-r"]
58
67
 
59
- method_option :release_path, :type => :string,
60
- :desc => "Value for #release_path in hooks (mostly for internal coordination)",
61
- :aliases => ["-r"]
68
+ method_option :current_role, :type => :string,
69
+ :desc => "Value for #current_role in hooks"
62
70
 
63
- method_option :current_role, :type => :string,
64
- :desc => "Value for #current_role in hooks"
71
+ method_option :framework_env, :type => :string,
72
+ :required => true,
73
+ :desc => "Ruby web framework environment",
74
+ :aliases => ["-e"]
65
75
 
66
- method_option :current_name, :type => :string,
67
- :desc => "Value for #current_name in hooks"
76
+ method_option :current_name, :type => :string,
77
+ :desc => "Value for #current_name in hooks"
68
78
 
69
79
  desc "hook [NAME]", "Run a particular deploy hook"
70
80
  def hook(hook_name)
@@ -83,7 +83,7 @@ module EY
83
83
  end
84
84
 
85
85
  def environment
86
- node['environment']['framework_env']
86
+ configuration['framework_env']
87
87
  end
88
88
 
89
89
  def latest_release
@@ -6,13 +6,15 @@ require 'yaml'
6
6
 
7
7
  module EY
8
8
  class DeployBase < Task
9
+ include LoggedOutput
10
+
9
11
  # default task
10
12
  def deploy
11
13
  update_repository_cache
12
14
  require_custom_tasks
13
15
  push_code
14
16
 
15
- puts "~> Starting full deploy"
17
+ info "~> Starting full deploy"
16
18
  copy_repository_cache
17
19
 
18
20
  with_failed_release_cleanup do
@@ -31,7 +33,7 @@ module EY
31
33
 
32
34
  cleanup_old_releases
33
35
 
34
- puts "~> Finalizing deploy"
36
+ info "~> Finalizing deploy"
35
37
  rescue Exception
36
38
  puts_deploy_failure
37
39
  raise
@@ -86,7 +88,7 @@ module EY
86
88
 
87
89
  # task
88
90
  def push_code
89
- puts "~> Pushing code to all servers"
91
+ info "~> Pushing code to all servers"
90
92
  barrier *(EY::Server.all.map do |server|
91
93
  need_later { server.push_code }
92
94
  end)
@@ -95,7 +97,7 @@ module EY
95
97
  # task
96
98
  def restart
97
99
  @restart_failed = true
98
- puts "~> Restarting app servers"
100
+ info "~> Restarting app servers"
99
101
  roles :app_master, :app, :solo do
100
102
  restart_command = case c.stack
101
103
  when "nginx_unicorn"
@@ -117,7 +119,7 @@ module EY
117
119
  # task
118
120
  def bundle
119
121
  if File.exist?("#{c.latest_release}/Gemfile")
120
- puts "~> Gemfile detected, bundling gems"
122
+ info "~> Gemfile detected, bundling gems"
121
123
  lockfile = File.join(c.latest_release, "Gemfile.lock")
122
124
 
123
125
  bundler_version = if File.exist?(lockfile)
@@ -136,7 +138,7 @@ module EY
136
138
  # task
137
139
  def cleanup_old_releases
138
140
  @cleanup_failed = true
139
- puts "~> Cleaning up old releases"
141
+ info "~> Cleaning up old releases"
140
142
  sudo "ls #{c.release_dir} | head -n -3 | xargs -I{} rm -rf #{c.release_dir}/{}"
141
143
  @cleanup_failed = false
142
144
  end
@@ -144,15 +146,18 @@ module EY
144
146
  # task
145
147
  def rollback
146
148
  if c.all_releases.size > 1
147
- puts "~> Rolling back to previous release"
148
149
  c.release_path = c.previous_release
150
+
151
+ revision = File.read(File.join(c.release_path, 'REVISION')).strip
152
+ info "~> Rolling back to previous release: #{short_log_message(revision)}"
153
+
149
154
  run_with_callbacks(:symlink, c.previous_release)
150
155
  cleanup_latest_release
151
156
  bundle
152
- puts "~> Restarting with previous release"
157
+ info "~> Restarting with previous release"
153
158
  with_maintenance_page { run_with_callbacks(:restart) }
154
159
  else
155
- puts "~> Already at oldest release, nothing to roll back to"
160
+ info "~> Already at oldest release, nothing to roll back to"
156
161
  exit(1)
157
162
  end
158
163
  end
@@ -163,22 +168,22 @@ module EY
163
168
  @migrations_reached = true
164
169
  roles :app_master, :solo do
165
170
  cmd = "cd #{c.latest_release} && #{c.framework_envs} #{c.migration_command}"
166
- puts "~> Migrating: #{cmd}"
171
+ info "~> Migrating: #{cmd}"
167
172
  run(cmd)
168
173
  end
169
174
  end
170
175
 
171
176
  # task
172
177
  def copy_repository_cache
173
- puts "~> Copying to #{c.release_path}"
178
+ info "~> Copying to #{c.release_path}"
174
179
  sudo("mkdir -p #{c.release_path} && rsync -aq #{c.exclusions} #{c.repository_cache}/ #{c.release_path}")
175
180
 
176
- puts "~> Ensuring proper ownership"
181
+ info "~> Ensuring proper ownership"
177
182
  sudo("chown -R #{c.user}:#{c.group} #{c.deploy_to}")
178
183
  end
179
184
 
180
185
  def symlink_configs(release_to_link=c.latest_release)
181
- puts "~> Symlinking configs"
186
+ info "~> Symlinking configs"
182
187
  [ "chmod -R g+w #{release_to_link}",
183
188
  "rm -rf #{release_to_link}/log #{release_to_link}/public/system #{release_to_link}/tmp/pids",
184
189
  "mkdir -p #{release_to_link}/tmp",
@@ -199,7 +204,7 @@ module EY
199
204
 
200
205
  # task
201
206
  def symlink(release_to_link=c.latest_release)
202
- puts "~> Symlinking code"
207
+ info "~> Symlinking code"
203
208
  sudo "rm -f #{c.current_path} && ln -nfs #{release_to_link} #{c.current_path} && chown -R #{c.user}:#{c.group} #{c.current_path}"
204
209
  @symlink_changed = true
205
210
  rescue Exception
@@ -213,6 +218,7 @@ module EY
213
218
  if File.exist?("#{c.latest_release}/deploy/#{what}.rb")
214
219
  eysd_path = $0 # invoke others just like we were invoked
215
220
  run "#{eysd_path} _#{VERSION}_ hook '#{what}' --app '#{config.app}' --release-path #{config.release_path}" do |server, cmd|
221
+ cmd << " --framework-env '#{c.environment}'"
216
222
  cmd << " --current-role '#{server.role}'"
217
223
  cmd << " --current-name '#{server.name}'" if server.name
218
224
  cmd
@@ -224,19 +230,19 @@ module EY
224
230
 
225
231
  def puts_deploy_failure
226
232
  if @cleanup_failed
227
- puts "~> [Relax] Your site is running new code, but cleaning up old deploys failed"
233
+ info "~> [Relax] Your site is running new code, but cleaning up old deploys failed"
228
234
  elsif @maintenance_up
229
- puts "~> [Attention] Maintenance page still up, consider the following before removing:"
230
- puts " * any deploy hooks ran, be careful if they were destructive" if @callbacks_reached
231
- puts " * any migrations ran, be careful if they were destructive" if @migrations_reached
235
+ info "~> [Attention] Maintenance page still up, consider the following before removing:"
236
+ info " * any deploy hooks ran, be careful if they were destructive" if @callbacks_reached
237
+ info " * any migrations ran, be careful if they were destructive" if @migrations_reached
232
238
  if @symlink_changed
233
- puts " * your new code is symlinked as current"
239
+ info " * your new code is symlinked as current"
234
240
  else
235
- puts " * your old code is still symlinked as current"
241
+ info " * your old code is still symlinked as current"
236
242
  end
237
- puts " * application servers failed to restart" if @restart_failed
243
+ info " * application servers failed to restart" if @restart_failed
238
244
  else
239
- puts "~> [Relax] Your site is still running old code and nothing destructive could have occurred"
245
+ info "~> [Relax] Your site is still running old code and nothing destructive could have occurred"
240
246
  end
241
247
  end
242
248
 
@@ -267,17 +273,17 @@ module EY
267
273
  DEFAULT_10_BUNDLER = '1.0.0.beta.1'
268
274
 
269
275
  def warn_about_missing_lockfile
270
- puts "!>"
271
- puts "!> WARNING: Gemfile.lock is missing!"
272
- puts "!> You can get different gems in production than what you tested with."
273
- puts "!> You can get different gems on every deployment even if your Gemfile hasn't changed."
274
- puts "!> Deploying may take a long time."
275
- puts "!>"
276
- puts "!> Fix this by running \"git add Gemfile.lock; git commit\" and deploying again."
277
- puts "!> If you don't have a Gemfile.lock, run \"bundle lock\" to create one."
278
- puts "!>"
279
- puts "!> This deployment will use bundler #{DEFAULT_09_BUNDLER} to run 'bundle install'."
280
- puts "!>"
276
+ info "!>"
277
+ info "!> WARNING: Gemfile.lock is missing!"
278
+ info "!> You can get different gems in production than what you tested with."
279
+ info "!> You can get different gems on every deployment even if your Gemfile hasn't changed."
280
+ info "!> Deploying may take a long time."
281
+ info "!>"
282
+ info "!> Fix this by running \"git add Gemfile.lock; git commit\" and deploying again."
283
+ info "!> If you don't have a Gemfile.lock, run \"bundle lock\" to create one."
284
+ info "!>"
285
+ info "!> This deployment will use bundler #{DEFAULT_09_BUNDLER} to run 'bundle install'."
286
+ info "!>"
281
287
  end
282
288
 
283
289
  def get_bundler_version(lockfile)
@@ -9,7 +9,10 @@ module EY
9
9
  end
10
10
 
11
11
  def <<(output)
12
- @streams.each { |s| s << output }
12
+ @streams.each do |s|
13
+ s << output
14
+ s.flush
15
+ end
13
16
  self
14
17
  end
15
18
  end # Tee
@@ -37,12 +40,14 @@ module EY
37
40
  EY::LoggedOutput.verbose?
38
41
  end
39
42
 
40
- def logfile
41
- EY::LoggedOutput.logfile
43
+ def info(msg)
44
+ with_logfile do |log|
45
+ Tee.new($stdout, log) << (msg + "\n")
46
+ end
42
47
  end
43
48
 
44
49
  def logged_system(cmd)
45
- File.open(logfile, 'a') do |log|
50
+ with_logfile do |log|
46
51
  out = verbose? ? Tee.new($stdout, log) : log
47
52
  err = Tee.new($stderr, log) # we always want to see errors
48
53
 
@@ -54,5 +59,14 @@ module EY
54
59
  end
55
60
  end
56
61
 
62
+ private
63
+ def with_logfile
64
+ File.open(logfile, 'a') {|f| yield f }
65
+ end
66
+
67
+ def logfile
68
+ EY::LoggedOutput.logfile
69
+ end
70
+
57
71
  end
58
72
  end
@@ -13,13 +13,22 @@ module EY
13
13
  strategy.create_revision_file(c.release_path)
14
14
  end
15
15
 
16
+ def short_log_message(revision)
17
+ strategy.short_log_message(revision)
18
+ end
19
+
16
20
  def strategy
17
21
  klass = Module.nesting[1]
22
+ # Use [] to access attributes instead of calling methods so
23
+ # that we get nils instead of NoMethodError.
24
+ #
25
+ # Rollback doesn't know about the repository location (nor
26
+ # should it need to), but it would like to use #short_log_message.
18
27
  klass.new(
19
- :repository_cache => c.repository_cache,
20
- :app => c.app,
21
- :repo => c.repo,
22
- :ref => c.branch
28
+ :repository_cache => c[:repository_cache],
29
+ :app => c[:app],
30
+ :repo => c[:repo],
31
+ :ref => c[:branch]
23
32
  )
24
33
  end
25
34
  end
@@ -53,6 +62,7 @@ module EY
53
62
  opts[:ref]
54
63
  end
55
64
 
65
+ info "~> Deploying revision #{short_log_message(to_checkout)}"
56
66
  logged_system("#{git} checkout -q '#{to_checkout}'") || logged_system("#{git} reset -q --hard '#{to_checkout}'")
57
67
  end
58
68
 
@@ -60,6 +70,10 @@ module EY
60
70
  `#{git} show --pretty=format:"%H" | head -1 > "#{dir}/REVISION"`
61
71
  end
62
72
 
73
+ def short_log_message(rev)
74
+ `#{git} log --pretty=oneline --abbrev-commit '#{rev}^..#{rev}'`.strip
75
+ end
76
+
63
77
  private
64
78
  def git
65
79
  "git --git-dir #{opts[:repository_cache]}/.git --work-tree #{opts[:repository_cache]}"
@@ -1,3 +1,3 @@
1
1
  module EY
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.0'
3
3
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 7
8
- - 1
9
- version: 0.7.1
7
+ - 8
8
+ - 0
9
+ version: 0.8.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - EY Cloud Team
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-29 00:00:00 -07:00
17
+ date: 2010-06-30 00:00:00 -07:00
18
18
  default_executable: eysd
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency