vlad 2.0.0 → 2.1.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.
data/.autotest CHANGED
@@ -1,12 +1,13 @@
1
1
  # -*- ruby -*-
2
2
 
3
3
  require 'autotest/restart'
4
+ require 'autotest/rcov'
4
5
 
5
6
  Autotest.add_hook :initialize do |at|
6
7
  at.testlib = "minitest/autorun"
7
8
  # at.extra_files << "../some/external/dependency.rb"
8
9
  #
9
- # at.libs << ":../some/external"
10
+ at.libs << ":../../rake-remote_task/dev/lib"
10
11
  #
11
12
  # at.add_exception 'vendor'
12
13
  #
data/History.txt CHANGED
@@ -1,3 +1,32 @@
1
+ === 2.1.0 / 2010-07-15
2
+
3
+ * 1 major enhancement:
4
+
5
+ * Split out rake_remote_task.rb and vlad_test_case.rb (in rake-remote_task gem).
6
+
7
+ * 4 minor enhancements:
8
+
9
+ * Added :type config option, defaulting to rails
10
+ * Moved VladTestCase to Rake::TestCase (in rake-remote_task gem).
11
+ * Moved all Vlad exceptions to Rake (in rake-remote_task gem).
12
+ * Refactored rails specific values out of core. (raggi)
13
+
14
+ * 2 bug fixes:
15
+
16
+ * Clarified Rake.clear_tasks in faq
17
+ * Fixed output from vlad:invoke (pnc)
18
+
19
+ === 2.0.0 / 2009-08-18
20
+
21
+ * 1 major enhancement:
22
+
23
+ * Removed all extra modules that we don't support in core anymore.
24
+
25
+ * 2 minor enhancements:
26
+
27
+ * Added test to show that false is a valid variable value.
28
+ * Moved vlad_test_case from test to lib to support 3rd party vlad modules.
29
+
1
30
  === 1.4.0 / 2009-06-23
2
31
 
3
32
  * 1 major enhancement:
data/Manifest.txt CHANGED
@@ -11,15 +11,13 @@ doco/getting_started.txt
11
11
  doco/migration.txt
12
12
  doco/perforce.txt
13
13
  doco/variables.txt
14
- lib/rake_remote_task.rb
15
14
  lib/vlad.rb
16
15
  lib/vlad/apache.rb
17
16
  lib/vlad/core.rb
18
17
  lib/vlad/maintenance.rb
19
18
  lib/vlad/passenger.rb
19
+ lib/vlad/rails.rb
20
20
  lib/vlad/subversion.rb
21
- lib/vlad_test_case.rb
22
- test/test_rake_remote_task.rb
23
21
  test/test_vlad.rb
24
22
  test/test_vlad_subversion.rb
25
23
  vladdemo.sh
data/Rakefile CHANGED
@@ -5,6 +5,8 @@ require 'hoe'
5
5
 
6
6
  Hoe.plugin :seattlerb
7
7
 
8
+ Hoe.add_include_dirs "../../rake-remote_task/dev/lib"
9
+
8
10
  Hoe.spec 'vlad' do
9
11
  self.rubyforge_name = 'hitsquad'
10
12
 
@@ -13,6 +15,7 @@ Hoe.spec 'vlad' do
13
15
  developer 'Wilson Bilkovich', 'wilson@supremetyrant.com'
14
16
 
15
17
  extra_deps << ['rake', '~> 0.8.0']
18
+ extra_deps << ['rake-remote_task', '~> 2.0']
16
19
  extra_deps << ['open4', '~> 0.9.0']
17
20
 
18
21
  # TODO: remove 1.9
@@ -21,6 +24,8 @@ end
21
24
 
22
25
  desc "quick little hack to see what the state of the nation looks like"
23
26
  task :debug do
27
+ $: << 'lib'
28
+ require 'vlad'
24
29
  Vlad.load :config => "lib/vlad/subversion.rb"
25
30
  set :repository, "repository path"
