railsless-deploy 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/.gitignore +1 -0
- data/CHANGELOG.markdown +4 -0
- data/README.markdown +4 -0
- data/VERSION +1 -1
- data/lib/railsless-deploy.rb +83 -44
- data/railsless-deploy.gemspec +35 -0
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MzY3NjE1NzJiM2E1ZGMwMTc5NGEzNGIxZTJhNjlkODhlYTAxNTEyYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MGIyZjIxYWY0YTVhMjJjZGYzYjFlNGIxOTRkNDAwNmNjNzIxZmY4ZQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZTdjYTU3ODRlODM0ZTdmMzYzZGNlYmYxMTAzMWU3NzdiOGE3NDBlMTRiM2U3
|
10
|
+
NmIzYWFhZWE3NDZhZTliNWNjYjhmMmUyNDliNjg0Zjc0Mjc2ZWRjNDkyOGYy
|
11
|
+
MTI3NGUzOWI5MDUzNTM3ZWNlMzQzZmU2YjU0OWQwOTE2OGY2OTU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OWQwMDVjMzQ4NDA1YWJkODE3MTJkYWRlNDJmNmQ5NjMzZDMzZTdjMTFmMWMz
|
14
|
+
OTgzNjUwYTE2MTE3OTkxYjExZDkyN2ZiYWIzZTM3ZDlhNDNjMzY0YzUxNWE1
|
15
|
+
MzIzZGVkOTk0NDYzNTVmMzYzYmZkMGEyYTRmNDFjNGNlNWI3NTE=
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/*.gem
|
data/CHANGELOG.markdown
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Lee Hambley's Railsless Deploy
|
2
2
|
|
3
|
+
## 1.1.3 – Dec 13 2013
|
4
|
+
|
5
|
+
* Manually merge in code from [Capistrano 2.15.5's `lib/capistrano/recipes/deploy.rb`](https://github.com/capistrano/capistrano/blob/2.15.5/lib/capistrano/recipes/deploy.rb) to provide feature parity with last release of Cap 2.x.
|
6
|
+
|
3
7
|
## 1.1.2 - May 28 2013
|
4
8
|
|
5
9
|
* Small change not to set latest_release if there are no old releases.
|
data/README.markdown
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# This Project Is Obsolete
|
2
|
+
|
3
|
+
**Note:** Capistrano 3 (http://www.capistranorb.com/) doesn't ship with any Railsisms, and is better in almost every measurable way than Capistrano 2 + `raileless-deploy`. It's time to switch, as I won't be maintaining this Gem anymore!
|
4
|
+
|
1
5
|
# Lee Hambley's Railsless Deploy
|
2
6
|
|
3
7
|
If you want to get the most out of Capistrano and you do not want to have to deal with the *railsisms* that ship by default, this is the gem for you.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.3
|
data/lib/railsless-deploy.rb
CHANGED
@@ -22,7 +22,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
22
22
|
# are not sufficient.
|
23
23
|
# =========================================================================
|
24
24
|
|
25
|
-
_cset
|
25
|
+
_cset(:scm) { scm_default }
|
26
26
|
_cset :deploy_via, :checkout
|
27
27
|
|
28
28
|
_cset(:deploy_to) { "/u/apps/#{application}" }
|
@@ -39,6 +39,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
39
39
|
|
40
40
|
_cset(:strategy) { Capistrano::Deploy::Strategy.new(deploy_via, self) }
|
41
41
|
|
42
|
+
# If overriding release name, please also select an appropriate setting for :releases below.
|
42
43
|
_cset(:release_name) { set :deploy_timestamped, true; Time.now.utc.strftime("%Y%m%d%H%M%S") }
|
43
44
|
|
44
45
|
_cset :version_dir, "releases"
|
@@ -51,27 +52,56 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
51
52
|
_cset(:current_path) { File.join(deploy_to, current_dir) }
|
52
53
|
_cset(:release_path) { File.join(releases_path, release_name) }
|
53
54
|
|
54
|
-
_cset(:releases) { capture("ls -
|
55
|
-
_cset(:current_release) { releases.
|
55
|
+
_cset(:releases) { capture("#{try_sudo} ls -x #{releases_path}", :except => { :no_release => true }).split.sort }
|
56
|
+
_cset(:current_release) { releases.length > 0 ? File.join(releases_path, releases.last) : nil }
|
56
57
|
_cset(:previous_release) { releases.length > 1 ? File.join(releases_path, releases[-2]) : nil }
|
57
58
|
|
58
|
-
_cset(:current_revision) { capture("cat #{current_path}/REVISION").chomp }
|
59
|
-
_cset(:latest_revision) { capture("cat #{current_release}/REVISION").chomp }
|
60
|
-
_cset(:previous_revision) { capture("cat #{previous_release}/REVISION").chomp }
|
59
|
+
_cset(:current_revision) { capture("#{try_sudo} cat #{current_path}/REVISION", :except => { :no_release => true }).chomp }
|
60
|
+
_cset(:latest_revision) { capture("#{try_sudo} cat #{current_release}/REVISION", :except => { :no_release => true }).chomp }
|
61
|
+
_cset(:previous_revision) { capture("#{try_sudo} cat #{previous_release}/REVISION", :except => { :no_release => true }).chomp if previous_release }
|
61
62
|
|
62
63
|
_cset(:run_method) { fetch(:use_sudo, true) ? :sudo : :run }
|
63
64
|
|
64
|
-
# some tasks, like
|
65
|
+
# some tasks, like symlink, need to always point at the latest release, but
|
65
66
|
# they can also (occassionally) be called standalone. In the standalone case,
|
66
67
|
# the timestamped release_path will be inaccurate, since the directory won't
|
67
|
-
# actually exist. This variable lets tasks like
|
68
|
+
# actually exist. This variable lets tasks like symlink work either in the
|
68
69
|
# standalone case, or during deployment.
|
69
70
|
_cset(:latest_release) { exists?(:deploy_timestamped) ? release_path : current_release }
|
70
71
|
|
72
|
+
_cset :maintenance_basename, "maintenance"
|
73
|
+
_cset(:maintenance_template_path) { File.join(File.dirname(__FILE__), "templates", "maintenance.rhtml") }
|
71
74
|
# =========================================================================
|
72
75
|
# These are helper methods that will be available to your recipes.
|
73
76
|
# =========================================================================
|
74
77
|
|
78
|
+
# Checks known version control directories to intelligently set the version
|
79
|
+
# control in-use. For example, if a .svn directory exists in the project,
|
80
|
+
# it will set the :scm variable to :subversion, if a .git directory exists
|
81
|
+
# in the project, it will set the :scm variable to :git and so on. If no
|
82
|
+
# directory is found, it will default to :git.
|
83
|
+
def scm_default
|
84
|
+
if File.exist? '.git'
|
85
|
+
:git
|
86
|
+
elsif File.exist? '.accurev'
|
87
|
+
:accurev
|
88
|
+
elsif File.exist? '.bzr'
|
89
|
+
:bzr
|
90
|
+
elsif File.exist? '.cvs'
|
91
|
+
:cvs
|
92
|
+
elsif File.exist? '_darcs'
|
93
|
+
:darcs
|
94
|
+
elsif File.exist? '.hg'
|
95
|
+
:mercurial
|
96
|
+
elsif File.exist? '.perforce'
|
97
|
+
:perforce
|
98
|
+
elsif File.exist? '.svn'
|
99
|
+
:subversion
|
100
|
+
else
|
101
|
+
:none
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
75
105
|
# Auxiliary helper method for the `deploy:check' task. Lets you set up your
|
76
106
|
# own dependencies.
|
77
107
|
def depend(location, type, *args)
|
@@ -94,8 +124,19 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
94
124
|
# logs the command then executes it locally.
|
95
125
|
# returns the command output as a string
|
96
126
|
def run_locally(cmd)
|
127
|
+
if dry_run
|
128
|
+
return logger.debug "executing locally: #{cmd.inspect}"
|
129
|
+
end
|
97
130
|
logger.trace "executing locally: #{cmd.inspect}" if logger
|
98
|
-
|
131
|
+
output_on_stdout = nil
|
132
|
+
elapsed = Benchmark.realtime do
|
133
|
+
output_on_stdout = `#{cmd}`
|
134
|
+
end
|
135
|
+
if $?.to_i > 0 # $? is command exit code (posix style)
|
136
|
+
raise Capistrano::LocalArgumentError, "Command #{cmd} returned status code #{$?}"
|
137
|
+
end
|
138
|
+
logger.trace "command finished in #{(elapsed * 1000).round}ms" if logger
|
139
|
+
output_on_stdout
|
99
140
|
end
|
100
141
|
|
101
142
|
# If a command is given, this will try to execute the given command, as
|
@@ -111,7 +152,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
111
152
|
# THUS, if you want to try to run something via sudo, and what to use the
|
112
153
|
# root user, you'd just to try_sudo('something'). If you wanted to try_sudo as
|
113
154
|
# someone else, you'd just do try_sudo('something', :as => "bob"). If you
|
114
|
-
# always wanted sudo to run as a particular user, you could do
|
155
|
+
# always wanted sudo to run as a particular user, you could do
|
115
156
|
# set(:admin_runner, "bob").
|
116
157
|
def try_sudo(*args)
|
117
158
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -174,7 +215,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
174
215
|
|
175
216
|
desc <<-DESC
|
176
217
|
Copies your project and updates the symlink. It does this in a \
|
177
|
-
transaction, so that if either `update_code' or `
|
218
|
+
transaction, so that if either `update_code' or `symlink' fail, all \
|
178
219
|
changes made to the remote servers will be rolled back, leaving your \
|
179
220
|
system in the same state it was in before `update' was invoked. Usually, \
|
180
221
|
you will want to call `deploy' instead of `update', but `update' can be \
|
@@ -218,22 +259,30 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
218
259
|
public/stylesheets, and public/javascripts so that the times are \
|
219
260
|
consistent (so that asset timestamping works). This touch process \
|
220
261
|
is only carried out if the :normalize_asset_timestamps variable is \
|
221
|
-
set to true, which is the default.
|
262
|
+
set to true, which is the default. The asset directories can be overridden \
|
263
|
+
using the :public_children variable.
|
222
264
|
DESC
|
223
265
|
task :finalize_update, :except => { :no_release => true } do
|
266
|
+
escaped_release = latest_release.to_s.shellescape
|
267
|
+
commands = []
|
268
|
+
commands << "chmod -R -- g+w #{escaped_release}" if fetch(:group_writable, true)
|
269
|
+
|
224
270
|
# mkdir -p is making sure that the directories are there for some SCM's that don't
|
225
271
|
# save empty folders
|
226
|
-
shared_children.map do |
|
227
|
-
|
228
|
-
|
272
|
+
shared_children.map do |dir|
|
273
|
+
d = dir.shellescape
|
274
|
+
if (dir.rindex('/')) then
|
275
|
+
commands += ["rm -rf -- #{escaped_release}/#{d}",
|
276
|
+
"mkdir -p -- #{escaped_release}/#{dir.slice(0..(dir.rindex('/'))).shellescape}"]
|
229
277
|
else
|
230
|
-
|
278
|
+
commands << "rm -rf -- #{escaped_release}/#{d}"
|
231
279
|
end
|
232
|
-
|
280
|
+
commands << "ln -s -- #{shared_path}/#{dir.split('/').last.shellescape} #{escaped_release}/#{d}"
|
233
281
|
end
|
234
282
|
|
235
|
-
|
236
|
-
|
283
|
+
commands << "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)
|
284
|
+
run commands.join(' && ') if commands.any?
|
285
|
+
|
237
286
|
shared_children.map do |d|
|
238
287
|
run <<-CMD
|
239
288
|
rm -rf #{latest_release}/#{d} &&
|
@@ -242,6 +291,14 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
242
291
|
end
|
243
292
|
end
|
244
293
|
|
294
|
+
desc <<-DESC
|
295
|
+
Deprecated API. This has become deploy:create_symlink, please update your recipes
|
296
|
+
DESC
|
297
|
+
task :symlink, :except => { :no_release => true } do
|
298
|
+
Kernel.warn "[Deprecation Warning] This API has changed, please hook `deploy:create_symlink` instead of `deploy:symlink`."
|
299
|
+
create_symlink
|
300
|
+
end
|
301
|
+
|
245
302
|
desc <<-DESC
|
246
303
|
Updates the symlink to the most recently deployed version. Capistrano works \
|
247
304
|
by putting each new release of your application in its own directory. When \
|
@@ -254,23 +311,13 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
254
311
|
task :create_symlink, :except => { :no_release => true } do
|
255
312
|
on_rollback do
|
256
313
|
if previous_release
|
257
|
-
run "rm -f #{current_path}; ln -s #{previous_release} #{current_path}; true"
|
314
|
+
run "#{try_sudo} rm -f #{current_path}; #{try_sudo} ln -s #{previous_release} #{current_path}; true"
|
258
315
|
else
|
259
316
|
logger.important "no previous release to rollback to, rollback of symlink skipped"
|
260
317
|
end
|
261
318
|
end
|
262
319
|
|
263
|
-
run "rm -f #{current_path} && ln -s #{latest_release} #{current_path}"
|
264
|
-
end
|
265
|
-
|
266
|
-
desc <<-DESC
|
267
|
-
Deprecated. Use `deploy:create_symlink` instead.
|
268
|
-
DESC
|
269
|
-
task :symlink, :except => { :no_release => true } do
|
270
|
-
warn "[Deprecation Warning] This API has changed, please use `deploy:create_symlink` instead of" \
|
271
|
-
" `deploy:symlink`."
|
272
|
-
|
273
|
-
create_symlink
|
320
|
+
run "#{try_sudo} rm -f #{current_path} && #{try_sudo} ln -s #{latest_release} #{current_path}"
|
274
321
|
end
|
275
322
|
|
276
323
|
desc <<-DESC
|
@@ -306,7 +353,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
306
353
|
DESC
|
307
354
|
task :revision, :except => { :no_release => true } do
|
308
355
|
if previous_release
|
309
|
-
run "rm #{current_path}
|
356
|
+
run "#{try_sudo} rm #{current_path};#{try_sudo} ln -s #{previous_release} #{current_path}"
|
310
357
|
else
|
311
358
|
abort "could not rollback the code because there is no prior release"
|
312
359
|
end
|
@@ -318,13 +365,14 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
318
365
|
(if ever) need to be called directly.
|
319
366
|
DESC
|
320
367
|
task :cleanup, :except => { :no_release => true } do
|
321
|
-
run "if [ `readlink #{current_path}` != #{current_release} ]; then rm -rf #{current_release}; fi"
|
368
|
+
run "if [ `readlink #{current_path}` != #{current_release} ]; then #{try_sudo} rm -rf #{current_release}; fi"
|
322
369
|
end
|
323
370
|
|
324
371
|
desc <<-DESC
|
325
372
|
Rolls back to the previously deployed version. The `current' symlink will \
|
326
373
|
be updated to point at the previously deployed version, and then the \
|
327
|
-
current release will be removed from the servers.
|
374
|
+
current release will be removed from the servers. You'll generally want \
|
375
|
+
to call `rollback' instead, as it performs a `restart' as well.
|
328
376
|
DESC
|
329
377
|
task :code, :except => { :no_release => true } do
|
330
378
|
revision
|
@@ -351,16 +399,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
351
399
|
DESC
|
352
400
|
task :cleanup, :except => { :no_release => true } do
|
353
401
|
count = fetch(:keep_releases, 5).to_i
|
354
|
-
|
355
|
-
logger.important "no old releases to clean up"
|
356
|
-
else
|
357
|
-
logger.info "keeping #{count} of #{releases.length} deployed releases"
|
358
|
-
|
359
|
-
directories = (releases - releases.last(count)).map { |release|
|
360
|
-
File.join(releases_path, release) }.join(" ")
|
361
|
-
|
362
|
-
try_sudo "rm -rf #{directories}"
|
363
|
-
end
|
402
|
+
try_sudo "ls -1dt #{releases_path}/* | tail -n +#{count + 1} | #{try_sudo} xargs rm -rf"
|
364
403
|
end
|
365
404
|
|
366
405
|
desc <<-DESC
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: railsless-deploy 1.1.3 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "railsless-deploy"
|
9
|
+
s.version = "1.1.3"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ["Lee Hambley"]
|
13
|
+
s.date = "2013-12-13"
|
14
|
+
s.description = "Replacement for the rails deploy strategy which ships with Capistrano, allows you to deploy any platform with ease; some people have had huge success with this deploying rails projects where they needed to customise their deploy strategy beyond the code which ships with the Capistrano gem."
|
15
|
+
s.email = "lee.hambley@gmail.com"
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE.markdown",
|
18
|
+
"README.markdown"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".gitignore",
|
22
|
+
"CHANGELOG.markdown",
|
23
|
+
"LICENSE.markdown",
|
24
|
+
"README.markdown",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/railsless-deploy.rb",
|
28
|
+
"railsless-deploy.gemspec"
|
29
|
+
]
|
30
|
+
s.homepage = "http://github.com/leehambley/railsless-deploy/"
|
31
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
s.rubygems_version = "2.1.10"
|
34
|
+
s.summary = "Replacement for the default Capistrano tasks, designed to make life easier for PHP/Perl/Python developers"
|
35
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: railsless-deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Hambley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Replacement for the rails deploy strategy which ships with Capistrano,
|
14
14
|
allows you to deploy any platform with ease; some people have had huge success with
|
@@ -21,35 +21,37 @@ extra_rdoc_files:
|
|
21
21
|
- LICENSE.markdown
|
22
22
|
- README.markdown
|
23
23
|
files:
|
24
|
+
- .gitignore
|
24
25
|
- CHANGELOG.markdown
|
25
26
|
- LICENSE.markdown
|
26
27
|
- README.markdown
|
27
28
|
- Rakefile
|
28
29
|
- VERSION
|
29
30
|
- lib/railsless-deploy.rb
|
31
|
+
- railsless-deploy.gemspec
|
30
32
|
homepage: http://github.com/leehambley/railsless-deploy/
|
31
33
|
licenses: []
|
32
34
|
metadata: {}
|
33
35
|
post_install_message:
|
34
|
-
rdoc_options:
|
36
|
+
rdoc_options:
|
37
|
+
- --charset=UTF-8
|
35
38
|
require_paths:
|
36
39
|
- lib
|
37
40
|
required_ruby_version: !ruby/object:Gem::Requirement
|
38
41
|
requirements:
|
39
|
-
- - '>='
|
42
|
+
- - ! '>='
|
40
43
|
- !ruby/object:Gem::Version
|
41
44
|
version: '0'
|
42
45
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
46
|
requirements:
|
44
|
-
- - '>='
|
47
|
+
- - ! '>='
|
45
48
|
- !ruby/object:Gem::Version
|
46
49
|
version: '0'
|
47
50
|
requirements: []
|
48
51
|
rubyforge_project:
|
49
|
-
rubygems_version: 2.
|
52
|
+
rubygems_version: 2.1.10
|
50
53
|
signing_key:
|
51
|
-
specification_version:
|
54
|
+
specification_version: 4
|
52
55
|
summary: Replacement for the default Capistrano tasks, designed to make life easier
|
53
56
|
for PHP/Perl/Python developers
|
54
57
|
test_files: []
|
55
|
-
has_rdoc:
|