whiskey_disk 0.4.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -84,15 +84,17 @@ As a rails plugin:
84
84
 
85
85
  Known config file settings (if you're familiar with capistrano and vlad these should seem eerily familiar):
86
86
 
87
- domain: host on which to deploy (this is an ssh connect string)
88
- deploy_to: path to which to deploy main application
89
- repository: git repo path for main application
90
- branch: git branch to deploy from main application git repo (default: master)
91
- deploy_config_to: where to deploy the configuration repository
92
- config_repository: git repository for configuration files
93
- config_branch: git branch to deploy from configuration git repo (default: master)
94
- project: project name (used to compute path in configuration checkout)
95
- rake_env: hash of environment variables to set when running post_setup and post_deploy rake tasks
87
+ domain: host on which to deploy (this is an ssh connect string)
88
+ deploy_to: path to which to deploy main application
89
+ repository: git repo path for main application
90
+ branch: git branch to deploy from main application git repo (default: master)
91
+ deploy_config_to: where to deploy the configuration repository
92
+ config_repository: git repository for configuration files
93
+ config_branch: git branch to deploy from configuration git repo (default: master)
94
+ project: project name (used to compute path in configuration checkout)
95
+ post_deploy_script: path to a shell script to run after deployment
96
+ post_setup_script: path to a shell script to run after setup
97
+ rake_env: hash of environment variables to set when running post_setup and post_deploy rake tasks
96
98
 
97
99
 
98
100
  A simple config/deploy.yml might look like:
@@ -114,6 +116,39 @@ of deploy:setup
114
116
  at the end of deploy:now
115
117
 
116
118
 
119
+ #### post\_deploy\_script and post\_setup\_script ###
120
+
121
+ Whiskey\_disk provides rake task hooks (deploy:post\_setup and deploy:post\_deploy) to allow running custom
122
+ code after setup or deployment. There are situations where it is desirable to run some commands prior to
123
+ running those rake tasks (e.g., if using bundler and needing to do a 'bundle install' before running rake).
124
+ It may also be the case that the target system doesn't have rake (and/or ruby) installed, but some post-setup
125
+ or post-deploy operations need to happen. For these reasons, whiskey\_disk allows specifying a (bash-compatible)
126
+ shell script to run after setup and/or deployment via the post\_deploy\_script and post\_setup\_script settings
127
+ in the configuration file. These scripts, when specified, are run immediately before running the deploy:post\_setup
128
+ or deploy:post\_deploy rake tasks, if they are present.
129
+
130
+ The paths provided to post\_deploy\_script and post\_setup\_script can be either absolute or relative. A path
131
+ starting with a '/' is an absolute path, and the script specified should be at that exact location on the
132
+ target filesystem. A path which does not start with a '/' is a relative path, and the script specified should
133
+ be located at the specified path under the deployed application path. This implies that it's possible to
134
+ manage post\_setup and post\_deploy scripts out of a configuration repository.
135
+
136
+ A config/deploy.yml using post\_deploy\_script and post\_setup\_script might look like this:
137
+
138
+ production:
139
+ domain: "ogc@www.ogtastic.com"
140
+ deploy_to: "/var/www/www.ogtastic.com"
141
+ repository: "git@ogtastic.com:www.ogtastic.com.git"
142
+ branch: "stable"
143
+ post_setup_script: "/home/ogc/horrible_place_for_this/prod-setup.sh"
144
+ post_deploy_script: "bin/post-deploy.sh"
145
+ rake_env:
146
+ RAILS_ENV: 'production'
147
+
148
+ The post\_deploy\_script will be run from /var/www/www.ogtastic.com/bin/post-deploy.sh on the
149
+ target system.
150
+
151
+
117
152
 
118
153
  ### Running via rake ###
119
154
 
@@ -150,7 +185,7 @@ The --path argument can take either a file or a directory. When given a file it
150
185
  All this means you can manage a large number of project deployments (local or remote) and have a single scripted deployment manager that keeps them up to date. Configurations can live in a centralized location, and developers don't have to be actively involved in ensuring code gets shipped up to a server. Win.
151
186
 
152
187
 
153
- ### A note about post\__{setup,deploy} Rake tasks
188
+ ### A note about post\_{setup,deploy} Rake tasks
154
189
 
155
190
  If you want actions to run on the deployment target after you do a whiskey\_disk setup or whiskey\_disk deploy,
156
191
  you will need to make sure that whiskey\_disk is available on the target system (either by gem installation,
data/Rakefile CHANGED
@@ -5,10 +5,9 @@ desc 'Default: run unit tests.'
5
5
  task :default => :test
6
6
 
7
7
  desc 'Test RubyCloud'
8
- Rake::TestTask.new(:test) do |t|
9
- t.libs << 'lib'
10
- t.pattern = 'spec/**/*_spec.rb'
11
- t.verbose = true
8
+ task :test do
9
+ files = Dir['spec/**/*_spec.rb'].join(" ")
10
+ system("bacon #{files}")
12
11
  end
13
12
 
14
13
  begin
data/TODO.txt CHANGED
@@ -1,3 +1,19 @@
1
+ - make sure that deployments don't require ruby or rake on the target machine
2
+ - we should probably do --depth 1 on setup, for even fastertude
3
+ - support 'check=yes' as a wd --check flag
4
+ - if someone specifies :project in a config repo block in a localized config (say a RAILS app), then use that for determining which project to use when loading the config repo
5
+
6
+ - batch deployments (--batch=/etc/deploy/hourly.yml)
7
+ - could have this simply pointing to a single yaml file with project name, target name, check value (default = true) (business value: only need one command, or one cron, to manage all of these)
8
+ - could be a directory of individual yaml files with that information in each of them (representing one project, one target) (business value: puppet/chef could more easily manage directories of files)
9
+ - trying to avoid re-using the deploy.yml because we may want to not auto-deploy all things that we have configurations for, or we may want to auto-deploy them at different frequencies
10
+ - do we want the config path to be in the meta file, or do we want that to come as part of the arguments to the deployment?
11
+
12
+ wd deploy --batch=/etc/deploy/hourly.yml --path=/etc/deploy/projects/
13
+ wd deploy --batch=/etc/deploy/hourly/ --path=/etc/deploy/projects/
14
+ wd deploy --batch=/etc/deploy/hourly.yml --path=/etc/deploy/deploy.yml
15
+ wd deploy --batch=/etc/deploy/hourly --path=/etc/deploy/projects/deploy.yml
16
+
1
17
  - allow whiskey_disk to pull configuration file from an url (which would be based on project, environment)
2
18
 
3
19
  - do git-deploy style change detection:
@@ -16,19 +32,6 @@
16
32
  end
17
33
  end
18
34
 
19
- ---
20
-
21
- - [Q] how to specify readily which projects need to be deployed? Metaconfig?:
22
-
23
- ---
24
- - config: /path/to/config
25
- project: larry
26
- target: staging
27
- - config: /path/to/config
28
- project: larry
29
- target: production
30
- cache: no
31
-
32
35
  - [Q] what about maintenance pages(?) (i.e., do we need a pre-deploy hook?; also are these per-target config stuffs?; fun managing changes to a maintenance page ;-)
33
36
  - [Q] do we want a mechanism to manage the config repo? (add a repo, add a project, add an environment, put a file into the config repo for an environment?)
34
37
  - [Q] what about per-target rake tasks, do we just store these in the config repo? does this work?
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.5
1
+ 0.5.0
data/lib/whiskey_disk.rb CHANGED
@@ -140,6 +140,17 @@ class WhiskeyDisk
140
140
  if_task_defined(task_name, "#{env_vars} rake --trace #{task_name} to=#{self[:environment]}")))