26
31
  set :deploy_to, "deploy path"
@@ -29,17 +34,4 @@ task :debug do
29
34
  Rake::Task['vlad:debug'].invoke
30
35
  end
31
36
 
32
- task :mana_from_heaven do
33
- # vlad = vlad + rake + open4
34
- # rake sans-contrib = 2035.98356718206
35
- vlad = `flog -s lib`.to_f + 2350.30744806517 + 502.363818023761
36
- cap = 11480.3919695285
37
- ratio = cap / vlad
38
- target = cap / Math::PI
39
-
40
- puts "%14.8f = %s" % [vlad, "vlad"]
41
- puts "%14.8f = %s" % [ratio, "ratio"]
42
- puts "%14.8f = %s" % [target - vlad, "needed delta"]
43
- end
44
-
45
37
  # vim: syntax=ruby
data/doco/faq.txt CHANGED
@@ -54,8 +54,13 @@ To prepend on a task, add a dependency:
54
54
  === Q: How can I replace a rake task instead of just adding to it?
55
55
  === A: Use Rake.clear_tasks str_or_regexp
56
56
 
57
+ NOTE: Rake.clear_tasks was moved to Hoe so it could be used more generally.
58
+
59
+ require 'hoe/rake'
60
+
57
61
  namespace :vlad do
58
- # Clear existing update task so that we can redefine instead of adding to it.
62
+ # Clear existing update task so that we can redefine instead of
63
+ # adding to it.
59
64
  Rake.clear_tasks('vlad:update')
60
65
 
61
66
  remote_task :update, :roles => :app do
data/lib/vlad/core.rb CHANGED
@@ -40,7 +40,7 @@ namespace :vlad do
40
40
 
41
41
  remote_task :setup_app, :roles => :app do
42
42
  dirs = [deploy_to, releases_path, scm_path, shared_path]
43
- dirs += %w(system log pids).map { |d| File.join(shared_path, d) }
43
+ dirs += shared_paths.keys.map { |d| File.join(shared_path, d) }
44
44
  run "umask #{umask} && mkdir -p #{dirs.join(' ')}"
45
45
  end
46
46
 
@@ -56,8 +56,8 @@ namespace :vlad do
56
56
  "#{source.checkout revision, scm_path}",
57
57
  "#{source.export revision, release_path}",
58
58
  "chmod -R g+w #{latest_release}",
59
- "rm -rf #{latest_release}/log #{latest_release}/public/system #{latest_release}/tmp/pids",
60
- "mkdir -p #{latest_release}/db #{latest_release}/tmp"
59
+ "rm -rf #{shared_paths.values.map { |p| File.join(latest_release, p) }.join(' ')}",
60
+ "mkdir -p #{mkdirs.map { |d| File.join(latest_release, d) }.join(' ')}"
61
61
  ].join(" && ")
62
62
  Rake::Task['vlad:update_symlinks'].invoke
63
63
 
@@ -76,28 +76,10 @@ namespace :vlad do
76
76
  desc "Updates the symlinks for shared paths".cleanup
77
77
 
78
78
  remote_task :update_symlinks, :roles => :app do
79
- run [ "ln -s #{shared_path}/log #{latest_release}/log",
80
- "ln -s #{shared_path}/system #{latest_release}/public/system",
81
- "ln -s #{shared_path}/pids #{latest_release}/tmp/pids" ].join(" && ")
82
- end
83
-
84
- desc "Run the migrate rake task for the the app. By default this is run in
85
- the latest app directory. You can run migrations for the current app
86
- directory by setting :migrate_target to :current. Additional environment
87
- variables can be passed to rake via the migrate_env variable.".cleanup
88
-
89
- # No application files are on the DB machine, also migrations should only be
90
- # run once.
91
- remote_task :migrate, :roles => :app do
92
- break unless target_host == Rake::RemoteTask.hosts_for(:app).first
93
-
94
- directory = case migrate_target.to_sym
95
- when :current then current_path
96
- when :latest then current_release
97
- else raise ArgumentError, "unknown migration target #{migrate_target.inspect}"
98
- end
99
-
100
- run "cd #{directory}; #{rake_cmd} RAILS_ENV=#{rails_env} db:migrate #{migrate_args}"
79
+ ops = shared_paths.map do |sp, rp|
80
+ "ln -s #{shared_path}/#{sp} #{latest_release}/#{rp}"
81
+ end
82
+ run ops.join(' && ')
101
83
  end
