sepastian-capistrano3-unicorn 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/capistrano/tasks/unicorn.cap +32 -47
- data/lib/capistrano/unicorn/utility.rb +44 -65
- data/lib/capistrano/unicorn/version.rb +1 -1
- metadata +14 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 612300b16394dba9a55347ffec57f3866bdf8438
|
4
|
+
data.tar.gz: 1d843ca1beb43f3b49602f42d3b4c7242ee0b4af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a42ca5a33d585ba405ef28086ba9bf8e40ace62662b211b1033d75b80f154906c5441ce6609a5af5408ecde831dca2ac8b8a9365ab6c934ff149bf3a254c83ba
|
7
|
+
data.tar.gz: dff1cf6dbaa474f5e49078958c1bd404184e921c7489c79eb6cc60d9528805fd47542d01127f2d2a0a65e2d8cec3dc4a76552c8dfcc77fa9c8132a39abb46b86
|
data/README.md
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'capistrano'
|
2
1
|
require 'capistrano/unicorn/utility'
|
3
2
|
|
4
3
|
include CapistranoUnicorn::Utility
|
@@ -12,21 +11,21 @@ namespace :load do
|
|
12
11
|
set :unicorn_env , Proc.new{ fetch(:rails_env, 'production') }
|
13
12
|
# Following recommendations from http://unicorn.bogomips.org/unicorn_1.html
|
14
13
|
set :unicorn_rack_env, Proc.new{ fetch(:rails_env) == 'development' ? 'development' : 'deployment' }
|
15
|
-
|
14
|
+
|
16
15
|
# Execution
|
17
16
|
set :unicorn_user , nil
|
18
17
|
set :unicorn_bundle , Proc.new{ fetch(:bundle_cmd, "bundle") }
|
19
18
|
set :unicorn_bin , "unicorn"
|
20
19
|
set :unicorn_options , ''
|
21
20
|
set :unicorn_restart_sleep_time, 2
|
22
|
-
|
21
|
+
|
23
22
|
# Relative paths
|
24
23
|
set :app_subdir , ''
|
25
24
|
set :unicorn_config_rel_path , "config"
|
26
25
|
set :unicorn_config_filename , "unicorn.rb"
|
27
26
|
set :unicorn_config_rel_file_path , Proc.new{ File.join(fetch(:unicorn_config_rel_path), fetch(:unicorn_config_filename)) }
|
28
27
|
set :unicorn_config_stage_rel_file_path, Proc.new{ File.join(fetch(:unicorn_config_rel_path), 'unicorn', "#{fetch(:unicorn_env)}.rb") }
|
29
|
-
|
28
|
+
|
30
29
|
# Absolute paths
|
31
30
|
# If you find the following confusing, try running 'cap unicorn:show_vars' -
|
32
31
|
# it might help :-)
|
@@ -86,84 +85,70 @@ namespace :unicorn do
|
|
86
85
|
|
87
86
|
desc 'Start Unicorn master process'
|
88
87
|
task :start do
|
89
|
-
on roles unicorn_roles, :
|
90
|
-
|
88
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
91
89
|
execute start_unicorn
|
92
90
|
end
|
93
91
|
end
|
94
|
-
|
92
|
+
|
95
93
|
desc 'Stop Unicorn'
|
96
94
|
task :stop do
|
97
|
-
on roles unicorn_roles, :
|
95
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
98
96
|
execute kill_unicorn('QUIT')
|
99
97
|
end
|
100
98
|
end
|
101
|
-
|
99
|
+
|
102
100
|
desc 'Immediately shutdown Unicorn'
|
103
101
|
task :shutdown do
|
104
|
-
on roles unicorn_roles, :
|
102
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
105
103
|
execute kill_unicorn('TERM')
|
106
104
|
end
|
107
105
|
end
|
108
|
-
|
106
|
+
|
109
107
|
desc 'Restart Unicorn'
|
110
108
|
task :restart do
|
111
|
-
on roles unicorn_roles, :
|
112
|
-
|
109
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
110
|
+
duplicate_unicorn
|
113
111
|
execute :sleep, fetch(:unicorn_restart_sleep_time)
|
114
|
-
|
112
|
+
|
113
|
+
if old_unicorn_is_running?
|
114
|
+
unicorn_send_signal('QUIT', get_old_unicorn_pid)
|
115
|
+
end
|
115
116
|
end
|
116
117
|
end
|
117
118
|
|
118
119
|
desc 'Duplicate Unicorn'
|
119
120
|
task :duplicate do
|
120
|
-
on roles unicorn_roles, :
|
121
|
-
|
121
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
122
|
+
duplicate_unicorn
|
122
123
|
end
|
123
124
|
end
|
124
|
-
|
125
|
+
|
125
126
|
desc 'Reload Unicorn'
|
126
127
|
task :reload do
|
127
|
-
on roles unicorn_roles, :
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
# else
|
134
|
-
# #{start_unicorn}
|
135
|
-
# fi;
|
136
|
-
# END
|
128
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
129
|
+
if unicorn_is_running?
|
130
|
+
unicorn_send_signal('HUP')
|
131
|
+
else
|
132
|
+
start_unicorn
|
133
|
+
end
|
137
134
|
end
|
138
135
|
end
|
139
136
|
|
140
137
|
desc 'Add a new worker'
|
141
138
|
task :add_worker do
|
142
|
-
on roles unicorn_roles, :
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
# echo "Adding a new Unicorn worker...";
|
147
|
-
# #{unicorn_send_signal('TTIN')};
|
148
|
-
# else
|
149
|
-
# echo "Unicorn is not running.";
|
150
|
-
# fi;
|
151
|
-
# END
|
139
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
140
|
+
if unicorn_is_running?
|
141
|
+
unicorn_send_signal('TTIN')
|
142
|
+
end
|
152
143
|
end
|
153
144
|
end
|
154
145
|
|
155
146
|
desc 'Remove amount of workers'
|
156
147
|
task :remove_worker do
|
157
|
-
on roles unicorn_roles, :
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
# echo "Removing a Unicorn worker...";
|
162
|
-
# #{unicorn_send_signal('TTOU')};
|
163
|
-
# else
|
164
|
-
# echo "Unicorn is not running.";
|
165
|
-
# fi;
|
166
|
-
# END
|
148
|
+
on roles unicorn_roles, reject: lambda { |h| h.properties.no_release } do
|
149
|
+
if unicorn_is_running?
|
150
|
+
unicorn_send_signal('TTOU')
|
151
|
+
end
|
167
152
|
end
|
168
153
|
end
|
169
154
|
end
|
@@ -3,21 +3,6 @@ require 'tempfile'
|
|
3
3
|
module CapistranoUnicorn
|
4
4
|
module Utility
|
5
5
|
# In Capistrano 3, shell scripts must be invoked with SSHKit's execute, instead of run.
|
6
|
-
# SSHKit will "sanitize" all multi-line commands (here docs), replacing "\n" with ";".
|
7
|
-
# Sanitizing renders some shell scripts illegal, for instance:
|
8
|
-
#
|
9
|
-
# if [ -e FILE ]; then
|
10
|
-
# echo "Found."
|
11
|
-
# fi
|
12
|
-
#
|
13
|
-
# This would become
|
14
|
-
#
|
15
|
-
# if [ -e FILE ]; then; echo "Found."; fi;
|
16
|
-
#
|
17
|
-
# which is illegal because of the ';' after 'then'.
|
18
|
-
#
|
19
|
-
# To avoid errors, replace all "\n" with " " in shell scripts,
|
20
|
-
# before SSHKit gets a chance to replace "\n" with ";"
|
21
6
|
def local_unicorn_config
|
22
7
|
if File.exist? fetch(:unicorn_config_rel_file_path)
|
23
8
|
fetch(:unicorn_config_rel_file_path)
|
@@ -55,7 +40,7 @@ module CapistranoUnicorn
|
|
55
40
|
# Check if a remote process exists using its pid file
|
56
41
|
#
|
57
42
|
def remote_process_exists?(pid_file)
|
58
|
-
"[ -e #{pid_file} ] && #{
|
43
|
+
test("[ -e #{pid_file} ]") && execute("#{try_unicorn_user} kill -0 `cat #{pid_file}` > /dev/null 2>&1")
|
59
44
|
end
|
60
45
|
|
61
46
|
# Stale Unicorn process pid file
|
@@ -67,7 +52,7 @@ module CapistranoUnicorn
|
|
67
52
|
# Command to check if Unicorn is running
|
68
53
|
#
|
69
54
|
def unicorn_is_running?
|
70
|
-
remote_process_exists?(fetch
|
55
|
+
remote_process_exists?(fetch(:unicorn_pid))
|
71
56
|
end
|
72
57
|
|
73
58
|
# Command to check if stale Unicorn is running
|
@@ -79,7 +64,7 @@ module CapistranoUnicorn
|
|
79
64
|
# Get unicorn master process PID (using the shell)
|
80
65
|
#
|
81
66
|
def get_unicorn_pid(pid_file=fetch(:unicorn_pid))
|
82
|
-
"
|
67
|
+
capture "cat #{pid_file}"
|
83
68
|
end
|
84
69
|
|
85
70
|
# Get unicorn master (old) process PID
|
@@ -92,76 +77,70 @@ module CapistranoUnicorn
|
|
92
77
|
#
|
93
78
|
def unicorn_send_signal(signal, pid=get_unicorn_pid)
|
94
79
|
sig_prefix = Integer === signal ? '-' : '-s '
|
95
|
-
|
80
|
+
execute try_unicorn_user, 'kill', sig_prefix, signal, pid
|
96
81
|
end
|
97
82
|
|
98
83
|
# Run a command as the :unicorn_user user if :unicorn_user is a string.
|
99
84
|
# Otherwise run as default (:user) user.
|
100
85
|
#
|
101
86
|
def try_unicorn_user
|
102
|
-
|
87
|
+
if unicorn_user = fetch(:unicorn_user)
|
88
|
+
"sudo -u #{unicorn_user}"
|
89
|
+
else
|
90
|
+
''
|
91
|
+
end
|
103
92
|
end
|
104
93
|
|
105
94
|
# Kill Unicorns in multiple ways O_O
|
106
95
|
#
|
107
96
|
def kill_unicorn(signal)
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
fi;
|
115
|
-
END
|
116
|
-
script.split.join(' ')
|
97
|
+
if unicorn_is_running?
|
98
|
+
puts 'Stopping unicorn...'
|
99
|
+
unicorn_send_signal(signal)
|
100
|
+
else
|
101
|
+
puts 'Unicorn is not running'
|
102
|
+
end
|
117
103
|
end
|
118
104
|
|
119
105
|
# Start the Unicorn server
|
120
106
|
#
|
121
107
|
def start_unicorn
|
122
|
-
|
123
|
-
|
124
|
-
|
108
|
+
if test("[ -e #{fetch(:unicorn_config_file_path)} ]")
|
109
|
+
unicorn_config_file_path = fetch(:unicorn_config_file_path)
|
110
|
+
elsif test("[ -e #{fetch(:unicorn_config_stage_file_path)} ]")
|
111
|
+
unicorn_config_file_path = fetch(:unicorn_config_stage_file_path)
|
112
|
+
else
|
113
|
+
fail "Config file for \"#{fetch(:unicorn_env)}\" environment was not found at either \"#{fetch(:unicorn_config_file_path)}\" or \"#{fetch(:unicorn_config_stage_file_path)}\""
|
114
|
+
end
|
115
|
+
|
116
|
+
if test("[ -e #{fetch(:unicorn_pid)} ]")
|
117
|
+
if unicorn_is_running?
|
118
|
+
puts 'Unicorn is already running!'
|
119
|
+
return
|
125
120
|
else
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
exit 0;
|
138
|
-
fi;
|
139
|
-
|
140
|
-
#{try_unicorn_user} rm #{fetch :unicorn_pid};
|
141
|
-
fi;
|
142
|
-
|
143
|
-
echo "Starting Unicorn...";
|
144
|
-
cd #{fetch :app_path} && #{try_unicorn_user} RAILS_ENV=#{fetch :rails_env} BUNDLE_GEMFILE=#{fetch :bundle_gemfile} #{fetch :unicorn_bundle} exec #{fetch :unicorn_bin} -c $UNICORN_CONFIG_PATH -E #{fetch :unicorn_rack_env} -D #{fetch :unicorn_options};
|
145
|
-
%.split.join(' ')
|
121
|
+
execute :rm, fetch(:unicorn_pid)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
puts 'Starting unicorn...'
|
126
|
+
|
127
|
+
within fetch(:app_path) do
|
128
|
+
with rails_env: fetch(:rails_env), bundle_gemfile: fetch(:bundle_gemfile) do
|
129
|
+
execute :bundle, 'exec', fetch(:unicorn_bin), '-c', unicorn_config_file_path, '-E', fetch(:unicorn_rack_env), '-D', fetch(:unicorn_options)
|
130
|
+
end
|
131
|
+
end
|
146
132
|
end
|
147
133
|
|
148
134
|
def duplicate_unicorn
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
#{start_unicorn}
|
155
|
-
fi;
|
156
|
-
END
|
157
|
-
script.split.join(' ')
|
135
|
+
if unicorn_is_running?
|
136
|
+
unicorn_send_signal('USR2')
|
137
|
+
else
|
138
|
+
start_unicorn
|
139
|
+
end
|
158
140
|
end
|
159
141
|
|
160
142
|
def unicorn_roles
|
161
|
-
|
162
|
-
Proc.new{ fetch(:unicorn_roles, :app) }.call
|
163
|
-
#defer{ fetch(:unicorn_roles, :app) }
|
143
|
+
fetch(:unicorn_roles, :app)
|
164
144
|
end
|
165
|
-
|
166
145
|
end
|
167
146
|
end
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sepastian-capistrano3-unicorn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Gassner, Dan Sosedoff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: unicorn
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: capistrano
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '3.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
55
|
description: Capistrano 3.x plugin that integrates Unicorn server tasks.
|
@@ -58,9 +58,9 @@ executables: []
|
|
58
58
|
extensions: []
|
59
59
|
extra_rdoc_files: []
|
60
60
|
files:
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
61
|
+
- .gitignore
|
62
|
+
- .rspec
|
63
|
+
- .travis.yml
|
64
64
|
- Gemfile
|
65
65
|
- LICENSE
|
66
66
|
- NEWS.md
|
@@ -87,19 +87,18 @@ require_paths:
|
|
87
87
|
- lib
|
88
88
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
89
|
requirements:
|
90
|
-
- -
|
90
|
+
- - '>='
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: '0'
|
93
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- -
|
95
|
+
- - '>='
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
98
|
requirements: []
|
99
99
|
rubyforge_project:
|
100
|
-
rubygems_version: 2.2.
|
100
|
+
rubygems_version: 2.2.2
|
101
101
|
signing_key:
|
102
102
|
specification_version: 4
|
103
103
|
summary: Unicorn integration for Capistrano 3.x
|
104
104
|
test_files: []
|
105
|
-
has_rdoc:
|