141
141
  end
142
142
 
143
+ def build_path(path)
144
+ return path if path =~ %r{^/}
145
+ File.join(self[:deploy_to], path)
146
+ end
147
+
148
+ def run_script(script)
149
+ return unless script
150
+ path = build_path(script)
151
+ enqueue("if [ -e #{path} ]; then sh -x #{path}; fi ")
152
+ end
153
+
143
154
  def ensure_main_parent_path_is_present
144
155
  needs(:deploy_to)
145
156
  enqueue "mkdir -p #{parent_path(self[:deploy_to])}"
@@ -178,11 +189,13 @@ class WhiskeyDisk
178
189
 
179
190
  def run_post_setup_hooks
180
191
  needs(:deploy_to)
192
+ run_script(self[:post_setup_script])
181
193
  run_rake_task(self[:deploy_to], "deploy:post_setup")
182
194
  end
183
-
195
+
184
196
  def run_post_deploy_hooks
185
197
  needs(:deploy_to)
198
+ run_script(self[:post_deploy_script])
186
199
  run_rake_task(self[:deploy_to], "deploy:post_deploy")
187
200
  end
188
201
  end
@@ -357,11 +357,76 @@ describe 'WhiskeyDisk' do
357
357
  WhiskeyDisk.buffer.join(' ').should.match(%r{cd /path/to/main/repo})