102
84
 
103
85
  desc "Invoke a single command on every remote server. This is useful for
@@ -112,7 +94,7 @@ namespace :vlad do
112
94
  remote_task :invoke do
113
95
  command = ENV["COMMAND"]
114
96
  abort "Please specify a command to execute on the remote servers (via the COMMAND environment variable)" unless command
115
- puts run(command)
97
+ run(command)
116
98
  end
117
99
 
118
100
  desc "Copy arbitrary files to the currently deployed version using
data/lib/vlad/rails.rb ADDED
@@ -0,0 +1,34 @@
1
+ namespace :vlad do
2
+ set :rails_env, "production"
3
+ set :migrate_args, ""
4
+ set :migrate_target, :latest
5
+ set :mkdirs, %w(tmp db)
6
+ set :shared_paths, {
7
+ 'log' => 'log',
8
+ 'system' => 'public/system',
9
+ 'pids' => 'tmp/pids',
10
+ }
11
+
12
+ desc "Run the migrate rake task for the the app. By default this is run in
13
+ the latest app directory. You can run migrations for the current app
14
+ directory by setting :migrate_target to :current. Additional environment
15
+ variables can be passed to rake via the migrate_env variable.".cleanup
16
+
17
+ # No application files are on the DB machine, also migrations should only be
18
+ # run once.
19
+ remote_task :migrate, :roles => :app do
20
+ break unless target_host == Rake::RemoteTask.hosts_for(:app).first
21
+
22
+ directory = case migrate_target.to_sym
23
+ when :current then current_path
24
+ when :latest then current_release
25
+ else
26
+ raise(ArgumentError,
27
+ "unknown migration target #{migrate_target.inspect}")
28
+ end
29
+
30
+ run ["cd #{directory}",
31
+ "#{rake_cmd} RAILS_ENV=#{rails_env} db:migrate #{migrate_args}"
32
+ ].join(" ")
33
+ end
34
+ end
data/lib/vlad.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  require 'rubygems'
2
2
  require 'thread'
3
- require 'rake_remote_task'
3
+ require 'rake/remote_task'
4
4
 
5
5
  $TESTING ||= false
6
6
 
7
7
  ##
8
- # Vlad the Deployer - Pragmatic application deployment automation, without mercy.
8
+ # Vlad the Deployer - Pragmatic application deployment automation,
9
+ # without mercy.
9
10
  #
10
11
  # Please read doco/getting_started.txt or http://rubyhitsquad.com/
11
12
  #
@@ -20,23 +21,7 @@ module Vlad
20
21
 
21
22
  ##
22
23
  # This is the version of Vlad you are running.
23
- VERSION = '2.0.0'
24
-
25
- ##
26
- # Base error class for all Vlad errors.
27
- class Error < RuntimeError; end
28
-
29
- ##
30
- # Raised when you have incorrectly configured Vlad.
31
- class ConfigurationError < Error; end
32
-
33
- ##
34
- # Raised when a remote command fails.
35
- class CommandFailedError < Error; end
36
-
37
- ##
38
- # Raised when an environment variable hasn't been set.
39
- class FetchError < Error; end
24
+ VERSION = '2.1.0'
40
25
 
41
26
  ##
42
27
  # Loads tasks file +tasks_file+ and various recipe styles as a hash
@@ -56,13 +41,15 @@ module Vlad
56
41
  # fit for you. All it does is a fancy-pants require. Require
57
42
  # whatever files you need as you see fit straight from your
58
43
  # Rakefile. YAY for simple and clean!
44
+
59
45
  def self.load options = {}
60
46
  options = {:config => options} if String === options
61
- order = [:core, :app, :config, :scm, :web]
47
+ order = [:core, :type, :app, :config, :scm, :web]
62
48
  order += options.keys - order
63
49
 
64
50
  recipes = {
65
51
  :app => :passenger,
52
+ :type => :rails,
66
53
  :config => 'config/deploy.rb',
67
54
  :core => :core,
68
55
  :scm => :subversion,
data/test/test_vlad.rb CHANGED
@@ -1,112 +1,111 @@
1
- require 'vlad_test_case'
2
- require 'vlad'
1
+ require 'rake/test_case'
3
2
 
4
3
  $TESTING = true
5
4
 
6
- class TestVlad < VladTestCase
5
+ class TestVlad < Rake::TestCase
7
6
  def test_all_hosts
8
7
  util_set_hosts
9
- assert_equal %w[app.example.com db.example.com], @vlad.all_hosts
8
+ assert_equal %w[app.example.com db.example.com], @rake.all_hosts
10
9
  end
11
10
 
12
11
  def test_fetch
13
12
  set :foo, 5
14
- assert_equal 5, @vlad.fetch(:foo)
13
+ assert_equal 5, @rake.fetch(:foo)
15
14
  end
16
15
 
17
16
  def test_fetch_with_default
18
- assert_equal 5, @vlad.fetch(:not_here, 5)
17
+ assert_equal 5, @rake.fetch(:not_here, 5)
19
18
  end
20
19
 
21
20
  def test_host
22
- @vlad.host "test.example.com", :app, :db
21
+ @rake.host "test.example.com", :app, :db
23
22
  expected = {"test.example.com" => {}}
24
- assert_equal expected, @vlad.roles[:app]
25
- assert_equal expected, @vlad.roles[:db]
23
+ assert_equal expected, @rake.roles[:app]
24
+ assert_equal expected, @rake.roles[:db]
26
25
  end
27
26
 
28
27
  def test_host_invalid
29
- assert_raises(ArgumentError) { @vlad.host nil, :web }
28
+ assert_raises(ArgumentError) { @rake.host nil, :web }
30
29
  end
31
30
 
32
31
  def test_host_multiple_hosts
33
- @vlad.host "test.example.com", :app, :db
34
- @vlad.host "yarr.example.com", :app, :db, :no_release => true
32
+ @rake.host "test.example.com", :app, :db
33
+ @rake.host "yarr.example.com", :app, :db, :no_release => true
35
34
 
36
35
  expected = {
37
36
  "test.example.com" => {},
38
37
  "yarr.example.com" => {:no_release => true}
39
38
  }
40
39
 
41
- assert_equal expected, @vlad.roles[:app]
42
- assert_equal expected, @vlad.roles[:db]
43
- refute_equal(@vlad.roles[:db]["test.example.com"].object_id,
44
- @vlad.roles[:app]["test.example.com"].object_id)
40
+ assert_equal expected, @rake.roles[:app]
41
+ assert_equal expected, @rake.roles[:db]
42
+ refute_equal(@rake.roles[:db]["test.example.com"].object_id,
43
+ @rake.roles[:app]["test.example.com"].object_id)
45
44
  end
46
45
 
47
46
  def test_hosts_for_array_of_roles
48
47
  util_set_hosts
49
- assert_equal %w[app.example.com db.example.com], @vlad.hosts_for([:app, :db])
48
+ assert_equal %w[app.example.com db.example.com], @rake.hosts_for([:app, :db])
50
49
  end
51
50
 
52
51
  def test_hosts_for_one_role
53
52
  util_set_hosts
54
- @vlad.host "app2.example.com", :app
55
- assert_equal %w[app.example.com app2.example.com], @vlad.hosts_for(:app)
53
+ @rake.host "app2.example.com", :app
54
+ assert_equal %w[app.example.com app2.example.com], @rake.hosts_for(:app)
56
55
  end
57
56
 
58
57
  def test_hosts_for_multiple_roles
59
58
  util_set_hosts
60
- assert_equal %w[app.example.com db.example.com], @vlad.hosts_for(:app, :db)
59
+ assert_equal %w[app.example.com db.example.com], @rake.hosts_for(:app, :db)
61
60
  end
62
61
 
63
62
  def test_hosts_for_unique
64
63
  util_set_hosts
65
- @vlad.host "app.example.com", :web
66
- assert_equal %w[app.example.com db.example.com], @vlad.hosts_for(:app, :db, :web)
64
+ @rake.host "app.example.com", :web
65
+ assert_equal %w[app.example.com db.example.com], @rake.hosts_for(:app, :db, :web)
67
66
  end
68
67
 
69
68
  def test_initialize
70
- @vlad.set_defaults # ensure these three are virginal
71
- assert_raises(Vlad::ConfigurationError) { @vlad.repository }
72
- assert_raises(Vlad::ConfigurationError) { @vlad.deploy_to }
73
- assert_raises(Vlad::ConfigurationError) { @vlad.domain }
69
+ @rake.set_defaults # ensure these three are virginal
70
+ assert_raises(Rake::ConfigurationError) { @rake.repository }
71
+ assert_raises(Rake::ConfigurationError) { @rake.deploy_to }
72
+ assert_raises(Rake::ConfigurationError) { @rake.domain }
74
73
  end
75
74
 
76
75
  def test_role
77
- @vlad.role :app, "test.example.com"
76
+ @rake.role :app, "test.example.com"
78
77
  expected = {"test.example.com" => {}}
79
- assert_equal expected, @vlad.roles[:app]
78
+ assert_equal expected, @rake.roles[:app]
80
79
  end
81
80
 
82
81
  def test_role_multiple_hosts
83
- @vlad.role :app, "test.example.com"
84
- @vlad.role :app, "yarr.example.com", :no_release => true
82
+ @rake.role :app, "test.example.com"
83
+ @rake.role :app, "yarr.example.com", :no_release => true
85
84
  expected = {
86
85
  "test.example.com" => {},
87
86
  "yarr.example.com" => {:no_release => true}
88
87
  }
89
- assert_equal expected, @vlad.roles[:app]
88
+ assert_equal expected, @rake.roles[:app]
90
89
  end
91
90
 
92
91
  def test_role_multiple_roles
93
- @vlad.role :app, "test.example.com", :primary => true
94
- @vlad.role :db, "yarr.example.com", :no_release => true
92
+ @rake.role :app, "test.example.com", :primary => true
93
+ @rake.role :db, "yarr.example.com", :no_release => true
95
94
  expected_db = { "yarr.example.com" => {:no_release => true} }
96
- assert_equal expected_db, @vlad.roles[:db]
95
+ assert_equal expected_db, @rake.roles[:db]
97
96
  expected_app = { "test.example.com" => {:primary => true} }
98
- assert_equal expected_app, @vlad.roles[:app]
97
+ assert_equal expected_app, @rake.roles[:app]
99
98
  end
100
99
 
101
100
  def test_remote_task
102
- t = @vlad.remote_task(:test_task) { 5 }
101
+ t = @rake.remote_task(:test_task) { 5 }
103
102
  assert_equal @task_count + 1, Rake.application.tasks.size
104
103
  assert_equal({ :roles => [] }, t.options)
105
104
  end
106
105
 
107
106
  def test_remote_task_all_hosts_by_default
108
107
  util_set_hosts
109
- t = @vlad.remote_task(:test_task) { 5 }
108
+ t = @rake.remote_task(:test_task) { 5 }
110
109
  assert_equal %w[app.example.com db.example.com], t.target_hosts
111
110
  end
112
111
 
@@ -114,31 +113,31 @@ class TestVlad < VladTestCase
114
113
  old_env_hosts = ENV["HOSTS"]
115
114
  ENV["HOSTS"] = 'other1.example.com, other2.example.com'
116
115
  util_set_hosts
117
- t = @vlad.remote_task(:test_task) { 5 }
116
+ t = @rake.remote_task(:test_task) { 5 }
118
117
  assert_equal %w[other1.example.com other2.example.com], t.target_hosts
119
- ensure
118
+ ensure
120
119
  ENV["HOSTS"] = old_env_hosts
121
120
  end
122
121
 
123
122
  def test_remote_task_body_set
124
123
  set(:some_variable, 5)
125
- @vlad.host 'www.example.com', :app
126
- @vlad.remote_task(:some_task) do $some_task_result = some_variable end
124
+ @rake.host 'www.example.com', :app
125
+ @rake.remote_task(:some_task) do $some_task_result = some_variable end
127
126
 
128
127
  Rake::Task['some_task'].execute nil
129
- assert_equal @vlad.fetch(:some_variable), $some_task_result
128
+ assert_equal @rake.fetch(:some_variable), $some_task_result
130
129
  end
131
130
 
132
131
  def test_remote_task_with_options
133
- t = @vlad.remote_task :test_task, :roles => [:app, :db] do
132
+ t = @rake.remote_task :test_task, :roles => [:app, :db] do
134
133
  fail "should not run"
135
134
  end
136
135
  assert_equal({:roles => [:app, :db]}, t.options)
137
136
  end
138
137
 
139
138
  def test_remote_task_before_host_declaration
140
- t = @vlad.remote_task :test_task, :roles => :web do 5 end
141
- @vlad.host 'www.example.com', :web
139
+ t = @rake.remote_task :test_task, :roles => :web do 5 end
140
+ @rake.host 'www.example.com', :web
142
141
  assert_equal %w[www.example.com], t.target_hosts
143
142
  end
144
143
 
@@ -161,30 +160,30 @@ class TestVlad < VladTestCase
161
160
 
162
161
  def test_set
163
162
  set :win, 5
164
- assert_equal 5, @vlad.win
163
+ assert_equal 5, @rake.win
165
164
  end
166
165
 
167
166
  def test_set_lazy_block_evaluation
168
167
  set(:lose) { raise "lose" }
169
- assert_raises(RuntimeError) { @vlad.lose }
168
+ assert_raises(RuntimeError) { @rake.lose }
170
169
  end
171
170
 
172
171
  def test_set_with_block
173
172
  x = 1
174
173
  set(:win) { x += 2 }
175
174
 
176
- assert_equal 3, @vlad.win
177
- assert_equal 3, @vlad.win
175
+ assert_equal 3, @rake.win
176
+ assert_equal 3, @rake.win
178
177
  end
179
178
 
180
179
  def test_set_with_reference
181
- @vlad.instance_eval do
180
+ @rake.instance_eval do
182
181
  set(:var_one) { var_two }
183
182
  set(:var_two) { var_three }
184
183
  set(:var_three) { 5 }
185
184
  end
186
185
 
187
- assert_equal 5, @vlad.var_one
186
+ assert_equal 5, @rake.var_one
188
187
  end
189
188
 
190
189
  def test_set_with_block_and_value
@@ -196,7 +195,7 @@ class TestVlad < VladTestCase
196
195
 
197
196
  def test_set_with_nil
198
197
  set(:win, nil)
199
- assert_equal nil, @vlad.win
198
+ assert_equal nil, @rake.win
200
199
  end
201
200
 
202
201
  def test_set_with_reserved_name
@@ -1,8 +1,7 @@
1
- require 'vlad_test_case'
2
1
  require 'vlad'
3
2
  require 'vlad/subversion'
4
3
 
5
- class TestVladSubversion < VladTestCase
4
+ class TestVladSubversion < MiniTest::Unit::TestCase
6
5
  def setup
7
6
  super
8
7
  @scm = Vlad::Subversion.new
data.tar.gz.sig ADDED
Binary file