fpauser-vlad 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ require 'vlad'
2
+
3
+ namespace :vlad do
4
+ desc 'Restart Passenger'
5
+ remote_task :start_app, :roles => :app do
6
+ run "touch #{current_release}/tmp/restart.txt"
7
+ end
8
+ end
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
@@ -0,0 +1,35 @@
1
+ class Vlad::Subversion
2
+
3
+ set :source, Vlad::Subversion.new
4
+ set :svn_cmd, "svn"
5
+
6
+ ##
7
+ # Returns the command that will check out +revision+ from the repository
8
+ # into directory +destination+
9
+
10
+ def checkout(revision, destination)
11
+ "#{svn_cmd} co -r #{revision} #{repository} #{destination}"
12
+ end
13
+
14
+ ##
15
+ # Returns the command that will export +revision+ from the repository into
16
+ # the directory +destination+.
17
+
18
+ def export(revision_or_source, destination)
19
+ "#{svn_cmd} #{deploy_via} " +
20
+ if revision_or_source =~ /^(\d+|head)$/i then
21
+ "-r #{revision_or_source} #{repository} #{destination}"
22
+ else
23
+ "#{revision_or_source} #{destination}"
24
+ end
25
+ end
26
+
27
+ ##
28
+ # Returns a command that maps human-friendly revision identifier +revision+
29
+ # into a subversion revision specification.
30
+
31
+ def revision(revision)
32
+ "`#{svn_cmd} info #{repository} | grep 'Revision:' | cut -f2 -d\\ `"
33
+ end
34
+ end
35
+
data/test/test_vlad.rb ADDED
@@ -0,0 +1,209 @@
1
+ require 'rake/test_case'
2
+
3
+ $TESTING = true
4
+
5
+ class TestVlad < Rake::TestCase
6
+ def test_all_hosts
7
+ util_set_hosts
8
+ assert_equal %w[app.example.com db.example.com], @rake.all_hosts
9
+ end
10
+
11
+ def test_fetch
12
+ set :foo, 5
13
+ assert_equal 5, @rake.fetch(:foo)
14
+ end
15
+
16
+ def test_fetch_with_default
17
+ assert_equal 5, @rake.fetch(:not_here, 5)
18
+ end
19
+
20
+ def test_host
21
+ @rake.host "test.example.com", :app, :db
22
+ expected = {"test.example.com" => {}}
23
+ assert_equal expected, @rake.roles[:app]
24
+ assert_equal expected, @rake.roles[:db]
25
+ end
26
+
27
+ def test_host_invalid
28
+ assert_raises(ArgumentError) { @rake.host nil, :web }
29
+ end
30
+
31
+ def test_host_multiple_hosts
32
+ @rake.host "test.example.com", :app, :db
33
+ @rake.host "yarr.example.com", :app, :db, :no_release => true
34
+
35
+ expected = {
36
+ "test.example.com" => {},
37
+ "yarr.example.com" => {:no_release => true}
38
+ }
39
+
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)
44
+ end
45
+
46
+ def test_hosts_for_array_of_roles
47
+ util_set_hosts
48
+ assert_equal %w[app.example.com db.example.com], @rake.hosts_for([:app, :db])
49
+ end
50
+
51
+ def test_hosts_for_one_role
52
+ util_set_hosts
53
+ @rake.host "app2.example.com", :app
54
+ assert_equal %w[app.example.com app2.example.com], @rake.hosts_for(:app)
55
+ end
56
+
57
+ def test_hosts_for_multiple_roles
58
+ util_set_hosts
59
+ assert_equal %w[app.example.com db.example.com], @rake.hosts_for(:app, :db)
60
+ end
61
+
62
+ def test_hosts_for_unique
63
+ util_set_hosts
64
+ @rake.host "app.example.com", :web
65
+ assert_equal %w[app.example.com db.example.com], @rake.hosts_for(:app, :db, :web)
66
+ end
67
+
68
+ def test_initialize
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 }
73
+ end
74
+
75
+ def test_role
76
+ @rake.role :app, "test.example.com"
77
+ expected = {"test.example.com" => {}}
78
+ assert_equal expected, @rake.roles[:app]
79
+ end
80
+
81
+ def test_role_multiple_hosts
82
+ @rake.role :app, "test.example.com"
83
+ @rake.role :app, "yarr.example.com", :no_release => true
84
+ expected = {
85
+ "test.example.com" => {},
86
+ "yarr.example.com" => {:no_release => true}
87
+ }
88
+ assert_equal expected, @rake.roles[:app]
89
+ end
90
+
91
+ def test_role_multiple_roles
92
+ @rake.role :app, "test.example.com", :primary => true
93
+ @rake.role :db, "yarr.example.com", :no_release => true
94
+ expected_db = { "yarr.example.com" => {:no_release => true} }
95
+ assert_equal expected_db, @rake.roles[:db]
96
+ expected_app = { "test.example.com" => {:primary => true} }
97
+ assert_equal expected_app, @rake.roles[:app]
98
+ end
99
+
100
+ def test_remote_task
101
+ t = @rake.remote_task(:test_task) { 5 }
102
+ assert_equal @task_count + 1, Rake.application.tasks.size
103
+ assert_equal({ :roles => [] }, t.options)
104
+ end
105
+
106
+ def test_remote_task_all_hosts_by_default
107
+ util_set_hosts
108
+ t = @rake.remote_task(:test_task) { 5 }
109
+ assert_equal %w[app.example.com db.example.com], t.target_hosts
110
+ end
111
+
112
+ def test_remote_task_environment_override
113
+ old_env_hosts = ENV["HOSTS"]
114
+ ENV["HOSTS"] = 'other1.example.com, other2.example.com'
115
+ util_set_hosts
116
+ t = @rake.remote_task(:test_task) { 5 }
117
+ assert_equal %w[other1.example.com other2.example.com], t.target_hosts
118
+ ensure
119
+ ENV["HOSTS"] = old_env_hosts
120
+ end
121
+
122
+ def test_remote_task_body_set
123
+ set(:some_variable, 5)
124
+ @rake.host 'www.example.com', :app
125
+ @rake.remote_task(:some_task) do $some_task_result = some_variable end
126
+
127
+ Rake::Task['some_task'].execute nil
128
+ assert_equal @rake.fetch(:some_variable), $some_task_result
129
+ end
130
+
131
+ def test_remote_task_with_options
132
+ t = @rake.remote_task :test_task, :roles => [:app, :db] do
133
+ fail "should not run"
134
+ end
135
+ assert_equal({:roles => [:app, :db]}, t.options)
136
+ end
137
+
138
+ def test_remote_task_before_host_declaration
139
+ t = @rake.remote_task :test_task, :roles => :web do 5 end
140
+ @rake.host 'www.example.com', :web
141
+ assert_equal %w[www.example.com], t.target_hosts
142
+ end
143
+
144
+ def test_remote_task_role_override
145
+ host "db1", :db
146
+ host "db2", :db
147
+ host "db3", :db
148
+ host "master", :master_db
149
+
150
+ remote_task(:migrate_the_db, :roles => [:db]) { flunk "bad!" }
151
+ task = Rake::Task["migrate_the_db"]
152
+ assert_equal %w[db1 db2 db3], task.target_hosts
153
+
154
+ task.options[:roles] = :master_db
155
+ assert_equal %w[master], task.target_hosts
156
+
157
+ task.options[:roles] = [:master_db]
158
+ assert_equal %w[master], task.target_hosts
159
+ end
160
+
161
+ def test_set
162
+ set :win, 5
163
+ assert_equal 5, @rake.win
164
+ end
165
+
166
+ def test_set_lazy_block_evaluation
167
+ set(:lose) { raise "lose" }
168
+ assert_raises(RuntimeError) { @rake.lose }
169
+ end
170
+
171
+ def test_set_with_block
172
+ x = 1
173
+ set(:win) { x += 2 }
174
+
175
+ assert_equal 3, @rake.win
176
+ assert_equal 3, @rake.win
177
+ end
178
+
179
+ def test_set_with_reference
180
+ @rake.instance_eval do
181
+ set(:var_one) { var_two }
182
+ set(:var_two) { var_three }
183
+ set(:var_three) { 5 }
184
+ end
185
+
186
+ assert_equal 5, @rake.var_one
187
+ end
188
+
189
+ def test_set_with_block_and_value
190
+ e = assert_raises(ArgumentError) do
191
+ set(:loser, 5) { 6 }
192
+ end
193
+ assert_equal "cannot provide both a value and a block", e.message
194
+ end
195
+
196
+ def test_set_with_nil
197
+ set(:win, nil)
198
+ assert_equal nil, @rake.win
199
+ end
200
+
201
+ def test_set_with_reserved_name
202
+ $TESTING = false
203
+ e = assert_raises(ArgumentError) { set(:all_hosts, []) }
204
+ assert_equal "cannot set reserved name: 'all_hosts'", e.message
205
+ ensure
206
+ $TESTING = true
207
+ end
208
+ end
209
+
@@ -0,0 +1,26 @@
1
+ require 'vlad'
2
+ require 'vlad/subversion'
3
+
4
+ class TestVladSubversion < MiniTest::Unit::TestCase
5
+ def setup
6
+ super
7
+ @scm = Vlad::Subversion.new
8
+ set :repository, "svn+ssh://repo/myproject"
9
+ end
10
+
11
+ def test_checkout
12
+ cmd = @scm.checkout 'HEAD', '/the/place'
13
+ assert_equal 'svn co -r HEAD svn+ssh://repo/myproject /the/place', cmd
14
+ end
15
+
16
+ def test_export
17
+ cmd = @scm.export 'HEAD', '/the/place'
18
+ assert_equal 'svn export -r HEAD svn+ssh://repo/myproject /the/place', cmd
19
+ end
20
+
21
+ def test_revision
22
+ cmd = @scm.revision('HEAD')
23
+ expected = "`svn info svn+ssh://repo/myproject | grep 'Revision:' | cut -f2 -d\\ `"
24
+ assert_equal expected, cmd
25
+ end
26
+ end
data/vladdemo.sh ADDED
@@ -0,0 +1,97 @@
1
+ #!/bin/bash
2
+
3
+ N=$1; shift
4
+
5
+ killall mongrel svnserve 2> /dev/null
6
+
7
+ rm -rf ~/demo
8
+ mkdir ~/demo
9
+ cd ~/demo
10
+
11
+ pause() {
12
+ echo -n "waiting... hit return... "
13
+ read
14
+ echo
15
+ }
16
+
17
+ echo "Starting demo from scratch"
18
+ echo " This step creates a subversion repository and imports a new rails app"
19
+ echo " It modifies the Rakefile to load Vlad and creates config/deploy.rb"
20
+ echo
21
+ pause
22
+
23
+ svnadmin create svnrepo
24
+ echo "anon-access = write" >> svnrepo/conf/svnserve.conf
25
+
26
+ svnserve -d --foreground -r svnrepo --listen-host localhost &
27
+
28
+ echo "cd ~/demo
29
+ rm -rf website_*
30
+ svnserve -d --foreground -r svnrepo --listen-host localhost &
31
+
32
+ cd mydemoapp
33
+ ruby -I ~/Work/p4/zss/src/vlad/dev/lib -S rake -t vlad:setup vlad:update
34
+
35
+ kill %1" > go.sh
36
+ chmod u+x go.sh
37
+
38
+ rails mydemoapp
39
+
40
+ cd mydemoapp
41
+
42
+ echo "require 'rubygems'
43
+ require 'vlad'
44
+ Vlad.load" >> Rakefile
45
+
46
+ echo "set :repository, 'svn://localhost/blah'
47
+ set :domain, 'localhost'
48
+ set :web_command, 'sudo apachectl'" > config/deploy.rb
49
+
50
+ # TODO: add a knob
51
+ if [ -n "$N" ]; then
52
+ echo "set(:deploy_to, :per_thread) {
53
+ File.expand_path(\"~/demo/website_#{target_host}\")
54
+ }
55
+
56
+ %w(current_path current_release latest_release
57
+ previous_release releases_path release_path
58
+ scm_path shared_path).each do |name|
59
+ Rake::RemoteTask.per_thread[name] = true
60
+ end
61
+
62
+ (1..$N).each do |n|
63
+ host 'localhost%02d' % n, :web, :app
64
+ end" >> config/deploy.rb
65
+ else
66
+ echo "set :deploy_to, File.expand_path('~/demo/website')" >> config/deploy.rb
67
+ fi
68
+
69
+ svn import -m Added . svn://localhost/blah
70
+
71
+ echo
72
+ echo "Here is your config:"
73
+ cat config/deploy.rb
74
+ echo
75
+ echo "Here are the tasks available:"
76
+ echo
77
+
78
+ ruby -I ~/Work/p4/zss/src/vlad/dev/lib -S rake -T vlad
79
+
80
+ echo
81
+ echo "The next step deploys and fires up the application"
82
+ echo
83
+ pause
84
+
85
+ ruby -I ~/Work/p4/zss/src/vlad/dev/lib -S rake -t vlad:setup vlad:update vlad:start
86
+
87
+ open http://localhost:8000/
88
+
89
+ echo
90
+ echo "done! check it out"
91
+ echo
92
+ pause
93
+
94
+ ruby -I ~/Work/p4/zss/src/vlad/dev/lib -S rake vlad:stop
95
+
96
+ kill %1
97
+
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fpauser-vlad
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Davis
9
+ - Eric Hodel
10
+ - Wilson Bilkovich
11
+ - Falk Pauser
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2011-06-22 00:00:00.000000000 +02:00
16
+ default_executable:
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: rake
20
+ requirement: &7940880 !ruby/object:Gem::Requirement
21
+ none: false
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
25
+ version: 0.8.0
26
+ type: :runtime
27
+ prerelease: false
28
+ version_requirements: *7940880
29
+ - !ruby/object:Gem::Dependency
30
+ name: open4
31
+ requirement: &7940380 !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: 0.9.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: *7940380
40
+ - !ruby/object:Gem::Dependency
41
+ name: fpauser-rake-remote_task
42
+ requirement: &7939820 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: *7939820
51
+ description: ! "\n Vlad the Deployer is pragmatic application deployment automation,
52
+ without mercy.\n Much like Capistrano, but with 1/10th the complexity. Vlad integrates
53
+ seamlessly\n with Rake, and uses familiar and standard tools like ssh and rsync.
54
+ Impale your\n application on the heartless spike of the Deployer.\n "
55
+ email:
56
+ - ryand-ruby@zenspider.com
57
+ - drbrain@segment7.net
58
+ - wilson@supremetyrant.com
59
+ - falk.pauser@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files:
63
+ - README.txt
64
+ files:
65
+ - .autotest
66
+ - Gemfile
67
+ - Gemfile.lock
68
+ - History.txt
69
+ - Manifest.txt
70
+ - README.txt
71
+ - Rakefile
72
+ - considerations.txt
73
+ - doco/deploying-merb-with-vlad.txt
74
+ - doco/deploying-sinatra-with-vlad.txt
75
+ - doco/faq.txt
76
+ - doco/getting_started.txt
77
+ - doco/migration.txt
78
+ - doco/perforce.txt
79
+ - doco/variables.txt
80
+ - lib/vlad.rb
81
+ - lib/vlad/apache.rb
82
+ - lib/vlad/core.rb
83
+ - lib/vlad/maintenance.rb
84
+ - lib/vlad/passenger.rb
85
+ - lib/vlad/rails.rb
86
+ - lib/vlad/subversion.rb
87
+ - test/test_vlad.rb
88
+ - test/test_vlad_subversion.rb
89
+ - vladdemo.sh
90
+ has_rdoc: true
91
+ homepage: http://github.com/fpauser/vlad
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: 1.3.6
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 1.6.2
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: Vlad the Deployer is pragmatic application deployment automation, without
115
+ mercy.
116
+ test_files: []