358
358
  end
359
359
 
360
+ describe 'when a post setup script is specified' do
361
+ describe 'and the script path does not start with a "/"' do
362
+ before do
363
+ @parameters = { 'deploy_to' => '/path/to/main/repo',
364
+ 'post_setup_script' => '/path/to/setup/script' }
365
+ WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
366
+ WhiskeyDisk.reset
367
+ end
368
+
369
+ it 'should attempt to run the post setup script' do
370
+ WhiskeyDisk.run_post_setup_hooks
371
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x .*/path/to/setup/script})
372
+ end
373
+
374
+ it 'should use an absolute path to run the post setup script when the script path starts with a "/"' do
375
+ WhiskeyDisk.run_post_setup_hooks
376
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x /path/to/setup/script})
377
+ end
378
+
379
+ it 'should make the post setup script run conditional on the presence of the script' do
380
+ WhiskeyDisk.run_post_setup_hooks
381
+ WhiskeyDisk.buffer.join(' ').should.match(%r{if \[ -e /path/to/setup/script \]; then .*; fi})
382
+ end
383
+ end
384
+
385
+ describe 'and the script path does not start with a "/"' do
386
+ before do
387
+ @parameters = { 'deploy_to' => '/path/to/main/repo',
388
+ 'post_setup_script' => 'path/to/setup/script' }
389
+ WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
390
+ WhiskeyDisk.reset
391
+ end
392
+
393
+ it 'should attempt to run the post setup script' do
394
+ WhiskeyDisk.run_post_setup_hooks
395
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x .*/path/to/setup/script})
396
+ end
397
+
398
+ it 'should use a path relative to the setupment path to run the post setup script' do
399
+ WhiskeyDisk.run_post_setup_hooks
400
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x /path/to/main/repo/path/to/setup/script})
401
+ end
402
+
403
+ it 'should make the post setup script run conditional on the presence of the script' do
404
+ WhiskeyDisk.run_post_setup_hooks
405
+ WhiskeyDisk.buffer.join(' ').should.match(%r{if \[ -e /path/to/main/repo/path/to/setup/script \]; then .*; fi})
406
+ end
407
+ end
408
+ end
409
+
410
+ it 'should attempt to run the post setup rake tasks' do
411
+ WhiskeyDisk.run_post_setup_hooks
412
+ WhiskeyDisk.buffer.join(' ').should.match(%r{rake.*deploy:post_setup})
413
+ end
414
+
415
+ it 'should use the same environment when running the rake tasks' do
416
+ WhiskeyDisk.run_post_setup_hooks
417
+ WhiskeyDisk.buffer.join(' ').should.match(%r{to=#{@env}})
418
+ end
419
+
360
420
  it 'should make the post setup rake tasks conditional on the presence of a Rakefile in the deployment path' do
361
421
  WhiskeyDisk.run_post_setup_hooks
362
422
  WhiskeyDisk.buffer.join(' ').should.match(%r{if \[ -e /path/to/main/repo/Rakefile \]; then .*; fi})
363
423
  end
364
424
 
425
+ it 'should make the post setup rake tasks conditional on the deploy:post_setup rake task being defined' do
426
+ WhiskeyDisk.run_post_setup_hooks
427
+ WhiskeyDisk.buffer.join(' ').should.match(%r{if \[\[ \`rake -P | grep deploy:post_setup\` != "" \]\]; })
428
+ end
429
+
365
430
  it 'should ensure that any rake ENV variable are set when checking for deploy:post_setup tasks' do
366
431
  @parameters = { 'deploy_to' => '/path/to/main/repo', 'rake_env' => { 'RAILS_ENV' => 'production', 'FOO' => 'bar' } }
367
432
  WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
@@ -372,21 +437,6 @@ describe 'WhiskeyDisk' do
372
437
  end
373
438
  end
374
439
 
375
- it 'should make the post setup rake tasks conditional on the deploy:post_setup rake task being defined' do
376
- WhiskeyDisk.run_post_setup_hooks
377
- WhiskeyDisk.buffer.join(' ').should.match(%r{if \[\[ \`rake -P | grep deploy:post_setup\` != "" \]\]; })
378
- end
379
-
380
- it 'should attempt to run the post setup rake tasks' do
381
- WhiskeyDisk.run_post_setup_hooks
382
- WhiskeyDisk.buffer.join(' ').should.match(%r{rake.*deploy:post_setup})
383
- end
384
-
385
- it 'should use the same environment when running the rake tasks' do
386
- WhiskeyDisk.run_post_setup_hooks
387
- WhiskeyDisk.buffer.join(' ').should.match(%r{to=#{@env}})
388
- end
389
-
390
440
  it 'should set any rake_env variables when running the rake tasks' do
391
441
  @parameters = { 'deploy_to' => '/path/to/main/repo', 'rake_env' => { 'RAILS_ENV' => 'production', 'FOO' => 'bar' } }
392
442
  WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
@@ -416,16 +466,66 @@ describe 'WhiskeyDisk' do
416
466
  WhiskeyDisk.buffer.join(' ').should.match(%r{cd /path/to/main/repo})
417
467
  end
418
468
 
419
- it 'should ensure that any rake ENV variable are set when checking for deploy:post_setup tasks' do
420
- @parameters = { 'deploy_to' => '/path/to/main/repo', 'rake_env' => { 'RAILS_ENV' => 'production', 'FOO' => 'bar' } }
421
- WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
422
- WhiskeyDisk.reset
423
- WhiskeyDisk.run_post_deploy_hooks
424
- @parameters['rake_env'].each_pair do |k,v|
425
- WhiskeyDisk.buffer.join(' ').should.match(%r{#{k}='#{v}' .*rake -P})
469
+ describe 'when a post deployment script is specified' do
470
+ describe 'and the script path does not start with a "/"' do
471
+ before do
472
+ @parameters = { 'deploy_to' => '/path/to/main/repo',
473
+ 'post_deploy_script' => '/path/to/deployment/script' }
474
+ WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
475
+ WhiskeyDisk.reset
476
+ end
477
+
478
+ it 'should attempt to run the post deployment script' do
479
+ WhiskeyDisk.run_post_deploy_hooks
480
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x .*/path/to/deployment/script})
481
+ end
482
+
483
+ it 'should use an absolute path to run the post deployment script when the script path starts with a "/"' do
484
+ WhiskeyDisk.run_post_deploy_hooks
485
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x /path/to/deployment/script})
486
+ end
487
+
488
+ it 'should make the post deployment script run conditional on the presence of the script' do
489
+ WhiskeyDisk.run_post_deploy_hooks
490
+ WhiskeyDisk.buffer.join(' ').should.match(%r{if \[ -e /path/to/deployment/script \]; then .*; fi})
491
+ end
492
+ end
493
+
494
+ describe 'and the script path does not start with a "/"' do
495
+ before do
496
+ @parameters = { 'deploy_to' => '/path/to/main/repo',
497
+ 'post_deploy_script' => 'path/to/deployment/script' }
498
+ WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
499
+ WhiskeyDisk.reset
500
+ end
501
+
502
+ it 'should attempt to run the post deployment script' do
503
+ WhiskeyDisk.run_post_deploy_hooks
504
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x .*/path/to/deployment/script})
505
+ end
506
+
507
+ it 'should use a path relative to the deployment path to run the post deployment script' do
508
+ WhiskeyDisk.run_post_deploy_hooks
509
+ WhiskeyDisk.buffer.join(' ').should.match(%r{sh -x /path/to/main/repo/path/to/deployment/script})
510
+ end
511
+
512
+ it 'should make the post deployment script run conditional on the presence of the script' do
513
+ WhiskeyDisk.run_post_deploy_hooks
514
+ WhiskeyDisk.buffer.join(' ').should.match(%r{if \[ -e /path/to/main/repo/path/to/deployment/script \]; then .*; fi})
515
+ end
426
516
  end
427
517
  end
518
+
519
+ it 'should attempt to run the post deployment rake tasks' do
520
+ WhiskeyDisk.run_post_deploy_hooks
521
+ WhiskeyDisk.buffer.join(' ').should.match(%r{rake.*deploy:post_deploy})
522
+ end
428
523
 
524
+ it 'should use the same environment when running the rake tasks' do
525
+ WhiskeyDisk.run_post_deploy_hooks
526
+ WhiskeyDisk.buffer.join(' ').should.match(%r{to=#{@env}})
527
+ end
528
+
429
529
  it 'should make the post deployment rake tasks conditional on the presence of a Rakefile in the deployment path' do
430
530
  WhiskeyDisk.run_post_deploy_hooks
431
531
  WhiskeyDisk.buffer.join(' ').should.match(%r{if \[ -e /path/to/main/repo/Rakefile \]; then .*; fi})
@@ -435,15 +535,15 @@ describe 'WhiskeyDisk' do
435
535
  WhiskeyDisk.run_post_deploy_hooks
436
536
  WhiskeyDisk.buffer.join(' ').should.match(%r{if \[\[ \`rake -P | grep deploy:post_deploy\` != "" \]\]; })
437
537
  end
438
-
439
- it 'should attempt to run the post deployment rake tasks' do
440
- WhiskeyDisk.run_post_deploy_hooks
441
- WhiskeyDisk.buffer.join(' ').should.match(%r{rake.*deploy:post_deploy})
442
- end
443
-
444
- it 'should use the same environment when running the rake tasks' do
538
+
539
+ it 'should ensure that any rake ENV variable are set when checking for deploy:post_setup tasks' do
540
+ @parameters = { 'deploy_to' => '/path/to/main/repo', 'rake_env' => { 'RAILS_ENV' => 'production', 'FOO' => 'bar' } }
541
+ WhiskeyDisk::Config.stub!(:fetch).and_return(@parameters)
542
+ WhiskeyDisk.reset
445
543
  WhiskeyDisk.run_post_deploy_hooks
446
- WhiskeyDisk.buffer.join(' ').should.match(%r{to=#{@env}})
544
+ @parameters['rake_env'].each_pair do |k,v|
545
+ WhiskeyDisk.buffer.join(' ').should.match(%r{#{k}='#{v}' .*rake -P})
546
+ end
447
547
  end
448
548
 
449
549
  it 'should set any rake_env variables when running the rake tasks' do
data/whiskey_disk.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{whiskey_disk}
8
- s.version = "0.4.5"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Rick Bradley"]
12
- s.date = %q{2010-08-31}
12
+ s.date = %q{2010-09-06}
13
13
  s.default_executable = %q{wd}
14
14
  s.description = %q{Opinionated gem for doing fast git-based server deployments.}
15
15
  s.email = %q{rick@rickbradley.com}
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whiskey_disk
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 4
9
8
  - 5
10
- version: 0.4.5
9
+ - 0
10
+ version: 0.5.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Rick Bradley
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-31 00:00:00 -05:00
18
+ date: 2010-09-06 00:00:00 -05:00
19
19
  default_executable: wd
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency