alpha_omega 0.0.206 → 0.0.207

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.206
1
+ 0.0.207
@@ -0,0 +1,788 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
+ <title>deploy.rb</title>
6
+ <link rel="stylesheet" href="http://jashkenas.github.com/docco/resources/docco.css">
7
+ </head>
8
+ <body>
9
+ <div id='container'>
10
+ <div id="background"></div>
11
+ <table cellspacing=0 cellpadding=0>
12
+ <thead>
13
+ <tr>
14
+ <th class=docs><h1>deploy.rb</h1></th>
15
+ <th class=code></th>
16
+ </tr>
17
+ </thead>
18
+ <tbody>
19
+ <tr id='section-1'>
20
+ <td class=docs>
21
+ <div class="pilwrap">
22
+ <a class="pilcrow" href="#section-1">&#182;</a>
23
+ </div>
24
+
25
+ </td>
26
+ <td class=code>
27
+ <div class='highlight'><pre><span class="vg">$:</span><span class="o">.</span><span class="n">unshift</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="bp">__FILE__</span><span class="p">),</span><span class="s1">&#39;..&#39;</span><span class="p">,</span><span class="s1">&#39;..&#39;</span><span class="p">,</span><span class="s1">&#39;lib&#39;</span><span class="p">))</span>
28
+
29
+ <span class="nb">require</span> <span class="s1">&#39;benchmark&#39;</span>
30
+ <span class="nb">require</span> <span class="s1">&#39;yaml&#39;</span>
31
+ <span class="nb">require</span> <span class="s1">&#39;json&#39;</span>
32
+ <span class="nb">require</span> <span class="s1">&#39;alpha_omega/deploy/scm&#39;</span>
33
+ <span class="nb">require</span> <span class="s1">&#39;alpha_omega/deploy/strategy&#39;</span>
34
+ <span class="nb">require</span> <span class="s1">&#39;alpha_omega/utils&#39;</span>
35
+ <span class="nb">require</span> <span class="s1">&#39;capistrano_colors&#39;</span>
36
+ <span class="nb">require</span> <span class="s1">&#39;capistrano/log_with_awesome&#39;</span>
37
+
38
+ <span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;AO_USER&quot;</span><span class="o">]</span> <span class="o">||</span> <span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;AO_USER&quot;</span><span class="o">]</span> <span class="o">=</span> <span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;USER&quot;</span><span class="o">]</span>
39
+
40
+ <span class="no">Capistrano</span><span class="o">::</span><span class="no">Configuration</span><span class="o">.</span><span class="n">instance</span><span class="p">(</span><span class="ss">:must_exist</span><span class="p">)</span><span class="o">.</span><span class="n">load</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
41
+
42
+ <span class="k">def</span> <span class="nf">_cset</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
43
+ <span class="k">unless</span> <span class="n">exists?</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
44
+ <span class="n">set</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
45
+ <span class="k">end</span>
46
+ <span class="k">end</span></pre></div>
47
+ </td>
48
+ </tr>
49
+ <tr id='section-the_deploy_will_fail_with_an_error.'>
50
+ <td class=docs>
51
+ <div class="pilwrap">
52
+ <a class="pilcrow" href="#section-the_deploy_will_fail_with_an_error.">&#182;</a>
53
+ </div>
54
+ <h1></h1>
55
+
56
+ <p>These variables MUST be set in the client capfiles. If they are not set,</p>
57
+
58
+ <h1>the deploy will fail with an error.</h1>
59
+ </td>
60
+ <td class=code>
61
+ <div class='highlight'><pre> <span class="n">_cset</span><span class="p">(</span><span class="ss">:application</span><span class="p">)</span> <span class="p">{</span> <span class="nb">abort</span> <span class="s2">&quot;Please specify the name of your application, set :application, &#39;foo&#39;&quot;</span> <span class="p">}</span>
62
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:repository</span><span class="p">)</span> <span class="p">{</span> <span class="nb">abort</span> <span class="s2">&quot;Please specify the repository that houses your application&#39;s code, set :repository, &#39;foo&#39;&quot;</span> <span class="p">}</span></pre></div>
63
+ </td>
64
+ </tr>
65
+ <tr id='section-are_not_sufficient.'>
66
+ <td class=docs>
67
+ <div class="pilwrap">
68
+ <a class="pilcrow" href="#section-are_not_sufficient.">&#182;</a>
69
+ </div>
70
+ <h1></h1>
71
+
72
+ <p>These variables may be set in the client capfile if their default values</p>
73
+
74
+ <h1>are not sufficient.</h1>
75
+ </td>
76
+ <td class=code>
77
+ <div class='highlight'><pre> <span class="n">_cset</span> <span class="ss">:scm</span><span class="p">,</span> <span class="ss">:git</span>
78
+ <span class="n">_cset</span> <span class="ss">:deploy_via</span><span class="p">,</span> <span class="ss">:checkout</span>
79
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:branch</span><span class="p">)</span> <span class="p">{</span> <span class="no">AlphaOmega</span><span class="o">.</span><span class="n">what_branch</span> <span class="p">}</span>
80
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">source</span><span class="o">.</span><span class="n">head</span> <span class="p">}</span>
81
+
82
+ <span class="n">_cset</span> <span class="ss">:default_shell</span><span class="p">,</span> <span class="s2">&quot;/bin/bash&quot;</span>
83
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:deploy_to</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;/data/</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
84
+
85
+ <span class="n">_cset</span> <span class="ss">:root_user</span><span class="p">,</span> <span class="s2">&quot;root&quot;</span>
86
+ <span class="n">_cset</span> <span class="ss">:root_group</span><span class="p">,</span> <span class="s2">&quot;root&quot;</span>
87
+
88
+ <span class="n">_cset</span> <span class="ss">:dir_perms</span><span class="p">,</span> <span class="s2">&quot;0775&quot;</span>
89
+
90
+ <span class="n">_cset</span> <span class="ss">:bundler_options</span><span class="p">,</span> <span class="s2">&quot;--deployment --without development:test&quot;</span>
91
+ <span class="n">_cset</span> <span class="ss">:ruby_loader</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
92
+
93
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:run_method</span><span class="p">)</span> <span class="p">{</span> <span class="n">fetch</span><span class="p">(</span><span class="ss">:use_sudo</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span> <span class="p">?</span> <span class="ss">:sudo</span> <span class="p">:</span> <span class="ss">:run</span> <span class="p">}</span>
94
+
95
+ <span class="n">_cset</span> <span class="ss">:last_pod</span><span class="p">,</span> <span class="kp">nil</span>
96
+ <span class="n">_cset</span> <span class="ss">:local_only</span><span class="p">,</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;LOCAL_ONLY&#39;</span><span class="o">]</span> <span class="p">?</span> <span class="kp">true</span> <span class="p">:</span> <span class="kp">false</span>
97
+
98
+ <span class="n">_cset</span> <span class="p">(</span><span class="ss">:figlet</span><span class="p">)</span> <span class="p">{</span> <span class="o">[</span><span class="sx">%x(which figlet)</span><span class="o">.</span><span class="n">strip</span><span class="o">].</span><span class="n">reject</span> <span class="p">{</span><span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="o">!</span><span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">executable?</span> <span class="n">f</span><span class="p">)}</span><span class="o">.</span><span class="n">first</span> <span class="o">||</span> <span class="n">echo</span> <span class="p">}</span></pre></div>
99
+ </td>
100
+ </tr>
101
+ <tr id='section-services,_logs'>
102
+ <td class=docs>
103
+ <div class="pilwrap">
104
+ <a class="pilcrow" href="#section-services,_logs">&#182;</a>
105
+ </div>
106
+ <h1></h1>
107
+
108
+ <h1>services, logs</h1>
109
+ </td>
110
+ <td class=code>
111
+ <div class='highlight'><pre> <span class="n">_cset</span> <span class="ss">:service_dir</span><span class="p">,</span> <span class="s2">&quot;service&quot;</span>
112
+ <span class="n">_cset</span> <span class="ss">:log_dir</span><span class="p">,</span> <span class="s2">&quot;log&quot;</span>
113
+ <span class="n">_cset</span> <span class="ss">:cache_dir</span><span class="p">,</span> <span class="s2">&quot;cache&quot;</span>
114
+
115
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:service_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">service_dir</span><span class="p">)</span> <span class="p">}</span>
116
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:log_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">log_dir</span><span class="p">)</span> <span class="p">}</span>
117
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:cache_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">cache_dir</span><span class="p">)</span> <span class="p">}</span></pre></div>
118
+ </td>
119
+ </tr>
120
+ <tr id='section-changes_if_you_do_decide_to_muck_with_these!'>
121
+ <td class=docs>
122
+ <div class="pilwrap">
123
+ <a class="pilcrow" href="#section-changes_if_you_do_decide_to_muck_with_these!">&#182;</a>
124
+ </div>
125
+ <h1></h1>
126
+
127
+ <p>These variables should NOT be changed unless you are very confident in
128
+ what you are doing. Make sure you understand all the implications of your</p>
129
+
130
+ <h1>changes if you do decide to muck with these!</h1>
131
+ </td>
132
+ <td class=code>
133
+ <div class='highlight'><pre> <span class="n">_cset</span><span class="p">(</span><span class="ss">:source</span><span class="p">)</span> <span class="p">{</span> <span class="no">Capistrano</span><span class="o">::</span><span class="no">Deploy</span><span class="o">::</span><span class="no">SCM</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">scm</span><span class="p">,</span> <span class="nb">self</span><span class="p">)</span> <span class="p">}</span>
134
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:strategy</span><span class="p">)</span> <span class="p">{</span> <span class="no">Capistrano</span><span class="o">::</span><span class="no">Deploy</span><span class="o">::</span><span class="no">Strategy</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">deploy_via</span><span class="p">,</span> <span class="nb">self</span><span class="p">)</span> <span class="p">}</span>
135
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:real_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">source</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">query_revision</span><span class="p">(</span><span class="n">revision</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">cmd</span><span class="o">|</span> <span class="n">with_env</span><span class="p">(</span><span class="s2">&quot;LC_ALL&quot;</span><span class="p">,</span> <span class="s2">&quot;C&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="n">run_locally</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span>
136
+
137
+ <span class="n">_cset</span> <span class="ss">:releases</span><span class="p">,</span> <span class="o">[</span> <span class="s2">&quot;alpha&quot;</span><span class="p">,</span> <span class="s2">&quot;beta&quot;</span><span class="p">,</span> <span class="s2">&quot;omega&quot;</span> <span class="o">]</span>
138
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:releases_dir</span><span class="p">)</span> <span class="p">{</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">?</span> <span class="s2">&quot;releases&quot;</span> <span class="p">:</span> <span class="s2">&quot;&quot;</span> <span class="p">}</span>
139
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:releases_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">releases_dir</span><span class="p">)</span> <span class="p">}</span>
140
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:current_workarea</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;readlink </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2"> || true&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span><span class="o">[-</span><span class="mi">1</span><span class="o">]</span> <span class="o">||</span> <span class="n">releases</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="p">}</span></pre></div>
141
+ </td>
142
+ </tr>
143
+ <tr id='section-releases,_paths,_names'>
144
+ <td class=docs>
145
+ <div class="pilwrap">
146
+ <a class="pilcrow" href="#section-releases,_paths,_names">&#182;</a>
147
+ </div>
148
+ <h1></h1>
149
+
150
+ <h1>releases, paths, names</h1>
151
+ </td>
152
+ <td class=code>
153
+ <div class='highlight'><pre> <span class="n">_cset</span> <span class="ss">:previous_path_name</span><span class="p">,</span> <span class="s2">&quot;previous&quot;</span>
154
+ <span class="n">_cset</span> <span class="ss">:current_path_name</span><span class="p">,</span> <span class="s2">&quot;current&quot;</span>
155
+ <span class="n">_cset</span> <span class="ss">:next_path_name</span><span class="p">,</span> <span class="s2">&quot;next&quot;</span>
156
+ <span class="n">_cset</span> <span class="p">(</span><span class="ss">:active_path_name</span><span class="p">)</span> <span class="p">{</span> <span class="n">current_path_name</span> <span class="p">}</span>
157
+ <span class="n">_cset</span> <span class="ss">:compare_path_name</span><span class="p">,</span> <span class="s2">&quot;compare&quot;</span>
158
+ <span class="n">_cset</span> <span class="ss">:migrate_path_name</span><span class="p">,</span> <span class="s2">&quot;migrate&quot;</span>
159
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:deploy_path_name</span><span class="p">)</span> <span class="p">{</span> <span class="n">current_path_name</span> <span class="p">}</span>
160
+
161
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:previous_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">previous_path_name</span><span class="p">)</span> <span class="p">}</span>
162
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:current_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">current_path_name</span><span class="p">)</span> <span class="p">}</span>
163
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:external_path</span><span class="p">)</span> <span class="p">{</span> <span class="n">current_path</span> <span class="p">}</span>
164
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:next_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">next_path_name</span><span class="p">)</span> <span class="p">}</span>
165
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:compare_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">compare_path_name</span><span class="p">)</span> <span class="p">}</span>
166
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:migrate_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">migrate_path_name</span><span class="p">)</span> <span class="p">}</span>
167
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:deploy_path</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">,</span> <span class="n">deploy_path_name</span><span class="p">)</span> <span class="p">}</span>
168
+
169
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:rollback_release_name</span><span class="p">)</span> <span class="p">{</span>
170
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span>
171
+ <span class="n">w</span> <span class="o">=</span> <span class="n">current_workarea</span>
172
+ <span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">releases</span><span class="o">[</span><span class="p">(</span><span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">))</span><span class="o">%</span><span class="n">releases</span><span class="o">.</span><span class="n">length</span><span class="o">]</span>
173
+ <span class="k">else</span>
174
+ <span class="s2">&quot;&quot;</span>
175
+ <span class="k">end</span>
176
+ <span class="p">}</span>
177
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:previous_release_name</span><span class="p">)</span> <span class="p">{</span>
178
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span>
179
+ <span class="n">w</span> <span class="o">=</span> <span class="n">current_workarea</span>
180
+ <span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">releases</span><span class="o">[</span><span class="p">(</span><span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">releases</span><span class="o">.</span><span class="n">length</span><span class="o">]</span>
181
+ <span class="k">else</span>
182
+ <span class="s2">&quot;&quot;</span>
183
+ <span class="k">end</span>
184
+ <span class="p">}</span>
185
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:current_release_name</span><span class="p">)</span> <span class="p">{</span>
186
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span>
187
+ <span class="n">w</span> <span class="o">=</span> <span class="n">current_workarea</span>
188
+ <span class="n">stage</span> <span class="o">=</span> <span class="n">releases</span><span class="o">[</span><span class="p">((</span><span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)?</span><span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)</span><span class="ss">:-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">releases</span><span class="o">.</span><span class="n">length</span><span class="o">]</span>
189
+ <span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">figlet</span><span class="si">}</span><span class="s2"> -w 200 on </span><span class="si">#{</span><span class="n">stage</span><span class="si">}</span><span class="s2">&quot;</span>
190
+ <span class="n">stage</span>
191
+ <span class="k">else</span>
192
+ <span class="s2">&quot;&quot;</span>
193
+ <span class="k">end</span>
194
+ <span class="p">}</span>
195
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:next_release_name</span><span class="p">)</span> <span class="p">{</span>
196
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span>
197
+ <span class="n">w</span> <span class="o">=</span> <span class="n">current_workarea</span>
198
+ <span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">releases</span><span class="o">[</span><span class="p">(</span><span class="n">releases</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">w</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">releases</span><span class="o">.</span><span class="n">length</span><span class="o">]</span>
199
+ <span class="k">else</span>
200
+ <span class="s2">&quot;&quot;</span>
201
+ <span class="k">end</span>
202
+ <span class="p">}</span>
203
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:active_release_name</span><span class="p">)</span> <span class="p">{</span> <span class="n">current_workarea</span> <span class="p">}</span>
204
+ <span class="n">_cset</span> <span class="ss">:compare_release_name</span><span class="p">,</span> <span class="n">compare_path_name</span>
205
+ <span class="n">_cset</span> <span class="ss">:migrate_release_name</span><span class="p">,</span> <span class="n">migrate_path_name</span>
206
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:deploy_release_name</span><span class="p">)</span> <span class="p">{</span> <span class="n">current_release_name</span> <span class="p">}</span>
207
+
208
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:rollback_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">rollback_release_name</span><span class="p">)</span> <span class="p">}</span>
209
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:previous_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">previous_release_name</span><span class="p">)</span> <span class="p">}</span>
210
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:current_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">current_release_name</span><span class="p">)</span> <span class="p">}</span>
211
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:next_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">next_release_name</span><span class="p">)</span> <span class="p">}</span>
212
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:active_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">active_release_name</span><span class="p">)</span> <span class="p">}</span>
213
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:compare_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">compare_release_name</span><span class="p">)</span> <span class="p">}</span>
214
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:migrate_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">migrate_release_name</span><span class="p">)</span> <span class="p">}</span>
215
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:deploy_release</span><span class="p">)</span> <span class="p">{</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">releases_path</span><span class="p">,</span> <span class="n">deploy_release_name</span><span class="p">)</span> <span class="p">}</span>
216
+
217
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:rollback_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">rollback_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
218
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:previous_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">previous_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
219
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:current_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">current_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
220
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:next_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">next_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
221
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:active_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">active_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
222
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:compare_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">compare_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
223
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:migrate_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">migrate_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
224
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:deploy_revision</span><span class="p">)</span> <span class="p">{</span> <span class="n">capture</span><span class="p">(</span><span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">deploy_release</span><span class="si">}</span><span class="s2">/REVISION&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span> <span class="p">}</span>
225
+ </pre></div>
226
+ </td>
227
+ </tr>
228
+ <tr id='section-deploy:lock_defaults'>
229
+ <td class=docs>
230
+ <div class="pilwrap">
231
+ <a class="pilcrow" href="#section-deploy:lock_defaults">&#182;</a>
232
+ </div>
233
+ <h1></h1>
234
+
235
+ <h1>deploy:lock defaults</h1>
236
+ </td>
237
+ <td class=code>
238
+ <div class='highlight'><pre> <span class="n">_cset</span><span class="p">(</span><span class="ss">:want_unlock</span><span class="p">)</span> <span class="p">{</span> <span class="kp">true</span> <span class="p">}</span>
239
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:lock_timeout</span><span class="p">)</span> <span class="p">{</span> <span class="mi">86400</span> <span class="p">}</span>
240
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:lock_name</span><span class="p">)</span> <span class="p">{</span> <span class="n">application</span> <span class="p">}</span>
241
+ <span class="n">_cset</span><span class="p">(</span><span class="ss">:lock_path</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">log_path</span><span class="si">}</span><span class="s2">/.</span><span class="si">#{</span><span class="n">lock_name</span><span class="si">}</span><span class="s2">_deploy_lock&quot;</span> <span class="p">}</span></pre></div>
242
+ </td>
243
+ </tr>
244
+ <tr id='section-These_are_helper_methods_that_will_be_available_to_your_recipes.'>
245
+ <td class=docs>
246
+ <div class="pilwrap">
247
+ <a class="pilcrow" href="#section-These_are_helper_methods_that_will_be_available_to_your_recipes.">&#182;</a>
248
+ </div>
249
+ <h1></h1>
250
+
251
+ <h1>These are helper methods that will be available to your recipes.</h1>
252
+ </td>
253
+ <td class=code>
254
+ <div class='highlight'><pre></pre></div>
255
+ </td>
256
+ </tr>
257
+ <tr id='section-9'>
258
+ <td class=docs>
259
+ <div class="pilwrap">
260
+ <a class="pilcrow" href="#section-9">&#182;</a>
261
+ </div>
262
+ <p>Auxiliary helper method for the deploy:check' task. Lets you set up your
263
+ own dependencies.</p>
264
+ </td>
265
+ <td class=code>
266
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nf">depend</span><span class="p">(</span><span class="n">location</span><span class="p">,</span> <span class="n">type</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
267
+ <span class="n">deps</span> <span class="o">=</span> <span class="n">fetch</span><span class="p">(</span><span class="ss">:dependencies</span><span class="p">,</span> <span class="p">{})</span>
268
+ <span class="n">deps</span><span class="o">[</span><span class="n">location</span><span class="o">]</span> <span class="o">||=</span> <span class="p">{}</span>
269
+ <span class="n">deps</span><span class="o">[</span><span class="n">location</span><span class="o">][</span><span class="n">type</span><span class="o">]</span> <span class="o">||=</span> <span class="o">[]</span>
270
+ <span class="n">deps</span><span class="o">[</span><span class="n">location</span><span class="o">][</span><span class="n">type</span><span class="o">]</span> <span class="o">&lt;&lt;</span> <span class="n">args</span>
271
+ <span class="n">set</span> <span class="ss">:dependencies</span><span class="p">,</span> <span class="n">deps</span>
272
+ <span class="k">end</span></pre></div>
273
+ </td>
274
+ </tr>
275
+ <tr id='section-10'>
276
+ <td class=docs>
277
+ <div class="pilwrap">
278
+ <a class="pilcrow" href="#section-10">&#182;</a>
279
+ </div>
280
+ <p>Temporarily sets an environment variable, yields to a block, and restores
281
+ the value when it is done.</p>
282
+ </td>
283
+ <td class=code>
284
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nf">with_env</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
285
+ <span class="n">saved</span><span class="p">,</span> <span class="no">ENV</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="o">=</span> <span class="no">ENV</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span><span class="p">,</span> <span class="n">value</span>
286
+ <span class="k">yield</span>
287
+ <span class="k">ensure</span>
288
+ <span class="no">ENV</span><span class="o">[</span><span class="nb">name</span><span class="o">]</span> <span class="o">=</span> <span class="n">saved</span>
289
+ <span class="k">end</span></pre></div>
290
+ </td>
291
+ </tr>
292
+ <tr id='section-11'>
293
+ <td class=docs>
294
+ <div class="pilwrap">
295
+ <a class="pilcrow" href="#section-11">&#182;</a>
296
+ </div>
297
+ <p>logs the command then executes it locally.
298
+ returns the command output as a string</p>
299
+ </td>
300
+ <td class=code>
301
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nf">run_locally</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
302
+ <span class="n">logger</span><span class="o">.</span><span class="n">trace</span> <span class="s2">&quot;executing locally: </span><span class="si">#{</span><span class="n">cmd</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">logger</span>
303
+ <span class="n">output_on_stdout</span> <span class="o">=</span> <span class="kp">nil</span>
304
+ <span class="n">elapsed</span> <span class="o">=</span> <span class="no">Benchmark</span><span class="o">.</span><span class="n">realtime</span> <span class="k">do</span>
305
+ <span class="n">output_on_stdout</span> <span class="o">=</span> <span class="sb">`</span><span class="si">#{</span><span class="n">cmd</span><span class="si">}</span><span class="sb">`</span>
306
+ <span class="k">end</span>
307
+ <span class="k">if</span> <span class="vg">$?</span><span class="o">.</span><span class="n">to_i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="c1"># $? is command exit code (posix style)</span>
308
+ <span class="k">raise</span> <span class="no">Capistrano</span><span class="o">::</span><span class="no">LocalArgumentError</span><span class="p">,</span> <span class="s2">&quot;Command </span><span class="si">#{</span><span class="n">cmd</span><span class="si">}</span><span class="s2"> returned status code </span><span class="si">#{</span><span class="vg">$?</span><span class="si">}</span><span class="s2">&quot;</span>
309
+ <span class="k">end</span>
310
+ <span class="n">logger</span><span class="o">.</span><span class="n">trace</span> <span class="s2">&quot;command finished in </span><span class="si">#{</span><span class="p">(</span><span class="n">elapsed</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span><span class="o">.</span><span class="n">round</span><span class="si">}</span><span class="s2">ms&quot;</span> <span class="k">if</span> <span class="n">logger</span>
311
+ <span class="n">output_on_stdout</span>
312
+ <span class="k">end</span></pre></div>
313
+ </td>
314
+ </tr>
315
+ <tr id='section-12'>
316
+ <td class=docs>
317
+ <div class="pilwrap">
318
+ <a class="pilcrow" href="#section-12">&#182;</a>
319
+ </div>
320
+ <p>If a command is given, this will try to execute the given command, as
321
+ described below. Otherwise, it will return a string for use in embedding in
322
+ another command, for executing that command as described below.</p>
323
+
324
+ <p>If :run<em>method is :sudo (or :use</em>sudo is true), this executes the given command
325
+ via +sudo+. Otherwise is uses +run+. If :as is given as a key, it will be
326
+ passed as the user to sudo as, if using sudo. If the :as key is not given,
327
+ it will default to whatever the value of the :admin_runner variable is,
328
+ which (by default) is unset.</p>
329
+
330
+ <p>THUS, if you want to try to run something via sudo, and what to use the
331
+ root user, you&rsquo;d just to try<em>sudo(&lsquo;something&rsquo;). If you wanted to try</em>sudo as
332
+ someone else, you&rsquo;d just do try<em>sudo(&lsquo;something&rsquo;, :as =&gt; &ldquo;bob&rdquo;). If you
333
+ always wanted sudo to run as a particular user, you could do
334
+ set(:admin</em>runner, &ldquo;bob&rdquo;).</p>
335
+ </td>
336
+ <td class=code>
337
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nf">try_sudo</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
338
+ <span class="n">options</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span> <span class="p">?</span> <span class="n">args</span><span class="o">.</span><span class="n">pop</span> <span class="p">:</span> <span class="p">{}</span>
339
+ <span class="n">command</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">shift</span>
340
+ <span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">,</span> <span class="s2">&quot;too many arguments&quot;</span> <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">any?</span>
341
+
342
+ <span class="n">as</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:as</span><span class="p">,</span> <span class="n">fetch</span><span class="p">(</span><span class="ss">:admin_runner</span><span class="p">,</span> <span class="kp">nil</span><span class="p">))</span>
343
+ <span class="n">via</span> <span class="o">=</span> <span class="n">fetch</span><span class="p">(</span><span class="ss">:run_method</span><span class="p">,</span> <span class="ss">:sudo</span><span class="p">)</span>
344
+ <span class="k">if</span> <span class="n">command</span>
345
+ <span class="n">invoke_command</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="ss">:via</span> <span class="o">=&gt;</span> <span class="n">via</span><span class="p">,</span> <span class="ss">:as</span> <span class="o">=&gt;</span> <span class="n">as</span><span class="p">)</span>
346
+ <span class="k">elsif</span> <span class="n">via</span> <span class="o">==</span> <span class="ss">:sudo</span>
347
+ <span class="n">sudo</span><span class="p">(</span><span class="ss">:as</span> <span class="o">=&gt;</span> <span class="n">as</span><span class="p">)</span>
348
+ <span class="k">else</span>
349
+ <span class="s2">&quot;&quot;</span>
350
+ <span class="k">end</span>
351
+ <span class="k">end</span></pre></div>
352
+ </td>
353
+ </tr>
354
+ <tr id='section-13'>
355
+ <td class=docs>
356
+ <div class="pilwrap">
357
+ <a class="pilcrow" href="#section-13">&#182;</a>
358
+ </div>
359
+ <p>Same as sudo, but tries sudo with :as set to the value of the :runner
360
+ variable (which defaults to &ldquo;app&rdquo;).</p>
361
+ </td>
362
+ <td class=code>
363
+ <div class='highlight'><pre> <span class="k">def</span> <span class="nf">try_runner</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
364
+ <span class="n">options</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span> <span class="p">?</span> <span class="n">args</span><span class="o">.</span><span class="n">pop</span> <span class="p">:</span> <span class="p">{}</span>
365
+ <span class="n">args</span> <span class="o">&lt;&lt;</span> <span class="n">options</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="ss">:as</span> <span class="o">=&gt;</span> <span class="n">fetch</span><span class="p">(</span><span class="ss">:runner</span><span class="p">,</span> <span class="s2">&quot;app&quot;</span><span class="p">))</span>
366
+ <span class="n">try_sudo</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
367
+ <span class="k">end</span></pre></div>
368
+ </td>
369
+ </tr>
370
+ <tr id='section-You_can_have_cap_give_you_a_summary_of_them_with_cap_-T'.'>
371
+ <td class=docs>
372
+ <div class="pilwrap">
373
+ <a class="pilcrow" href="#section-You_can_have_cap_give_you_a_summary_of_them_with_cap_-T'.">&#182;</a>
374
+ </div>
375
+ <h1></h1>
376
+
377
+ <p>These are the tasks that are available to help with deploying web apps.</p>
378
+
379
+ <h1>You can have cap give you a summary of them with cap -T'.</h1>
380
+
381
+ </td>
382
+ <td class=code>
383
+ <div class='highlight'><pre> <span class="n">namespace</span> <span class="ss">:deploy</span> <span class="k">do</span>
384
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
385
+ <span class="sh"> Deploys your project. This calls both `update&#39; and `restart&#39;. Note that \</span>
386
+ <span class="sh"> this will generally only work for applications that have already been deployed \</span>
387
+ <span class="sh"> once.</span>
388
+ <span class="no"> DESC</span>
389
+ <span class="n">task</span> <span class="ss">:default</span> <span class="k">do</span>
390
+ <span class="n">update</span>
391
+ <span class="n">restart</span>
392
+ <span class="k">end</span>
393
+
394
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
395
+ <span class="sh"> Copies your project and updates the symlink. It does this in a \</span>
396
+ <span class="sh"> transaction, so that if either `update_code&#39; or `symlink&#39; fail, all \</span>
397
+ <span class="sh"> changes made to the remote servers will be rolled back, leaving your \</span>
398
+ <span class="sh"> system in the same state it was in before `update&#39; was invoked. Usually, \</span>
399
+ <span class="sh"> you will want to call `deploy&#39; instead of `update&#39;, but `update&#39; can be \</span>
400
+ <span class="sh"> handy if you want to deploy, but not immediately restart your application.</span>
401
+ <span class="no"> DESC</span>
402
+ <span class="n">task</span> <span class="ss">:update</span> <span class="k">do</span>
403
+ <span class="n">transaction</span> <span class="k">do</span>
404
+ <span class="n">update_code</span>
405
+ <span class="n">symlink</span>
406
+ <span class="k">end</span>
407
+ <span class="k">end</span>
408
+
409
+ <span class="n">task</span> <span class="ss">:bootstrap_code</span> <span class="k">do</span>
410
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="c1"># without services and run as root</span>
411
+ <span class="n">run</span> <span class="s2">&quot;[[ -d </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2"> ]] || </span><span class="si">#{</span><span class="n">try_sudo</span><span class="si">}</span><span class="s2"> install -d -m </span><span class="si">#{</span><span class="n">dir_perms</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">try_sudo</span><span class="o">.</span><span class="n">empty?</span> <span class="p">?</span> <span class="s1">&#39;&#39;</span> <span class="p">:</span> <span class="s2">&quot;-o </span><span class="si">#{</span><span class="n">root_user</span><span class="si">}</span><span class="s2"> -g </span><span class="si">#{</span><span class="n">root_group</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">&quot;</span>
412
+ <span class="n">run</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">try_sudo</span><span class="si">}</span><span class="s2"> install -d -m </span><span class="si">#{</span><span class="n">dir_perms</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">try_sudo</span><span class="o">.</span><span class="n">empty?</span> <span class="p">?</span> <span class="s1">&#39;&#39;</span> <span class="p">:</span> <span class="s2">&quot;-o </span><span class="si">#{</span><span class="n">user</span><span class="si">}</span><span class="s2"> -g </span><span class="si">#{</span><span class="n">group</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">releases_path</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/log&quot;</span>
413
+ <span class="k">else</span>
414
+ <span class="n">dirs</span> <span class="o">=</span> <span class="o">[</span> <span class="n">releases_path</span><span class="p">,</span> <span class="n">service_path</span><span class="p">,</span> <span class="n">log_path</span><span class="p">,</span> <span class="n">cache_path</span> <span class="o">]</span>
415
+ <span class="n">dir_args</span> <span class="o">=</span> <span class="n">dirs</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">d</span><span class="o">|</span> <span class="n">d</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="p">}</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
416
+ <span class="n">run</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">try_sudo</span><span class="si">}</span><span class="s2"> install -d -m </span><span class="si">#{</span><span class="n">dir_perms</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">try_sudo</span><span class="o">.</span><span class="n">empty?</span> <span class="p">?</span> <span class="s1">&#39;&#39;</span> <span class="p">:</span> <span class="s2">&quot;-o </span><span class="si">#{</span><span class="n">user</span><span class="si">}</span><span class="s2"> -g </span><span class="si">#{</span><span class="n">group</span><span class="si">}</span><span class="s2">&quot;</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">&quot;</span>
417
+ <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2"> &amp;&amp; install -d -m </span><span class="si">#{</span><span class="n">dir_perms</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">dir_args</span><span class="si">}</span><span class="s2">&quot;</span>
418
+ <span class="k">end</span>
419
+ <span class="k">end</span>
420
+
421
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
422
+ <span class="sh"> Copies your project to the remote servers. This is the first stage \</span>
423
+ <span class="sh"> of any deployment; moving your updated code and assets to the deployment \</span>
424
+ <span class="sh"> servers. You will rarely call this task directly, however; instead, you \</span>
425
+ <span class="sh"> should call the `deploy&#39; task (to do a complete deploy) or the `update&#39; \</span>
426
+ <span class="sh"> task (if you want to perform the `restart&#39; task separately).</span>
427
+ <span class="no"> DESC</span>
428
+ <span class="n">task</span> <span class="ss">:update_code</span> <span class="k">do</span>
429
+ <span class="n">bootstrap_code</span>
430
+ <span class="n">strategy</span><span class="o">.</span><span class="n">deploy!</span>
431
+ <span class="n">bundle</span>
432
+ <span class="n">cook</span>
433
+ <span class="k">end</span>
434
+
435
+ <span class="n">task</span> <span class="ss">:symlink_next</span> <span class="k">do</span>
436
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;=</span> <span class="mi">2</span>
437
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">current_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">next_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
438
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">next_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">next_path</span><span class="si">}</span><span class="s2">&quot;</span>
439
+ <span class="k">end</span>
440
+ <span class="k">end</span>
441
+
442
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
443
+ <span class="sh"> Updates the symlink to the most recently deployed version. Capistrano works \</span>
444
+ <span class="sh"> by putting each new release of your application in its own directory. When \</span>
445
+ <span class="sh"> you deploy a new version, this task&#39;s job is to update the `current&#39; symlink \</span>
446
+ <span class="sh"> to point at the new version. You will rarely need to call this task \</span>
447
+ <span class="sh"> directly; instead, use the `deploy&#39; task (which performs a complete \</span>
448
+ <span class="sh"> deploy, including `restart&#39;) or the &#39;update&#39; task (which does everything \</span>
449
+ <span class="sh"> except `restart&#39;).</span>
450
+ <span class="no"> DESC</span>
451
+ <span class="n">task</span> <span class="ss">:symlink</span> <span class="k">do</span>
452
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span>
453
+ <span class="n">on_rollback</span> <span class="k">do</span>
454
+ <span class="k">if</span> <span class="n">rollback_release</span>
455
+ <span class="n">run</span> <span class="s2">&quot;rm -f </span><span class="si">#{</span><span class="n">previous_path</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">next_path</span><span class="si">}</span><span class="s2">&quot;</span>
456
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">rollback_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
457
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">&quot;</span>
458
+ <span class="k">else</span>
459
+ <span class="n">logger</span><span class="o">.</span><span class="n">important</span> <span class="s2">&quot;no previous release to rollback to, rollback of symlink skipped&quot;</span>
460
+ <span class="k">end</span>
461
+ <span class="k">end</span>
462
+
463
+ <span class="k">if</span> <span class="n">releases</span><span class="o">.</span><span class="n">length</span> <span class="o">==</span> <span class="mi">1</span>
464
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">current_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
465
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">&quot;</span>
466
+ <span class="k">else</span>
467
+ <span class="n">run</span> <span class="s2">&quot;rm -f </span><span class="si">#{</span><span class="n">previous_path</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">next_path</span><span class="si">}</span><span class="s2">&quot;</span>
468
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">current_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
469
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">&quot;</span>
470
+ <span class="k">if</span> <span class="n">current_path</span> <span class="o">!=</span> <span class="n">external_path</span>
471
+ <span class="n">run</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">external_path</span><span class="p">)</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">?</span> <span class="s2">&quot;&quot;</span> <span class="p">:</span> <span class="n">try_sudo</span><span class="si">}</span><span class="s2"> ln -nfs </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">external_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
472
+ <span class="n">run</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">external_path</span><span class="p">)</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">deploy_to</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">?</span> <span class="s2">&quot;&quot;</span> <span class="p">:</span> <span class="n">try_sudo</span><span class="si">}</span><span class="s2"> mv -T </span><span class="si">#{</span><span class="n">external_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">external_path</span><span class="si">}</span><span class="s2">&quot;</span>
473
+ <span class="k">end</span>
474
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">rollback_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">previous_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
475
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">previous_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">previous_path</span><span class="si">}</span><span class="s2">&quot;</span>
476
+ <span class="k">end</span>
477
+
478
+ <span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">figlet</span><span class="si">}</span><span class="s2"> -w 200 </span><span class="si">#{</span><span class="n">current_release_name</span><span class="si">}</span><span class="s2"> activated&quot;</span>
479
+ <span class="k">end</span>
480
+ <span class="k">end</span>
481
+
482
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
483
+ <span class="sh"> Copy files to the currently deployed version. This is useful for updating \</span>
484
+ <span class="sh"> files piecemeal, such as when you need to quickly deploy only a single \</span>
485
+ <span class="sh"> file. Some files, such as updated templates, images, or stylesheets, \</span>
486
+ <span class="sh"> might not require a full deploy, and especially in emergency situations \</span>
487
+ <span class="sh"> it can be handy to just push the updates to production, quickly.</span>
488
+
489
+ <span class="sh"> To use this task, specify the files and directories you want to copy as a \</span>
490
+ <span class="sh"> comma-delimited list in the FILES environment variable. All directories \</span>
491
+ <span class="sh"> will be processed recursively, with all files being pushed to the \</span>
492
+ <span class="sh"> deployment servers.</span>
493
+
494
+ <span class="sh"> $ cap deploy:upload FILES=templates,controller.rb</span>
495
+
496
+ <span class="sh"> Dir globs are also supported:</span>
497
+
498
+ <span class="sh"> $ cap deploy:upload FILES=&#39;config/apache/*.conf&#39;</span>
499
+ <span class="no"> DESC</span>
500
+ <span class="n">task</span> <span class="ss">:upload</span> <span class="k">do</span>
501
+ <span class="n">files</span> <span class="o">=</span> <span class="p">(</span><span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;FILES&quot;</span><span class="o">]</span> <span class="o">||</span> <span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="no">Dir</span><span class="o">[</span><span class="n">f</span><span class="o">.</span><span class="n">strip</span><span class="o">]</span> <span class="p">}</span><span class="o">.</span><span class="n">flatten</span>
502
+ <span class="nb">abort</span> <span class="s2">&quot;Please specify at least one file or directory to update (via the FILES environment variable)&quot;</span> <span class="k">if</span> <span class="n">files</span><span class="o">.</span><span class="n">empty?</span>
503
+
504
+ <span class="n">files</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span> <span class="n">top</span><span class="o">.</span><span class="n">upload</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">deploy_path</span><span class="p">,</span> <span class="n">file</span><span class="p">))</span> <span class="p">}</span>
505
+ <span class="k">end</span>
506
+
507
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
508
+ <span class="sh"> Restarts your application.</span>
509
+ <span class="no"> DESC</span>
510
+ <span class="n">task</span> <span class="ss">:restart</span> <span class="k">do</span>
511
+ <span class="k">end</span>
512
+
513
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
514
+ <span class="sh"> Builds binaries (like assets, jars, format conversions for distribution</span>
515
+ <span class="sh"> by deploy:dist.</span>
516
+ <span class="no"> DESC</span>
517
+ <span class="n">task</span> <span class="ss">:build</span> <span class="k">do</span>
518
+ <span class="k">end</span>
519
+
520
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
521
+ <span class="sh"> Distribute binaries built in deploy:build.</span>
522
+ <span class="no"> DESC</span>
523
+ <span class="n">task</span> <span class="ss">:dist</span> <span class="k">do</span>
524
+ <span class="k">end</span>
525
+
526
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
527
+ <span class="sh"> Checkpoint for various language bundlers</span>
528
+ <span class="no"> DESC</span>
529
+ <span class="n">task</span> <span class="ss">:bundle</span> <span class="k">do</span>
530
+ <span class="k">end</span>
531
+
532
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
533
+ <span class="sh"> Apply microwave tvdinners to a release directory.</span>
534
+ <span class="no"> DESC</span>
535
+ <span class="n">task</span> <span class="ss">:cook</span> <span class="k">do</span>
536
+ <span class="k">end</span>
537
+
538
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
539
+ <span class="sh"> Compares your application.</span>
540
+ <span class="no"> DESC</span>
541
+ <span class="n">task</span> <span class="ss">:compare</span> <span class="k">do</span>
542
+ <span class="n">set</span> <span class="ss">:deploy_path_name</span><span class="p">,</span> <span class="s2">&quot;compare&quot;</span>
543
+ <span class="n">set</span> <span class="ss">:deploy_release_name</span><span class="p">,</span> <span class="s2">&quot;compare&quot;</span>
544
+ <span class="n">update_code</span>
545
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">deploy_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
546
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">&quot;</span>
547
+ <span class="k">end</span>
548
+
549
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
550
+ <span class="sh"> Runs a repl in the compare release</span>
551
+ <span class="no"> DESC</span>
552
+ <span class="n">task</span> <span class="ss">:repl</span> <span class="k">do</span>
553
+ <span class="n">set</span> <span class="ss">:deploy_path_name</span><span class="p">,</span> <span class="s2">&quot;compare&quot;</span>
554
+ <span class="n">set</span> <span class="ss">:deploy_release_name</span><span class="p">,</span> <span class="s2">&quot;compare&quot;</span>
555
+ <span class="n">update_code</span>
556
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">deploy_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
557
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">&quot;</span>
558
+ <span class="k">end</span>
559
+
560
+ <span class="n">namespace</span> <span class="ss">:rollback</span> <span class="k">do</span>
561
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
562
+ <span class="sh"> [internal] Points the current symlink at the previous revision.</span>
563
+ <span class="sh"> This is called by the rollback sequence, and should rarely (if</span>
564
+ <span class="sh"> ever) need to be called directly.</span>
565
+ <span class="no"> DESC</span>
566
+ <span class="n">task</span> <span class="ss">:revision</span> <span class="k">do</span>
567
+ <span class="k">if</span> <span class="n">previous_release</span>
568
+ <span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">figlet</span><span class="si">}</span><span class="s2"> -w 200 on </span><span class="si">#{</span><span class="n">previous_release_name</span><span class="si">}</span><span class="s2">&quot;</span>
569
+ <span class="n">run</span> <span class="s2">&quot;rm -f </span><span class="si">#{</span><span class="n">previous_path</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">next_path</span><span class="si">}</span><span class="s2">&quot;</span>
570
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">previous_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
571
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2">&quot;</span>
572
+ <span class="k">else</span>
573
+ <span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">figlet</span><span class="si">}</span><span class="s2"> -w 200 failed to rollback&quot;</span>
574
+ <span class="nb">abort</span> <span class="s2">&quot;could not rollback the code because there is no prior release&quot;</span>
575
+ <span class="k">end</span>
576
+ <span class="k">end</span>
577
+
578
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
579
+ <span class="sh"> [internal] Removes the most recently deployed release.</span>
580
+ <span class="sh"> This is called by the rollback sequence, and should rarely</span>
581
+ <span class="sh"> (if ever) need to be called directly.</span>
582
+ <span class="no"> DESC</span>
583
+ <span class="n">task</span> <span class="ss">:cleanup</span> <span class="k">do</span>
584
+ <span class="k">end</span>
585
+
586
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
587
+ <span class="sh"> Rolls back to the previously deployed version. The `current&#39; symlink will \</span>
588
+ <span class="sh"> be updated to point at the previously deployed version, and then the \</span>
589
+ <span class="sh"> current release will be removed from the servers. You&#39;ll generally want \</span>
590
+ <span class="sh"> to call `rollback&#39; instead, as it performs a `restart&#39; as well.</span>
591
+ <span class="no"> DESC</span>
592
+ <span class="n">task</span> <span class="ss">:code</span> <span class="k">do</span>
593
+ <span class="n">revision</span>
594
+ <span class="n">cleanup</span>
595
+ <span class="k">end</span>
596
+
597
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
598
+ <span class="sh"> Rolls back to a previous version and restarts. This is handy if you ever \</span>
599
+ <span class="sh"> discover that you&#39;ve deployed a lemon; `cap rollback&#39; and you&#39;re right \</span>
600
+ <span class="sh"> back where you were, on the previously deployed version.</span>
601
+ <span class="no"> DESC</span>
602
+ <span class="n">task</span> <span class="ss">:default</span> <span class="k">do</span>
603
+ <span class="n">revision</span>
604
+ <span class="n">restart</span>
605
+ <span class="n">cleanup</span>
606
+ <span class="k">end</span>
607
+ <span class="k">end</span>
608
+
609
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
610
+ <span class="sh"> Override in deploy recipes. Formerly a railsy rake db:migrate.</span>
611
+ <span class="no"> DESC</span>
612
+ <span class="n">task</span> <span class="ss">:migrate</span> <span class="k">do</span>
613
+ <span class="n">set</span> <span class="ss">:deploy_path_name</span><span class="p">,</span> <span class="s2">&quot;migrate&quot;</span>
614
+ <span class="n">set</span> <span class="ss">:deploy_release_name</span><span class="p">,</span> <span class="s2">&quot;migrate&quot;</span>
615
+ <span class="n">update_code</span>
616
+ <span class="n">run</span> <span class="s2">&quot;ln -nfs </span><span class="si">#{</span><span class="n">deploy_release</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">.new&quot;</span>
617
+ <span class="n">run</span> <span class="s2">&quot;mv -T </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">.new </span><span class="si">#{</span><span class="n">deploy_path</span><span class="si">}</span><span class="s2">&quot;</span>
618
+ <span class="k">end</span>
619
+
620
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
621
+ <span class="sh"> Test deployment dependencies. Checks things like directory permissions, \</span>
622
+ <span class="sh"> necessary utilities, and so forth, reporting on the things that appear to \</span>
623
+ <span class="sh"> be incorrect or missing. This is good for making sure a deploy has a \</span>
624
+ <span class="sh"> chance of working before you actually run `cap deploy&#39;.</span>
625
+
626
+ <span class="sh"> You can define your own dependencies, as well, using the `depend&#39; method:</span>
627
+
628
+ <span class="sh"> depend :remote, :gem, &quot;tzinfo&quot;, &quot;&gt;=0.3.3&quot;</span>
629
+ <span class="sh"> depend :local, :command, &quot;svn&quot;</span>
630
+ <span class="sh"> depend :remote, :directory, &quot;/u/depot/files&quot;</span>
631
+ <span class="no"> DESC</span>
632
+ <span class="n">task</span> <span class="ss">:check</span> <span class="k">do</span>
633
+ <span class="n">dependencies</span> <span class="o">=</span> <span class="n">strategy</span><span class="o">.</span><span class="n">check!</span>
634
+
635
+ <span class="n">other</span> <span class="o">=</span> <span class="n">fetch</span><span class="p">(</span><span class="ss">:dependencies</span><span class="p">,</span> <span class="p">{})</span>
636
+ <span class="n">other</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">location</span><span class="p">,</span> <span class="n">types</span><span class="o">|</span>
637
+ <span class="n">types</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">type</span><span class="p">,</span> <span class="n">calls</span><span class="o">|</span>
638
+ <span class="k">if</span> <span class="n">type</span> <span class="o">==</span> <span class="ss">:gem</span>
639
+ <span class="n">dependencies</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">location</span><span class="p">)</span><span class="o">.</span><span class="n">command</span><span class="p">(</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:gem_command</span><span class="p">,</span> <span class="s2">&quot;gem&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">or</span><span class="p">(</span><span class="s2">&quot;`gem&#39; command could not be found. Try setting :gem_command&quot;</span><span class="p">)</span>
640
+ <span class="k">end</span>
641
+
642
+ <span class="n">calls</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">args</span><span class="o">|</span>
643
+ <span class="n">dependencies</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">location</span><span class="p">)</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">type</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
644
+ <span class="k">end</span>
645
+ <span class="k">end</span>
646
+ <span class="k">end</span>
647
+
648
+ <span class="k">if</span> <span class="n">dependencies</span><span class="o">.</span><span class="n">pass?</span>
649
+ <span class="nb">puts</span> <span class="s2">&quot;You appear to have all necessary dependencies installed&quot;</span>
650
+ <span class="k">else</span>
651
+ <span class="nb">puts</span> <span class="s2">&quot;The following dependencies failed. Please check them and try again:&quot;</span>
652
+ <span class="n">dependencies</span><span class="o">.</span><span class="n">reject</span> <span class="p">{</span> <span class="o">|</span><span class="n">d</span><span class="o">|</span> <span class="n">d</span><span class="o">.</span><span class="n">pass?</span> <span class="p">}</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">d</span><span class="o">|</span>
653
+ <span class="nb">puts</span> <span class="s2">&quot;--&gt; </span><span class="si">#{</span><span class="n">d</span><span class="o">.</span><span class="n">message</span><span class="si">}</span><span class="s2">&quot;</span>
654
+ <span class="k">end</span>
655
+ <span class="nb">abort</span>
656
+ <span class="k">end</span>
657
+ <span class="k">end</span>
658
+
659
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
660
+ <span class="sh"> Start the application servers.</span>
661
+ <span class="no"> DESC</span>
662
+ <span class="n">task</span> <span class="ss">:start</span> <span class="k">do</span>
663
+ <span class="k">end</span>
664
+
665
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
666
+ <span class="sh"> Stop the application servers.</span>
667
+ <span class="no"> DESC</span>
668
+ <span class="n">task</span> <span class="ss">:stop</span> <span class="k">do</span>
669
+ <span class="k">end</span>
670
+
671
+ <span class="n">namespace</span> <span class="ss">:pending</span> <span class="k">do</span>
672
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
673
+ <span class="sh"> Displays the `diff&#39; since your last deploy. This is useful if you want \</span>
674
+ <span class="sh"> to examine what changes are about to be deployed. Note that this might \</span>
675
+ <span class="sh"> not be supported on all SCM&#39;s.</span>
676
+ <span class="no"> DESC</span>
677
+ <span class="n">task</span> <span class="ss">:diff</span> <span class="k">do</span>
678
+ <span class="nb">system</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="n">current_revision</span><span class="p">))</span>
679
+ <span class="k">end</span>
680
+
681
+ <span class="n">desc</span> <span class="o">&lt;&lt;-</span><span class="no">DESC</span>
682
+ <span class="sh"> Displays the commits since your last deploy. This is good for a summary \</span>
683
+ <span class="sh"> of the changes that have occurred since the last deploy. Note that this \</span>
684
+ <span class="sh"> might not be supported on all SCM&#39;s.</span>
685
+ <span class="no"> DESC</span>
686
+ <span class="n">task</span> <span class="ss">:default</span> <span class="k">do</span>
687
+ <span class="n">from</span> <span class="o">=</span> <span class="n">source</span><span class="o">.</span><span class="n">next_revision</span><span class="p">(</span><span class="n">current_revision</span><span class="p">)</span>
688
+ <span class="nb">system</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">from</span><span class="p">))</span>
689
+ <span class="k">end</span>
690
+ <span class="k">end</span>
691
+
692
+ <span class="n">task</span> <span class="ss">:lock</span> <span class="k">do</span>
693
+ <span class="n">bootstrap_code</span>
694
+
695
+ <span class="n">epoch</span> <span class="o">=</span> <span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">to_i</span>
696
+ <span class="n">locker</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
697
+
698
+ <span class="n">run</span> <span class="s2">&quot;cat </span><span class="si">#{</span><span class="n">lock_path</span><span class="si">}</span><span class="s2"> 2&gt;&amp;- || true&quot;</span> <span class="k">do</span> <span class="o">|</span><span class="n">ch</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">data</span><span class="o">|</span>
699
+ <span class="n">locker</span> <span class="o">&lt;&lt;</span> <span class="n">data</span>
700
+ <span class="k">end</span>
701
+
702
+ <span class="k">if</span> <span class="o">!</span><span class="n">locker</span><span class="o">.</span><span class="n">empty?</span>
703
+ <span class="n">lock_epoch</span> <span class="o">=</span> <span class="n">locker</span><span class="o">.</span><span class="n">split</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">to_i</span>
704
+ <span class="n">lock_user</span> <span class="o">=</span> <span class="n">locker</span><span class="o">.</span><span class="n">split</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
705
+
706
+ <span class="n">lock_elasped</span> <span class="o">=</span> <span class="n">epoch</span><span class="o">-</span><span class="n">lock_epoch</span>
707
+
708
+ <span class="k">if</span> <span class="n">lock_elasped</span> <span class="o">&lt;</span> <span class="n">lock_timeout</span>
709
+ <span class="kp">true</span> <span class="c1"># don&#39;t do anything if lock times out, just advise unlock</span>
710
+ <span class="k">end</span>
711
+
712
+ <span class="nb">system</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">figlet</span><span class="si">}</span><span class="s2"> failed to lock&quot;</span>
713
+ <span class="nb">puts</span> <span class="s2">&quot;deploy locked by </span><span class="si">#{</span><span class="n">lock_user</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">epoch</span><span class="o">-</span><span class="n">lock_epoch</span><span class="si">}</span><span class="s2"> seconds ago&quot;</span>
714
+ <span class="nb">puts</span> <span class="s2">&quot;use bin/unlock to remove this lock&quot;</span>
715
+ <span class="nb">abort</span>
716
+ <span class="k">end</span>
717
+
718
+ <span class="n">run_script</span> <span class="o">=</span> <span class="o">&lt;&lt;-</span><span class="no">SCRIPT</span>
719
+ <span class="sh"> echo #{epoch} #{ENV[&#39;AO_USER&#39;]} &gt; #{lock_path};</span>
720
+ <span class="no"> SCRIPT</span>
721
+
722
+ <span class="k">if</span> <span class="n">want_unlock</span>
723
+ <span class="nb">at_exit</span> <span class="p">{</span> <span class="nb">self</span><span class="o">.</span><span class="n">unlock</span><span class="p">;</span> <span class="p">}</span>
724
+ <span class="k">end</span>
725
+
726
+ <span class="n">run</span> <span class="n">run_script</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/[\n\r]+[ \t]+/</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">)</span>
727
+ <span class="k">end</span>
728
+
729
+ <span class="n">task</span> <span class="ss">:lock_compare</span> <span class="k">do</span>
730
+ <span class="n">set</span> <span class="ss">:lock_name</span><span class="p">,</span> <span class="ss">:compare</span>
731
+ <span class="n">lock</span>
732
+ <span class="k">end</span>
733
+
734
+ <span class="n">task</span> <span class="ss">:lock_migrate</span> <span class="k">do</span>
735
+ <span class="n">set</span> <span class="ss">:lock_name</span><span class="p">,</span> <span class="ss">:migrate</span>
736
+ <span class="n">lock</span>
737
+ <span class="k">end</span>
738
+
739
+ <span class="n">task</span> <span class="ss">:dont_unlock</span> <span class="k">do</span>
740
+ <span class="n">set</span> <span class="ss">:want_unlock</span><span class="p">,</span> <span class="kp">false</span>
741
+ <span class="k">end</span>
742
+
743
+ <span class="n">task</span> <span class="ss">:unlock_compare</span> <span class="k">do</span>
744
+ <span class="n">set</span> <span class="ss">:lock_name</span><span class="p">,</span> <span class="ss">:compare</span>
745
+ <span class="n">unlock</span>
746
+ <span class="k">end</span>
747
+
748
+ <span class="n">task</span> <span class="ss">:unlock_migrate</span> <span class="k">do</span>
749
+ <span class="n">set</span> <span class="ss">:lock_name</span><span class="p">,</span> <span class="ss">:migrate</span>
750
+ <span class="n">unlock</span>
751
+ <span class="k">end</span>
752
+
753
+ <span class="n">task</span> <span class="ss">:unlock</span> <span class="k">do</span>
754
+ <span class="k">if</span> <span class="n">want_unlock</span>
755
+ <span class="n">run</span> <span class="s2">&quot;rm -f </span><span class="si">#{</span><span class="n">lock_path</span><span class="si">}</span><span class="s2">&quot;</span>
756
+ <span class="k">end</span>
757
+ <span class="k">end</span>
758
+
759
+ <span class="k">end</span> <span class="c1"># :deploy</span>
760
+
761
+ <span class="n">namespace</span> <span class="ss">:ruby</span> <span class="k">do</span>
762
+ <span class="n">task</span> <span class="ss">:bundle</span> <span class="k">do</span>
763
+ <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">deploy_release</span><span class="si">}</span><span class="s2"> &amp;&amp; bin/bundle-ruby </span><span class="si">#{</span><span class="n">ruby_loader</span><span class="si">}</span><span class="s2"> -- </span><span class="si">#{</span><span class="n">bundler_options</span><span class="si">}</span><span class="s2">&quot;</span>
764
+ <span class="k">end</span>
765
+ <span class="k">end</span>
766
+
767
+ <span class="n">after</span> <span class="s2">&quot;deploy:bundle&quot;</span><span class="p">,</span> <span class="s2">&quot;ruby:bundle&quot;</span>
768
+
769
+ <span class="n">namespace</span> <span class="ss">:node</span> <span class="k">do</span>
770
+ <span class="n">task</span> <span class="ss">:bundle</span> <span class="k">do</span>
771
+ <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">deploy_release</span><span class="si">}</span><span class="s2"> &amp;&amp; bin/bundle-node&quot;</span>
772
+ <span class="k">end</span>
773
+ <span class="k">end</span>
774
+
775
+ <span class="n">after</span> <span class="s2">&quot;deploy:bundle&quot;</span><span class="p">,</span> <span class="s2">&quot;node:bundle&quot;</span>
776
+
777
+ <span class="n">on</span> <span class="ss">:exit</span> <span class="k">do</span>
778
+ <span class="k">unless</span> <span class="n">local_only</span>
779
+ <span class="n">put</span> <span class="n">full_log</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">log_path</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">-</span><span class="si">#{</span><span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;AO_USER&quot;</span><span class="o">]</span><span class="si">}</span><span class="s2">.log-</span><span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y%m%d-%H%M&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
780
+ <span class="k">end</span>
781
+ <span class="k">end</span>
782
+
783
+ <span class="k">end</span> <span class="c1"># Capistrano::Configuration</span></pre></div>
784
+ </td>
785
+ </tr>
786
+ </table>
787
+ </div>
788
+ </body>