deployml 0.3.0 → 0.4.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/ChangeLog.md +26 -0
- data/README.md +25 -1
- data/gemspec.yml +1 -1
- data/lib/deployml/cli.rb +102 -13
- data/lib/deployml/environment.rb +199 -4
- data/lib/deployml/frameworks/rails.rb +20 -0
- data/lib/deployml/frameworks/rails2.rb +13 -0
- data/lib/deployml/frameworks/rails3.rb +21 -0
- data/lib/deployml/local_shell.rb +4 -9
- data/lib/deployml/options/mongrel.rb +4 -0
- data/lib/deployml/options/thin.rb +3 -0
- data/lib/deployml/project.rb +43 -40
- data/lib/deployml/remote_shell.rb +20 -6
- data/lib/deployml/servers/apache.rb +22 -0
- data/lib/deployml/servers/mongrel.rb +44 -0
- data/lib/deployml/servers/thin.rb +44 -0
- data/lib/deployml/shell.rb +32 -13
- data/lib/deployml/version.rb +1 -1
- data/spec/remote_shell_spec.rb +66 -0
- metadata +9 -6
data/ChangeLog.md
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
### 0.4.0 / 2010-11-29
|
2
|
+
|
3
|
+
* Require addressable ~> 2.2.0.
|
4
|
+
* Added methods to {DeploYML::Environment} inorder to mirror
|
5
|
+
{DeploYML::Project}:
|
6
|
+
* `invoke`
|
7
|
+
* `setup!`
|
8
|
+
* `update!`
|
9
|
+
* `install!`
|
10
|
+
* `migrate!`
|
11
|
+
* `config!`
|
12
|
+
* `start!`
|
13
|
+
* `stop!`
|
14
|
+
* Added {DeploYML::Shell#status} for printing ANSI colored status messages.
|
15
|
+
* Added {DeploYML::RemoteShell#uri}.
|
16
|
+
* Added {DeploYML::RemoteShell#history}.
|
17
|
+
* Added missing documentation.
|
18
|
+
* Give the root directory passed to {DeploYML::Project#initialize} the
|
19
|
+
default of `Dir.pwd`.
|
20
|
+
* If the destination URI has the scheme of `file:`, have
|
21
|
+
{DeploYML::Environment#remote_shell} return a {DeploYML::LocalShell}.
|
22
|
+
* This should facilitate local deploys.
|
23
|
+
* Perform a forced pull in {DeploYML::Environment#update}.
|
24
|
+
* Override {DeploYML::Environment#rake} in {DeploYML::Frameworks::Rails}.
|
25
|
+
* Escape all arguments of all commands in {DeploYML::RemoteShell#join}.
|
26
|
+
|
1
27
|
### 0.3.0 / 2010-11-21
|
2
28
|
|
3
29
|
* Initial release:
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
* [Source](http://github.com/postmodern/deployml)
|
4
4
|
* [Issues](http://github.com/postmodern/deployml/issues)
|
5
|
+
* [Documentation](http://rubydoc.info/gems/deployml/frames)
|
5
6
|
* Postmodern (postmodern.mod3 at gmail.com)
|
6
7
|
|
7
8
|
## Description
|
@@ -63,6 +64,29 @@ Specifying a `server` with options:
|
|
63
64
|
socket: /var/run/thin.sock
|
64
65
|
rackup: true
|
65
66
|
|
67
|
+
Multiple environments:
|
68
|
+
|
69
|
+
# config/deploy.yml
|
70
|
+
source: git@github.com:user/project.git
|
71
|
+
framework: rails3
|
72
|
+
orm: datamapper
|
73
|
+
|
74
|
+
# config/deploy/staging.yml
|
75
|
+
dest: ssh://deploy@www.example.com/srv/staging
|
76
|
+
server:
|
77
|
+
name: thin
|
78
|
+
options:
|
79
|
+
config: /etc/thin/staging.yml
|
80
|
+
socket: /tmp/thin.staging.sock
|
81
|
+
|
82
|
+
# config/deploy/production.yml
|
83
|
+
dest: ssh://deploy@www.example.com/srv/project
|
84
|
+
server:
|
85
|
+
name: thin
|
86
|
+
options:
|
87
|
+
config: /etc/thin/example.yml
|
88
|
+
socket: /tmp/thin.example.sock
|
89
|
+
|
66
90
|
## Synopsis
|
67
91
|
|
68
92
|
Cold-Deploy a new project:
|
@@ -91,7 +115,7 @@ List available tasks:
|
|
91
115
|
|
92
116
|
## Requirements
|
93
117
|
|
94
|
-
* [addressable](http://addressable.rubyforge.org/) ~> 2.
|
118
|
+
* [addressable](http://addressable.rubyforge.org/) ~> 2.2.0
|
95
119
|
* [rprogram](http://github.com/postmodern/rprogram) ~> 0.2.0
|
96
120
|
* [thor](http://github.com/wycats/thor) ~> 0.14.3
|
97
121
|
|
data/gemspec.yml
CHANGED
data/lib/deployml/cli.rb
CHANGED
@@ -4,31 +4,65 @@ require 'thor'
|
|
4
4
|
require 'pathname'
|
5
5
|
|
6
6
|
module DeploYML
|
7
|
+
#
|
8
|
+
# The command-line interface to {DeploYML} using
|
9
|
+
# [Thor](http://github.com/wycats/thor#readme).
|
10
|
+
#
|
7
11
|
class CLI < Thor
|
8
12
|
|
9
13
|
namespace 'deploy'
|
10
14
|
|
11
15
|
desc 'exec', 'Runs a command on the deploy server'
|
12
|
-
method_option :environment, :type => :string,
|
16
|
+
method_option :environment, :type => :string,
|
17
|
+
:default => 'production',
|
18
|
+
:aliases => '-E'
|
19
|
+
|
20
|
+
#
|
21
|
+
# Executes a command in the specified environment.
|
22
|
+
#
|
23
|
+
# @param [String] command
|
24
|
+
# The full command to execute.
|
25
|
+
#
|
13
26
|
def exec(command)
|
14
27
|
environment.exec(command)
|
15
28
|
end
|
16
29
|
|
17
30
|
desc 'rake', 'Executes a rake task on the deploy server'
|
18
|
-
method_option :environment, :type => :string,
|
31
|
+
method_option :environment, :type => :string,
|
32
|
+
:default => 'production',
|
33
|
+
:aliases => '-E'
|
19
34
|
method_option :args, :type => :array
|
35
|
+
|
36
|
+
#
|
37
|
+
# Invokes a rake task in the specified environment.
|
38
|
+
#
|
39
|
+
# @param [String] task
|
40
|
+
# The name of the rake task.
|
41
|
+
#
|
20
42
|
def rake(task)
|
21
43
|
environment.rake(task,*(options[:args]))
|
22
44
|
end
|
23
45
|
|
24
46
|
desc 'ssh', 'Starts a SSH session with the deploy server'
|
25
|
-
method_option :environment, :type => :string,
|
47
|
+
method_option :environment, :type => :string,
|
48
|
+
:default => 'production',
|
49
|
+
:aliases => '-E'
|
50
|
+
|
51
|
+
#
|
52
|
+
# Starts an SSH session with the specified environment.
|
53
|
+
#
|
26
54
|
def ssh
|
27
55
|
environment.ssh
|
28
56
|
end
|
29
57
|
|
30
58
|
desc 'setup', 'Sets up the deployment repository for the project'
|
31
|
-
method_option :environment, :type => :string,
|
59
|
+
method_option :environment, :type => :string,
|
60
|
+
:default => 'production',
|
61
|
+
:aliases => '-E'
|
62
|
+
|
63
|
+
#
|
64
|
+
# Sets up the specified environment.
|
65
|
+
#
|
32
66
|
def setup
|
33
67
|
status 'Setting up ...'
|
34
68
|
|
@@ -38,7 +72,13 @@ module DeploYML
|
|
38
72
|
end
|
39
73
|
|
40
74
|
desc 'update', 'Updates the deployment repository of the project'
|
41
|
-
method_option :environment, :type => :string,
|
75
|
+
method_option :environment, :type => :string,
|
76
|
+
:default => 'production',
|
77
|
+
:aliases => '-E'
|
78
|
+
|
79
|
+
#
|
80
|
+
# Updates the deployment repository of the specified environment.
|
81
|
+
#
|
42
82
|
def update
|
43
83
|
status 'Updating'
|
44
84
|
|
@@ -48,7 +88,13 @@ module DeploYML
|
|
48
88
|
end
|
49
89
|
|
50
90
|
desc 'install', 'Installs the project on the deploy server'
|
51
|
-
method_option :environment, :type => :string,
|
91
|
+
method_option :environment, :type => :string,
|
92
|
+
:default => 'production',
|
93
|
+
:aliases => '-E'
|
94
|
+
|
95
|
+
#
|
96
|
+
# Installs any needed dependencies in the specified environment.
|
97
|
+
#
|
52
98
|
def install
|
53
99
|
status 'Installing ...'
|
54
100
|
|
@@ -58,7 +104,13 @@ module DeploYML
|
|
58
104
|
end
|
59
105
|
|
60
106
|
desc 'migrate', 'Migrates the database for the project'
|
61
|
-
method_option :environment, :type => :string,
|
107
|
+
method_option :environment, :type => :string,
|
108
|
+
:default => 'production',
|
109
|
+
:aliases => '-E'
|
110
|
+
|
111
|
+
#
|
112
|
+
# Migrates the database for the specified environment.
|
113
|
+
#
|
62
114
|
def migrate
|
63
115
|
status 'Migrating ...'
|
64
116
|
|
@@ -68,7 +120,13 @@ module DeploYML
|
|
68
120
|
end
|
69
121
|
|
70
122
|
desc 'config', 'Configures the server for the project'
|
71
|
-
method_option :environment, :type => :string,
|
123
|
+
method_option :environment, :type => :string,
|
124
|
+
:default => 'production',
|
125
|
+
:aliases => '-E'
|
126
|
+
|
127
|
+
#
|
128
|
+
# Configures the server for the specified environment.
|
129
|
+
#
|
72
130
|
def config
|
73
131
|
status 'Configuring ...'
|
74
132
|
|
@@ -78,8 +136,13 @@ module DeploYML
|
|
78
136
|
end
|
79
137
|
|
80
138
|
desc 'start', 'Starts the server for the project'
|
81
|
-
method_option :environment, :type => :string,
|
139
|
+
method_option :environment, :type => :string,
|
140
|
+
:default => 'production',
|
141
|
+
:aliases => '-E'
|
82
142
|
|
143
|
+
#
|
144
|
+
# Starts the server in the specified environment.
|
145
|
+
#
|
83
146
|
def start
|
84
147
|
status 'Starting ...'
|
85
148
|
|
@@ -89,8 +152,13 @@ module DeploYML
|
|
89
152
|
end
|
90
153
|
|
91
154
|
desc 'stop', 'Stops the server for the project'
|
92
|
-
method_option :environment, :type => :string,
|
155
|
+
method_option :environment, :type => :string,
|
156
|
+
:default => 'production',
|
157
|
+
:aliases => '-E'
|
93
158
|
|
159
|
+
#
|
160
|
+
# Stops the server in the specified environment.
|
161
|
+
#
|
94
162
|
def stop
|
95
163
|
status 'Stopping ...'
|
96
164
|
|
@@ -100,8 +168,13 @@ module DeploYML
|
|
100
168
|
end
|
101
169
|
|
102
170
|
desc 'restart', 'Restarts the server for the project'
|
103
|
-
method_option :environment, :type => :string,
|
171
|
+
method_option :environment, :type => :string,
|
172
|
+
:default => 'production',
|
173
|
+
:aliases => '-E'
|
104
174
|
|
175
|
+
#
|
176
|
+
# Restarts the server in the specified environment.
|
177
|
+
#
|
105
178
|
def restart
|
106
179
|
status 'Restarting ...'
|
107
180
|
|
@@ -111,8 +184,13 @@ module DeploYML
|
|
111
184
|
end
|
112
185
|
|
113
186
|
desc 'deploy', 'Cold-Deploys a new project'
|
114
|
-
method_option :environment, :type => :string,
|
187
|
+
method_option :environment, :type => :string,
|
188
|
+
:default => 'production',
|
189
|
+
:aliases => '-E'
|
115
190
|
|
191
|
+
#
|
192
|
+
# Cold-deploys into the specified environment.
|
193
|
+
#
|
116
194
|
def deploy
|
117
195
|
status 'Deploying ...'
|
118
196
|
|
@@ -122,8 +200,13 @@ module DeploYML
|
|
122
200
|
end
|
123
201
|
|
124
202
|
desc 'redeploy', 'Redeploys the project'
|
125
|
-
method_option :environment, :type => :string,
|
203
|
+
method_option :environment, :type => :string,
|
204
|
+
:default => 'production',
|
205
|
+
:aliases => '-E'
|
126
206
|
|
207
|
+
#
|
208
|
+
# Redeploys into the specified environment.
|
209
|
+
#
|
127
210
|
def redeploy
|
128
211
|
status 'Redeploying ...'
|
129
212
|
|
@@ -184,6 +267,12 @@ module DeploYML
|
|
184
267
|
project.environment(options[:environment])
|
185
268
|
end
|
186
269
|
|
270
|
+
#
|
271
|
+
# Prints a status message.
|
272
|
+
#
|
273
|
+
# @param [String] message
|
274
|
+
# The message to print.
|
275
|
+
#
|
187
276
|
def status(message)
|
188
277
|
shell.say_status "[#{options[:environment]}]", message
|
189
278
|
end
|
data/lib/deployml/environment.rb
CHANGED
@@ -8,6 +8,10 @@ require 'deployml/servers'
|
|
8
8
|
require 'deployml/frameworks'
|
9
9
|
|
10
10
|
module DeploYML
|
11
|
+
#
|
12
|
+
# Contains environment specific configuration loaded by {Project}
|
13
|
+
# from YAML files within `config/deploy/`.
|
14
|
+
#
|
11
15
|
class Environment < Configuration
|
12
16
|
|
13
17
|
# Mapping of possible 'server' names to their mixins.
|
@@ -82,13 +86,18 @@ module DeploYML
|
|
82
86
|
# @yieldparam [RemoteShell] shell
|
83
87
|
# The remote shell.
|
84
88
|
#
|
85
|
-
# @return [RemoteShell]
|
86
|
-
# The remote shell.
|
89
|
+
# @return [RemoteShell, LocalShell]
|
90
|
+
# The remote shell. If the destination is a local `file://` URI,
|
91
|
+
# a local shell will be returned instead.
|
87
92
|
#
|
88
93
|
# @since 0.3.0
|
89
94
|
#
|
90
95
|
def remote_shell(&block)
|
91
|
-
|
96
|
+
unless @dest.scheme == 'file'
|
97
|
+
RemoteShell.new(@dest,&block)
|
98
|
+
else
|
99
|
+
LocalShell.new(&block)
|
100
|
+
end
|
92
101
|
end
|
93
102
|
|
94
103
|
#
|
@@ -162,7 +171,7 @@ module DeploYML
|
|
162
171
|
#
|
163
172
|
def update(shell)
|
164
173
|
shell.run 'git', 'reset', '--hard', 'HEAD'
|
165
|
-
shell.run 'git', 'pull'
|
174
|
+
shell.run 'git', 'pull', '-f'
|
166
175
|
end
|
167
176
|
|
168
177
|
#
|
@@ -231,6 +240,192 @@ module DeploYML
|
|
231
240
|
def server_restart(shell)
|
232
241
|
end
|
233
242
|
|
243
|
+
#
|
244
|
+
# Deploys the project.
|
245
|
+
#
|
246
|
+
# @param [Array<Symbol>] tasks
|
247
|
+
# The tasks to run during the deployment.
|
248
|
+
#
|
249
|
+
# @return [true]
|
250
|
+
# Indicates that the tasks were successfully completed.
|
251
|
+
#
|
252
|
+
# @since 0.4.0
|
253
|
+
#
|
254
|
+
def invoke(tasks)
|
255
|
+
remote_shell do |shell|
|
256
|
+
# setup the deployment repository
|
257
|
+
if tasks.include?(:setup)
|
258
|
+
shell.status "Cloning #{@source} ..."
|
259
|
+
setup(shell)
|
260
|
+
shell.status "Cloned."
|
261
|
+
end
|
262
|
+
|
263
|
+
# cd into the deployment repository
|
264
|
+
shell.cd @dest.path
|
265
|
+
|
266
|
+
# update the deployment repository
|
267
|
+
if tasks.include?(:update)
|
268
|
+
shell.status "Updating #{@dest.path} ..."
|
269
|
+
update(shell)
|
270
|
+
shell.status "Updated."
|
271
|
+
end
|
272
|
+
|
273
|
+
# framework tasks
|
274
|
+
if tasks.include?(:install)
|
275
|
+
shell.status "Installing additional dependencies ..."
|
276
|
+
install(shell)
|
277
|
+
shell.status "Dependencies installed."
|
278
|
+
end
|
279
|
+
|
280
|
+
if tasks.include?(:migrate)
|
281
|
+
shell.status "Migrating database ..."
|
282
|
+
migrate(shell)
|
283
|
+
shell.status "Database migrated."
|
284
|
+
end
|
285
|
+
|
286
|
+
# server tasks
|
287
|
+
if tasks.include?(:config)
|
288
|
+
shell.status "Configuring server ..."
|
289
|
+
server_config(shell)
|
290
|
+
shell.status "Server configured."
|
291
|
+
elsif tasks.include?(:start)
|
292
|
+
shell.status "Starting server ..."
|
293
|
+
server_start(shell)
|
294
|
+
shell.status "Server started."
|
295
|
+
elsif tasks.include?(:stop)
|
296
|
+
shell.status "Stopping server ..."
|
297
|
+
server_stop(shell)
|
298
|
+
shell.status "Server stopped."
|
299
|
+
elsif tasks.include?(:restart)
|
300
|
+
shell.status "Restarting server ..."
|
301
|
+
server_restart(shell)
|
302
|
+
shell.status "Server restarted."
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
return true
|
307
|
+
end
|
308
|
+
|
309
|
+
#
|
310
|
+
# Sets up the deployment repository for the project.
|
311
|
+
#
|
312
|
+
# @return [true]
|
313
|
+
# Indicates that the tasks were successfully completed.
|
314
|
+
#
|
315
|
+
# @since 0.4.0
|
316
|
+
#
|
317
|
+
def setup!
|
318
|
+
invoke [:setup]
|
319
|
+
end
|
320
|
+
|
321
|
+
#
|
322
|
+
# Updates the deployed repository of the project.
|
323
|
+
#
|
324
|
+
# @return [true]
|
325
|
+
# Indicates that the tasks were successfully completed.
|
326
|
+
#
|
327
|
+
# @since 0.4.0
|
328
|
+
#
|
329
|
+
def update!
|
330
|
+
invoke [:update]
|
331
|
+
end
|
332
|
+
|
333
|
+
#
|
334
|
+
# Installs the project on the destination server.
|
335
|
+
#
|
336
|
+
# @return [true]
|
337
|
+
# Indicates that the tasks were successfully completed.
|
338
|
+
#
|
339
|
+
# @since 0.4.0
|
340
|
+
#
|
341
|
+
def install!
|
342
|
+
invoke [:install]
|
343
|
+
end
|
344
|
+
|
345
|
+
#
|
346
|
+
# Migrates the database used by the project.
|
347
|
+
#
|
348
|
+
# @return [true]
|
349
|
+
# Indicates that the tasks were successfully completed.
|
350
|
+
#
|
351
|
+
# @since 0.4.0
|
352
|
+
#
|
353
|
+
def migrate!
|
354
|
+
invoke [:migrate]
|
355
|
+
end
|
356
|
+
|
357
|
+
#
|
358
|
+
# Configures the Web server to be ran on the destination server.
|
359
|
+
#
|
360
|
+
# @return [true]
|
361
|
+
# Indicates that the tasks were successfully completed.
|
362
|
+
#
|
363
|
+
# @since 0.4.0
|
364
|
+
#
|
365
|
+
def config!
|
366
|
+
invoke [:config]
|
367
|
+
end
|
368
|
+
|
369
|
+
#
|
370
|
+
# Starts the Web server for the project.
|
371
|
+
#
|
372
|
+
# @return [true]
|
373
|
+
# Indicates that the tasks were successfully completed.
|
374
|
+
#
|
375
|
+
# @since 0.4.0
|
376
|
+
#
|
377
|
+
def start!
|
378
|
+
invoke [:start]
|
379
|
+
end
|
380
|
+
|
381
|
+
#
|
382
|
+
# Stops the Web server for the project.
|
383
|
+
#
|
384
|
+
# @return [true]
|
385
|
+
# Indicates that the tasks were successfully completed.
|
386
|
+
#
|
387
|
+
# @since 0.4.0
|
388
|
+
#
|
389
|
+
def stop!
|
390
|
+
invoke [:stop]
|
391
|
+
end
|
392
|
+
|
393
|
+
#
|
394
|
+
# Restarts the Web server for the project.
|
395
|
+
#
|
396
|
+
# @return [true]
|
397
|
+
# Indicates that the tasks were successfully completed.
|
398
|
+
#
|
399
|
+
# @since 0.4.0
|
400
|
+
#
|
401
|
+
def restart!
|
402
|
+
invoke [:restart]
|
403
|
+
end
|
404
|
+
|
405
|
+
#
|
406
|
+
# Deploys a new project.
|
407
|
+
#
|
408
|
+
# @return [true]
|
409
|
+
# Indicates that the tasks were successfully completed.
|
410
|
+
#
|
411
|
+
# @since 0.4.0
|
412
|
+
#
|
413
|
+
def deploy!
|
414
|
+
invoke [:setup, :install, :migrate, :config, :start]
|
415
|
+
end
|
416
|
+
|
417
|
+
#
|
418
|
+
# Redeploys a project.
|
419
|
+
#
|
420
|
+
# @return [true]
|
421
|
+
# Indicates that the tasks were successfully completed.
|
422
|
+
#
|
423
|
+
# @since 0.4.0
|
424
|
+
#
|
425
|
+
def redeploy!
|
426
|
+
invoke [:update, :install, :migrate, :restart]
|
427
|
+
end
|
428
|
+
|
234
429
|
protected
|
235
430
|
|
236
431
|
#
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DeploYML
|
2
|
+
module Frameworks
|
3
|
+
#
|
4
|
+
# Provides common methods needed to deploy Rails 2 and 3 projects.
|
5
|
+
#
|
6
|
+
module Rails
|
7
|
+
#
|
8
|
+
# Overrides the default `rake` method to add a `RAILS_ENV`
|
9
|
+
# environment variable.
|
10
|
+
#
|
11
|
+
# @see {Environment#rake}
|
12
|
+
#
|
13
|
+
def rake(task,*args)
|
14
|
+
args += ["RAILS_ENV=#{@environment}"]
|
15
|
+
|
16
|
+
super(task,*args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,6 +1,19 @@
|
|
1
|
+
require 'deployml/frameworks/rails'
|
2
|
+
|
1
3
|
module DeploYML
|
2
4
|
module Frameworks
|
5
|
+
#
|
6
|
+
# Provides methods for deploying Rails 2 projects.
|
7
|
+
#
|
3
8
|
module Rails2
|
9
|
+
include Rails
|
10
|
+
|
11
|
+
#
|
12
|
+
# Migrates the database using the `db:migrate` task.
|
13
|
+
#
|
14
|
+
# @param [LocalShell, RemoteShell] shell
|
15
|
+
# The shell to execute commands in.
|
16
|
+
#
|
4
17
|
def migrate(shell)
|
5
18
|
shell.run 'rake', 'db:migrate', "RAILS_ENV=#{@environment}"
|
6
19
|
end
|
@@ -1,10 +1,31 @@
|
|
1
|
+
require 'deployml/frameworks/rails'
|
2
|
+
|
1
3
|
module DeploYML
|
2
4
|
module Frameworks
|
5
|
+
#
|
6
|
+
# Provides methods for deploying Rails 3 projects.
|
7
|
+
#
|
3
8
|
module Rails3
|
9
|
+
include Rails
|
10
|
+
|
11
|
+
#
|
12
|
+
# Installs any dependencies using `bundle install --deployment`.
|
13
|
+
#
|
14
|
+
# @param [LocalShell, RemoteShell] shell
|
15
|
+
# The shell to execute commands in.
|
16
|
+
#
|
4
17
|
def install(shell)
|
5
18
|
shell.run 'bundle', 'install', '--deployment'
|
6
19
|
end
|
7
20
|
|
21
|
+
#
|
22
|
+
# Migrates the database using the `db:autoupgrade` if
|
23
|
+
# [DataMapper](http://datamapper.org) is being used, or the typical
|
24
|
+
# `db:migrate` task.
|
25
|
+
#
|
26
|
+
# @param [LocalShell, RemoteShell] shell
|
27
|
+
# The shell to execute commands in.
|
28
|
+
#
|
8
29
|
def migrate(shell)
|
9
30
|
task = case @orm
|
10
31
|
when :datamapper
|
data/lib/deployml/local_shell.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'deployml/shell'
|
2
2
|
|
3
3
|
module DeploYML
|
4
|
+
#
|
5
|
+
# Represents a shell running on the local system.
|
6
|
+
#
|
4
7
|
class LocalShell
|
5
8
|
|
6
9
|
include Shell
|
@@ -39,15 +42,7 @@ module DeploYML
|
|
39
42
|
# the block has returned.
|
40
43
|
#
|
41
44
|
def cd(path,&block)
|
42
|
-
|
43
|
-
cwd = Dir.pwd
|
44
|
-
|
45
|
-
Dir.chdir(path)
|
46
|
-
block.call()
|
47
|
-
Dir.chdir(cwd)
|
48
|
-
else
|
49
|
-
Dir.chdir(path)
|
50
|
-
end
|
45
|
+
Dir.chdir(path,&block)
|
51
46
|
end
|
52
47
|
|
53
48
|
end
|
@@ -2,8 +2,12 @@ require 'rprogram/task'
|
|
2
2
|
|
3
3
|
module DeploYML
|
4
4
|
module Options
|
5
|
+
#
|
6
|
+
# Maps in command-line options for the `mongrel_rails` utility.
|
7
|
+
#
|
5
8
|
class Mongrel < RProgram::Task
|
6
9
|
|
10
|
+
# Default options for Mongrel
|
7
11
|
DEFAULTS = {
|
8
12
|
:environment => :production,
|
9
13
|
:address => '127.0.0.1',
|
data/lib/deployml/project.rb
CHANGED
@@ -37,7 +37,7 @@ module DeploYML
|
|
37
37
|
# The configuration file for the project could not be found
|
38
38
|
# in any of the common directories.
|
39
39
|
#
|
40
|
-
def initialize(root)
|
40
|
+
def initialize(root=Dir.pwd)
|
41
41
|
@root = File.expand_path(root)
|
42
42
|
@config_file = File.join(@root,CONFIG_DIR,CONFIG_FILE)
|
43
43
|
@environments_dir = File.join(@root,CONFIG_DIR,ENVIRONMENTS_DIR)
|
@@ -117,39 +117,12 @@ module DeploYML
|
|
117
117
|
# The environment to deploy to.
|
118
118
|
#
|
119
119
|
# @return [true]
|
120
|
+
# Indicates that the tasks were successfully completed.
|
120
121
|
#
|
121
122
|
# @since 0.2.0
|
122
123
|
#
|
123
124
|
def invoke(tasks,env=:production)
|
124
|
-
|
125
|
-
|
126
|
-
env.remote_shell do |shell|
|
127
|
-
# setup the deployment repository
|
128
|
-
env.setup(shell) if tasks.include?(:setup)
|
129
|
-
|
130
|
-
# cd into the deployment repository
|
131
|
-
shell.cd env.dest.path
|
132
|
-
|
133
|
-
# update the deployment repository
|
134
|
-
env.update(shell) if tasks.include?(:update)
|
135
|
-
|
136
|
-
# framework tasks
|
137
|
-
env.install(shell) if tasks.include?(:install)
|
138
|
-
env.migrate(shell) if tasks.include?(:migrate)
|
139
|
-
|
140
|
-
# server tasks
|
141
|
-
if tasks.include?(:config)
|
142
|
-
env.server_config(shell)
|
143
|
-
elsif tasks.include?(:start)
|
144
|
-
env.server_start(shell)
|
145
|
-
elsif tasks.include?(:stop)
|
146
|
-
env.server_stop(shell)
|
147
|
-
elsif tasks.include?(:restart)
|
148
|
-
env.server_restart(shell)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
return true
|
125
|
+
environment(env).invoke(tasks)
|
153
126
|
end
|
154
127
|
|
155
128
|
#
|
@@ -158,8 +131,11 @@ module DeploYML
|
|
158
131
|
# @param [Symbol, String] env
|
159
132
|
# The environment to deploy to.
|
160
133
|
#
|
134
|
+
# @return [true]
|
135
|
+
# Indicates that the tasks were successfully completed.
|
136
|
+
#
|
161
137
|
def setup!(env=:production)
|
162
|
-
|
138
|
+
environment(env).setup!
|
163
139
|
end
|
164
140
|
|
165
141
|
#
|
@@ -168,8 +144,11 @@ module DeploYML
|
|
168
144
|
# @param [Symbol, String] env
|
169
145
|
# The environment to deploy to.
|
170
146
|
#
|
147
|
+
# @return [true]
|
148
|
+
# Indicates that the tasks were successfully completed.
|
149
|
+
#
|
171
150
|
def update!(env=:production)
|
172
|
-
|
151
|
+
environment(env).update!
|
173
152
|
end
|
174
153
|
|
175
154
|
#
|
@@ -178,8 +157,11 @@ module DeploYML
|
|
178
157
|
# @param [Symbol, String] env
|
179
158
|
# The environment to deploy to.
|
180
159
|
#
|
160
|
+
# @return [true]
|
161
|
+
# Indicates that the tasks were successfully completed.
|
162
|
+
#
|
181
163
|
def install!(env=:production)
|
182
|
-
|
164
|
+
environment(env).install!
|
183
165
|
end
|
184
166
|
|
185
167
|
#
|
@@ -188,8 +170,11 @@ module DeploYML
|
|
188
170
|
# @param [Symbol, String] env
|
189
171
|
# The environment to deploy to.
|
190
172
|
#
|
173
|
+
# @return [true]
|
174
|
+
# Indicates that the tasks were successfully completed.
|
175
|
+
#
|
191
176
|
def migrate!(env=:production)
|
192
|
-
|
177
|
+
environment(env).migrate!
|
193
178
|
end
|
194
179
|
|
195
180
|
#
|
@@ -198,8 +183,11 @@ module DeploYML
|
|
198
183
|
# @param [Symbol, String] env
|
199
184
|
# The environment to deploy to.
|
200
185
|
#
|
186
|
+
# @return [true]
|
187
|
+
# Indicates that the tasks were successfully completed.
|
188
|
+
#
|
201
189
|
def config!(env=:production)
|
202
|
-
|
190
|
+
environment(env).config!
|
203
191
|
end
|
204
192
|
|
205
193
|
#
|
@@ -208,8 +196,11 @@ module DeploYML
|
|
208
196
|
# @param [Symbol, String] env
|
209
197
|
# The environment to deploy to.
|
210
198
|
#
|
199
|
+
# @return [true]
|
200
|
+
# Indicates that the tasks were successfully completed.
|
201
|
+
#
|
211
202
|
def start!(env=:production)
|
212
|
-
|
203
|
+
environment(env).start!
|
213
204
|
end
|
214
205
|
|
215
206
|
#
|
@@ -218,8 +209,11 @@ module DeploYML
|
|
218
209
|
# @param [Symbol, String] env
|
219
210
|
# The environment to deploy to.
|
220
211
|
#
|
212
|
+
# @return [true]
|
213
|
+
# Indicates that the tasks were successfully completed.
|
214
|
+
#
|
221
215
|
def stop!(env=:production)
|
222
|
-
|
216
|
+
environment(env).stop!
|
223
217
|
end
|
224
218
|
|
225
219
|
#
|
@@ -228,8 +222,11 @@ module DeploYML
|
|
228
222
|
# @param [Symbol, String] env
|
229
223
|
# The environment to deploy to.
|
230
224
|
#
|
225
|
+
# @return [true]
|
226
|
+
# Indicates that the tasks were successfully completed.
|
227
|
+
#
|
231
228
|
def restart!(env=:production)
|
232
|
-
|
229
|
+
environment(env).restart!
|
233
230
|
end
|
234
231
|
|
235
232
|
#
|
@@ -238,10 +235,13 @@ module DeploYML
|
|
238
235
|
# @param [Symbol, String] env
|
239
236
|
# The environment to deploy to.
|
240
237
|
#
|
238
|
+
# @return [true]
|
239
|
+
# Indicates that the tasks were successfully completed.
|
240
|
+
#
|
241
241
|
# @since 0.2.0
|
242
242
|
#
|
243
243
|
def deploy!(env=:production)
|
244
|
-
|
244
|
+
environment(env).deploy!
|
245
245
|
end
|
246
246
|
|
247
247
|
#
|
@@ -250,10 +250,13 @@ module DeploYML
|
|
250
250
|
# @param [Symbol, String] env
|
251
251
|
# The environment to deploy to.
|
252
252
|
#
|
253
|
+
# @return [true]
|
254
|
+
# Indicates that the tasks were successfully completed.
|
255
|
+
#
|
253
256
|
# @since 0.2.0
|
254
257
|
#
|
255
258
|
def redeploy!(env=:production)
|
256
|
-
|
259
|
+
environment(env).redeploy!
|
257
260
|
end
|
258
261
|
|
259
262
|
protected
|
@@ -1,9 +1,22 @@
|
|
1
1
|
require 'deployml/shell'
|
2
2
|
|
3
|
+
require 'addressable/uri'
|
4
|
+
require 'shellwords'
|
5
|
+
|
3
6
|
module DeploYML
|
7
|
+
#
|
8
|
+
# Represents a shell running on a remote server.
|
9
|
+
#
|
4
10
|
class RemoteShell
|
5
11
|
|
6
12
|
include Shell
|
13
|
+
include Shellwords
|
14
|
+
|
15
|
+
# The URI of the remote shell
|
16
|
+
attr_reader :uri
|
17
|
+
|
18
|
+
# The history of the Remote Shell
|
19
|
+
attr_reader :history
|
7
20
|
|
8
21
|
#
|
9
22
|
# Initializes a remote shell session.
|
@@ -51,7 +64,7 @@ module DeploYML
|
|
51
64
|
# @param [String] message
|
52
65
|
# The message to echo.
|
53
66
|
#
|
54
|
-
def
|
67
|
+
def echo(message)
|
55
68
|
run 'echo', message
|
56
69
|
end
|
57
70
|
|
@@ -65,12 +78,11 @@ module DeploYML
|
|
65
78
|
# If a block is given, then the directory will be changed back after
|
66
79
|
# the block has returned.
|
67
80
|
#
|
68
|
-
def cd(path
|
81
|
+
def cd(path)
|
69
82
|
@history << ['cd', path]
|
70
83
|
|
71
|
-
if
|
72
|
-
|
73
|
-
|
84
|
+
if block_given?
|
85
|
+
yield
|
74
86
|
@history << ['cd', '-']
|
75
87
|
end
|
76
88
|
end
|
@@ -83,7 +95,9 @@ module DeploYML
|
|
83
95
|
# A single command string.
|
84
96
|
#
|
85
97
|
def join
|
86
|
-
@history.map { |command|
|
98
|
+
@history.map { |command|
|
99
|
+
command.map { |word| shellescape(word) }.join(' ')
|
100
|
+
}.join(' && ')
|
87
101
|
end
|
88
102
|
|
89
103
|
#
|
@@ -2,15 +2,37 @@ require 'deployml/exceptions/invalid_config'
|
|
2
2
|
|
3
3
|
module DeploYML
|
4
4
|
module Servers
|
5
|
+
#
|
6
|
+
# Provides methods for starting, stoping and restarting the
|
7
|
+
# [Apache](http://httpd.apache.org/) web server.
|
8
|
+
#
|
5
9
|
module Apache
|
10
|
+
#
|
11
|
+
# Starts Apache using the `apachectl start` command.
|
12
|
+
#
|
13
|
+
# @param [LocalShell, RemoteShell] shell
|
14
|
+
# The shell to execute commands in.
|
15
|
+
#
|
6
16
|
def server_start(shell)
|
7
17
|
shell.run 'apachectl', 'start'
|
8
18
|
end
|
9
19
|
|
20
|
+
#
|
21
|
+
# Restarts Apache using the `apachectl restart` command.
|
22
|
+
#
|
23
|
+
# @param [LocalShell, RemoteShell] shell
|
24
|
+
# The shell to execute commands in.
|
25
|
+
#
|
10
26
|
def server_restart(shell)
|
11
27
|
shell.run 'apachectl', 'restart'
|
12
28
|
end
|
13
29
|
|
30
|
+
#
|
31
|
+
# Stops Apache using the `apachectl stop` command.
|
32
|
+
#
|
33
|
+
# @param [LocalShell, RemoteShell] shell
|
34
|
+
# The shell to execute commands in.
|
35
|
+
#
|
14
36
|
def server_stop(shell)
|
15
37
|
shell.run 'apachectl', 'stop'
|
16
38
|
end
|
@@ -3,18 +3,44 @@ require 'deployml/options/mongrel'
|
|
3
3
|
|
4
4
|
module DeploYML
|
5
5
|
module Servers
|
6
|
+
#
|
7
|
+
# Provides methods for configuring, starting, stoping and restarting
|
8
|
+
# the [Mongrel](https://github.com/fauna/mongrel) web server.
|
9
|
+
#
|
6
10
|
module Mongrel
|
11
|
+
#
|
12
|
+
# Initializes options used when calling `mongrel`.
|
13
|
+
#
|
7
14
|
def initialize_server
|
8
15
|
@mongrel = Options::Mongrel.new(@server_options)
|
9
16
|
@mongrel.environment ||= @name
|
10
17
|
end
|
11
18
|
|
19
|
+
#
|
20
|
+
# Executes a command via the `mongrel_rails` command.
|
21
|
+
#
|
22
|
+
# @param [LocalShell, RemoteShell] shell
|
23
|
+
# The shell to execute commands in.
|
24
|
+
#
|
25
|
+
# @param [Array] args
|
26
|
+
# Additional arguments to call `mongrel_rails` with.
|
27
|
+
#
|
12
28
|
def mongrel_cluster(shell,*args)
|
13
29
|
options = args + ['-c', @mongrel.config]
|
14
30
|
|
15
31
|
shell.run 'mongrel_rails', *options
|
16
32
|
end
|
17
33
|
|
34
|
+
#
|
35
|
+
# Configures Mongrel by calling `mongrel_rails cluster::configure`.
|
36
|
+
#
|
37
|
+
# @param [LocalShell, RemoteShell] shell
|
38
|
+
# The shell to execute commands in.
|
39
|
+
#
|
40
|
+
# @raise [MissingOption]
|
41
|
+
# No `config` option was listed under the `server` option in the
|
42
|
+
# `deploy.yml` configuration file.
|
43
|
+
#
|
18
44
|
def server_config(shell)
|
19
45
|
unless @mongrel.config
|
20
46
|
raise(MissingOption,"No 'config' option specified under server options",caller)
|
@@ -25,14 +51,32 @@ module DeploYML
|
|
25
51
|
shell.run 'mongrel_rails', 'cluster::configure', *options
|
26
52
|
end
|
27
53
|
|
54
|
+
#
|
55
|
+
# Starts Mongrel by calling `mongrel_rails cluster::start`.
|
56
|
+
#
|
57
|
+
# @param [LocalShell, RemoteShell] shell
|
58
|
+
# The shell to execute commands in.
|
59
|
+
#
|
28
60
|
def server_start(shell)
|
29
61
|
mongrel_cluster 'cluster::start'
|
30
62
|
end
|
31
63
|
|
64
|
+
#
|
65
|
+
# Stops Mongrel by calling `mongrel_rails cluster::stop`.
|
66
|
+
#
|
67
|
+
# @param [LocalShell, RemoteShell] shell
|
68
|
+
# The shell to execute commands in.
|
69
|
+
#
|
32
70
|
def server_stop(shell)
|
33
71
|
mongrel_cluster 'cluster::stop'
|
34
72
|
end
|
35
73
|
|
74
|
+
#
|
75
|
+
# Restarts Mongrel by calling `mongrel_rails cluster::restart`.
|
76
|
+
#
|
77
|
+
# @param [LocalShell, RemoteShell] shell
|
78
|
+
# The shell to execute commands in.
|
79
|
+
#
|
36
80
|
def server_restart(shell)
|
37
81
|
mongrel_cluster 'cluster::restart'
|
38
82
|
end
|
@@ -3,18 +3,44 @@ require 'deployml/options/thin'
|
|
3
3
|
|
4
4
|
module DeploYML
|
5
5
|
module Servers
|
6
|
+
#
|
7
|
+
# Provides methods for configuring, starting, stoping and restarting
|
8
|
+
# the [Thin](http://code.macournoyer.com/thin/) web server.
|
9
|
+
#
|
6
10
|
module Thin
|
11
|
+
#
|
12
|
+
# Initializes options used when calling `thin`.
|
13
|
+
#
|
7
14
|
def initialize_server
|
8
15
|
@thin = Options::Thin.new(@server_options)
|
9
16
|
@thin.environment ||= @name
|
10
17
|
end
|
11
18
|
|
19
|
+
#
|
20
|
+
# Runs a command via the `thin` command.
|
21
|
+
#
|
22
|
+
# @param [LocalShell, RemoteShell] shell
|
23
|
+
# The shell to execute commands in.
|
24
|
+
#
|
25
|
+
# @param [Array] args
|
26
|
+
# Additional arguments to call `thin` with.
|
27
|
+
#
|
12
28
|
def thin(shell,*args)
|
13
29
|
options = args + ['-C', @thin.config, '-s', @thin.servers]
|
14
30
|
|
15
31
|
shell.run 'thin', *options
|
16
32
|
end
|
17
33
|
|
34
|
+
#
|
35
|
+
# Configures Thin by calling `thin config`.
|
36
|
+
#
|
37
|
+
# @param [LocalShell, RemoteShell] shell
|
38
|
+
# The shell to execute commands in.
|
39
|
+
#
|
40
|
+
# @raise [MissingOption]
|
41
|
+
# No `config` option was listed under the `server` option in the
|
42
|
+
# `deploy.yml` configuration file.
|
43
|
+
#
|
18
44
|
def server_config(shell)
|
19
45
|
unless @thin.config
|
20
46
|
raise(MissingOption,"No 'config' option specified under the server options",caller)
|
@@ -25,14 +51,32 @@ module DeploYML
|
|
25
51
|
shell.run 'thin', 'config', *options
|
26
52
|
end
|
27
53
|
|
54
|
+
#
|
55
|
+
# Starts Thin by calling `thin start`.
|
56
|
+
#
|
57
|
+
# @param [LocalShell, RemoteShell] shell
|
58
|
+
# The shell to execute commands in.
|
59
|
+
#
|
28
60
|
def server_start(shell)
|
29
61
|
thin shell, 'start'
|
30
62
|
end
|
31
63
|
|
64
|
+
#
|
65
|
+
# Stops Thin by calling `thin stop`.
|
66
|
+
#
|
67
|
+
# @param [LocalShell, RemoteShell] shell
|
68
|
+
# The shell to execute commands in.
|
69
|
+
#
|
32
70
|
def server_stop(shell)
|
33
71
|
thin shell, 'stop'
|
34
72
|
end
|
35
73
|
|
74
|
+
#
|
75
|
+
# Restarts Thin by calling `thin restart`.
|
76
|
+
#
|
77
|
+
# @param [LocalShell, RemoteShell] shell
|
78
|
+
# The shell to execute commands in.
|
79
|
+
#
|
36
80
|
def server_restart(shell)
|
37
81
|
thin shell, 'restart'
|
38
82
|
end
|
data/lib/deployml/shell.rb
CHANGED
@@ -1,20 +1,15 @@
|
|
1
|
+
require 'thor/shell/color'
|
2
|
+
|
1
3
|
module DeploYML
|
4
|
+
#
|
5
|
+
# Provides common methods used by both {LocalShell} and {RemoteShell}.
|
6
|
+
#
|
2
7
|
module Shell
|
3
8
|
|
4
|
-
|
5
|
-
block.call(self) if block
|
6
|
-
end
|
9
|
+
include Thor::Shell
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
# @param [String] program
|
12
|
-
# The name or path of the program to run.
|
13
|
-
#
|
14
|
-
# @param [Array<String>] args
|
15
|
-
# Additional arguments for the program.
|
16
|
-
#
|
17
|
-
def run(program,*args)
|
11
|
+
def initialize
|
12
|
+
yield self if block_given?
|
18
13
|
end
|
19
14
|
|
20
15
|
#
|
@@ -30,8 +25,32 @@ module DeploYML
|
|
30
25
|
run 'rake', rake_task(task,*args)
|
31
26
|
end
|
32
27
|
|
28
|
+
#
|
29
|
+
# Prints a status message.
|
30
|
+
#
|
31
|
+
# @param [String] message
|
32
|
+
# The message to print.
|
33
|
+
#
|
34
|
+
# @since 0.4.0
|
35
|
+
#
|
36
|
+
def status(message)
|
37
|
+
echo "#{Color::GREEN}>>> #{message}#{Color::CLEAR}"
|
38
|
+
end
|
39
|
+
|
33
40
|
protected
|
34
41
|
|
42
|
+
#
|
43
|
+
# Builds a `rake` task name.
|
44
|
+
#
|
45
|
+
# @param [String, Symbol] name
|
46
|
+
# The name of the `rake` task.
|
47
|
+
#
|
48
|
+
# @param [Array] args
|
49
|
+
# Additional arguments to pass to the `rake` task.
|
50
|
+
#
|
51
|
+
# @param [String]
|
52
|
+
# The `rake` task name to be called.
|
53
|
+
#
|
35
54
|
def rake_task(name,*args)
|
36
55
|
name = name.to_s
|
37
56
|
|
data/lib/deployml/version.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'deployml/remote_shell'
|
3
|
+
|
4
|
+
describe RemoteShell do
|
5
|
+
let(:uri) { 'ssh://deploy@www.example.com/path' }
|
6
|
+
|
7
|
+
subject { RemoteShell.new(uri) }
|
8
|
+
|
9
|
+
it "should parse the given URI" do
|
10
|
+
subject.uri.should be_kind_of(Addressable::URI)
|
11
|
+
|
12
|
+
subject.uri.user.should == 'deploy'
|
13
|
+
subject.uri.host.should == 'www.example.com'
|
14
|
+
subject.uri.path.should == '/path'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should convert normal URIs to SSH URIs" do
|
18
|
+
subject.ssh_uri.should == 'deploy@www.example.com'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should enqueue programs to run" do
|
22
|
+
subject.run 'echo', 'one'
|
23
|
+
subject.run 'echo', 'two'
|
24
|
+
|
25
|
+
subject.history[0].should == ['echo', 'one']
|
26
|
+
subject.history[1].should == ['echo', 'two']
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should enqueue echo commands" do
|
30
|
+
subject.echo 'one'
|
31
|
+
subject.echo 'two'
|
32
|
+
|
33
|
+
subject.history[0].should == ['echo', 'one']
|
34
|
+
subject.history[1].should == ['echo', 'two']
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should enqueue directory changes" do
|
38
|
+
subject.cd '/other'
|
39
|
+
|
40
|
+
subject.history[0].should == ['cd', '/other']
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should enqueue temporary directory changes" do
|
44
|
+
subject.cd '/other' do
|
45
|
+
subject.run 'pwd'
|
46
|
+
end
|
47
|
+
|
48
|
+
subject.history[0].should == ['cd', '/other']
|
49
|
+
subject.history[1].should == ['pwd']
|
50
|
+
subject.history[2].should == ['cd', '-']
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should join all commands together into one command" do
|
54
|
+
subject.run 'echo', 'one'
|
55
|
+
subject.run 'echo', 'two'
|
56
|
+
|
57
|
+
subject.join.should == 'echo one && echo two'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should escape all command arguments" do
|
61
|
+
subject.run 'the program'
|
62
|
+
subject.run 'echo', '>>> status'
|
63
|
+
|
64
|
+
subject.join.should == "the\\ program && echo \\>\\>\\>\\ status"
|
65
|
+
end
|
66
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 4
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.4.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Postmodern
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
17
|
+
date: 2010-11-29 00:00:00 -08:00
|
18
18
|
default_executable: deployml
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -27,9 +27,9 @@ dependencies:
|
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
29
|
- 2
|
30
|
-
-
|
31
|
-
-
|
32
|
-
version: 2.
|
30
|
+
- 2
|
31
|
+
- 0
|
32
|
+
version: 2.2.0
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- lib/deployml/exceptions/unknown_framework.rb
|
140
140
|
- lib/deployml/exceptions/unknown_server.rb
|
141
141
|
- lib/deployml/frameworks.rb
|
142
|
+
- lib/deployml/frameworks/rails.rb
|
142
143
|
- lib/deployml/frameworks/rails2.rb
|
143
144
|
- lib/deployml/frameworks/rails3.rb
|
144
145
|
- lib/deployml/local_shell.rb
|
@@ -167,6 +168,7 @@ files:
|
|
167
168
|
- spec/helpers/projects/rails/config/deploy/production.yml
|
168
169
|
- spec/helpers/projects/rails/config/deploy/staging.yml
|
169
170
|
- spec/project_spec.rb
|
171
|
+
- spec/remote_shell_spec.rb
|
170
172
|
- spec/spec_helper.rb
|
171
173
|
has_rdoc: yard
|
172
174
|
homepage: http://github.com/postmodern/deployml
|
@@ -201,6 +203,7 @@ signing_key:
|
|
201
203
|
specification_version: 3
|
202
204
|
summary: A simple deployment solution that works.
|
203
205
|
test_files:
|
206
|
+
- spec/remote_shell_spec.rb
|
204
207
|
- spec/project_spec.rb
|
205
208
|
- spec/environment_spec.rb
|
206
209
|
- spec/configuration_spec.rb
|