recap 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +2 -1
  2. data/README.md +55 -10
  3. data/Rakefile +19 -5
  4. data/bin/recap +2 -2
  5. data/features/managing-processes.feature +1 -1
  6. data/features/setting-environment-variables.feature +26 -1
  7. data/features/steps/capistrano_steps.rb +10 -6
  8. data/features/support/project.rb +24 -5
  9. data/features/templates/project/Capfile.erb +1 -1
  10. data/lib/recap/recipes/rails.rb +6 -0
  11. data/lib/recap/recipes/ruby.rb +11 -0
  12. data/lib/recap/recipes/static.rb +3 -0
  13. data/lib/recap/recipes.rb +18 -0
  14. data/lib/recap/support/capistrano_extensions.rb +85 -0
  15. data/lib/recap/support/cli.rb +57 -0
  16. data/lib/recap/{compatibility.rb → support/compatibility.rb} +2 -2
  17. data/lib/recap/support/environment.rb +61 -0
  18. data/lib/recap/support/namespace.rb +47 -0
  19. data/lib/recap/support/shell_command.rb +35 -0
  20. data/lib/recap/support/templates/Capfile.erb +6 -0
  21. data/lib/recap/tasks/bootstrap.rb +77 -0
  22. data/lib/recap/{bundler.rb → tasks/bundler.rb} +15 -6
  23. data/lib/recap/{deploy.rb → tasks/deploy.rb} +30 -17
  24. data/lib/recap/tasks/env.rb +111 -0
  25. data/lib/recap/{foreman.rb → tasks/foreman.rb} +20 -12
  26. data/lib/recap/{preflight.rb → tasks/preflight.rb} +13 -11
  27. data/lib/recap/tasks/rails.rb +42 -0
  28. data/lib/recap/tasks.rb +16 -0
  29. data/lib/recap/version.rb +1 -1
  30. data/lib/recap.rb +119 -10
  31. data/recap.gemspec +3 -2
  32. data/spec/models/capistrano_extensions_spec.rb +41 -0
  33. data/spec/models/cli_spec.rb +25 -0
  34. data/spec/models/environment_spec.rb +14 -14
  35. data/spec/models/shell_command_spec.rb +55 -0
  36. data/spec/spec_helper.rb +1 -1
  37. data/spec/tasks/bootstrap_spec.rb +9 -13
  38. data/spec/tasks/bundler_spec.rb +39 -7
  39. data/spec/tasks/deploy_spec.rb +42 -26
  40. data/spec/tasks/env_spec.rb +81 -5
  41. data/spec/tasks/foreman_spec.rb +10 -5
  42. data/spec/tasks/rails_spec.rb +80 -0
  43. metadata +65 -57
  44. data/doc/index.html +0 -235
  45. data/doc/lib/recap/bootstrap.html +0 -42
  46. data/doc/lib/recap/bundler.html +0 -168
  47. data/doc/lib/recap/capistrano_extensions.html +0 -208
  48. data/doc/lib/recap/cli.html +0 -42
  49. data/doc/lib/recap/compatibility.html +0 -73
  50. data/doc/lib/recap/deploy.html +0 -328
  51. data/doc/lib/recap/env.html +0 -108
  52. data/doc/lib/recap/foreman.html +0 -42
  53. data/doc/lib/recap/namespace.html +0 -42
  54. data/doc/lib/recap/preflight.html +0 -163
  55. data/doc/lib/recap/rails.html +0 -42
  56. data/doc/lib/recap/version.html +0 -42
  57. data/doc/lib/recap.html +0 -42
  58. data/index.rb +0 -62
  59. data/lib/recap/bootstrap.rb +0 -47
  60. data/lib/recap/capistrano_extensions.rb +0 -74
  61. data/lib/recap/cli.rb +0 -32
  62. data/lib/recap/deploy/templates/Capfile.erb +0 -6
  63. data/lib/recap/env.rb +0 -58
  64. data/lib/recap/environment.rb +0 -54
  65. data/lib/recap/namespace.rb +0 -37
  66. data/lib/recap/rails.rb +0 -24
  67. data/lib/recap/ruby.rb +0 -3
  68. data/lib/recap/static.rb +0 -1
data/doc/index.html DELETED
@@ -1,235 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
- <title>index.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
- <div id="jump_to">
12
- Jump To &hellip;
13
- <div id="jump_wrapper">
14
- <div id="jump_page">
15
- <a class="source" href="index.html">index.rb</a>
16
- <a class="source" href="lib/recap.html">recap.rb</a>
17
- <a class="source" href="lib/recap/bootstrap.html">bootstrap.rb</a>
18
- <a class="source" href="lib/recap/bundler.html">bundler.rb</a>
19
- <a class="source" href="lib/recap/capistrano_extensions.html">capistrano_extensions.rb</a>
20
- <a class="source" href="lib/recap/cli.html">cli.rb</a>
21
- <a class="source" href="lib/recap/compatibility.html">compatibility.rb</a>
22
- <a class="source" href="lib/recap/deploy.html">deploy.rb</a>
23
- <a class="source" href="lib/recap/env.html">env.rb</a>
24
- <a class="source" href="lib/recap/foreman.html">foreman.rb</a>
25
- <a class="source" href="lib/recap/namespace.html">namespace.rb</a>
26
- <a class="source" href="lib/recap/preflight.html">preflight.rb</a>
27
- <a class="source" href="lib/recap/rails.html">rails.rb</a>
28
- <a class="source" href="lib/recap/version.html">version.rb</a>
29
- </div>
30
- </div>
31
- </div>
32
- <table cellspacing=0 cellpadding=0>
33
- <thead>
34
- <tr>
35
- <th class=docs><h1>index.rb</h1></th>
36
- <th class=code></th>
37
- </tr>
38
- </thead>
39
- <tbody>
40
- <tr id='section-1'>
41
- <td class=docs>
42
- <div class="pilwrap">
43
- <a class="pilcrow" href="#section-1">&#182;</a>
44
- </div>
45
- <p>This is the annotated source code and documentation for
46
- <a href="http://github.com/freerange/recap">recap</a>, a simple, opinionated set of capistrano
47
- deployment recipes. Inspired by
48
- <a href="https://github.com/blog/470-deployment-script-spring-cleaning">this blog post</a>, these recipes use
49
- git&rsquo;s strengths to deploy applications in a faster, simpler manner than a standard capistrano
50
- deployment. Using git to manage release versions means apps can be deployed to a single directory.
51
- There&rsquo;s no need for <code>releases</code>, <code>shared</code> or <code>current</code> folders, and no symlinking.</p>
52
- </td>
53
- <td class=code>
54
- <div class='highlight'><pre></pre></div>
55
- </td>
56
- </tr>
57
- <tr id='section-Goals'>
58
- <td class=docs>
59
- <div class="pilwrap">
60
- <a class="pilcrow" href="#section-Goals">&#182;</a>
61
- </div>
62
- <h3>Goals</h3>
63
- </td>
64
- <td class=code>
65
- <div class='highlight'><pre></pre></div>
66
- </td>
67
- </tr>
68
- <tr id='section-3'>
69
- <td class=docs>
70
- <div class="pilwrap">
71
- <a class="pilcrow" href="#section-3">&#182;</a>
72
- </div>
73
- <p>These deployment recipes try to do the following:</p>
74
- </td>
75
- <td class=code>
76
- <div class='highlight'><pre></pre></div>
77
- </td>
78
- </tr>
79
- <tr id='section-4'>
80
- <td class=docs>
81
- <div class="pilwrap">
82
- <a class="pilcrow" href="#section-4">&#182;</a>
83
- </div>
84
- <p>Run all commands as the <code>application_user</code>, loading the full user environment. The only
85
- exceptions are <code>git</code> commands (which often rely on SSH agent forwarding for authentication), and
86
- anything that requires <code>sudo</code>.</p>
87
- </td>
88
- <td class=code>
89
- <div class='highlight'><pre></pre></div>
90
- </td>
91
- </tr>
92
- <tr id='section-5'>
93
- <td class=docs>
94
- <div class="pilwrap">
95
- <a class="pilcrow" href="#section-5">&#182;</a>
96
- </div>
97
- <p>Use <code>git</code> to avoid unecessary work. If the <code>Gemfile.lock</code> hasn&rsquo;t changed, there&rsquo;s no need to run
98
- <code>bundle install</code>. Similarly if there are no new migrations, why do <code>rake db:migrate</code>? Faster
99
- deploys mean more frequent deploys.</p>
100
- </td>
101
- <td class=code>
102
- <div class='highlight'><pre></pre></div>
103
- </td>
104
- </tr>
105
- <tr id='section-6'>
106
- <td class=docs>
107
- <div class="pilwrap">
108
- <a class="pilcrow" href="#section-6">&#182;</a>
109
- </div>
110
- <p>Avoid the use of <code>sudo</code> (other than to change to the <code>application_user</code>). As much as possible,
111
- <code>sudo</code> is only used to <code>su</code> to the <code>application_user</code> before running a command. To avoid having to
112
- type a password to perform the majority of deployment tasks, these lines can be added to
113
- <code>/etc/sudoers.d/application</code> (change <code>application</code> to the name of your app).</p>
114
- </td>
115
- <td class=code>
116
- <div class='highlight'><pre><span class="o">%</span><span class="n">application</span> <span class="no">ALL</span><span class="o">=</span><span class="no">NOPASSWD</span><span class="p">:</span><span class="sr"> /sbin/s</span><span class="n">tart</span> <span class="n">application</span><span class="o">*</span>
117
- <span class="o">%</span><span class="n">application</span> <span class="no">ALL</span><span class="o">=</span><span class="no">NOPASSWD</span><span class="p">:</span><span class="sr"> /sbin/s</span><span class="n">top</span> <span class="n">application</span><span class="o">*</span>
118
- <span class="o">%</span><span class="n">application</span> <span class="no">ALL</span><span class="o">=</span><span class="no">NOPASSWD</span><span class="p">:</span><span class="sr"> /sbin/</span><span class="n">restart</span> <span class="n">application</span><span class="o">*</span>
119
- <span class="o">%</span><span class="n">application</span> <span class="no">ALL</span><span class="o">=</span><span class="no">NOPASSWD</span><span class="p">:</span><span class="sr"> /bin/su</span> <span class="o">-</span> <span class="n">application</span><span class="o">*</span>
120
- <span class="o">%</span><span class="n">application</span> <span class="no">ALL</span><span class="o">=</span><span class="no">NOPASSWD</span><span class="p">:</span><span class="sr"> /bin/su</span> <span class="n">application</span><span class="o">*</span></pre></div>
121
- </td>
122
- </tr>
123
- <tr id='section-7'>
124
- <td class=docs>
125
- <div class="pilwrap">
126
- <a class="pilcrow" href="#section-7">&#182;</a>
127
- </div>
128
- <p>Use environment variables for configuration. Rather than setting <code>rails_env</code> in the <code>Capfile</code>,
129
- <code>RAILS_ENV</code> (or <code>RACK_ENV</code>) variables should be set for the <code>application_user</code>. The <code>env:set</code> and
130
- <code>env:edit</code> tasks help do this.</p>
131
- </td>
132
- <td class=code>
133
- <div class='highlight'><pre></pre></div>
134
- </td>
135
- </tr>
136
- <tr id='section-Code_layout'>
137
- <td class=docs>
138
- <div class="pilwrap">
139
- <a class="pilcrow" href="#section-Code_layout">&#182;</a>
140
- </div>
141
- <h3>Code layout</h3>
142
- </td>
143
- <td class=code>
144
- <div class='highlight'><pre></pre></div>
145
- </td>
146
- </tr>
147
- <tr id='section-9'>
148
- <td class=docs>
149
- <div class="pilwrap">
150
- <a class="pilcrow" href="#section-9">&#182;</a>
151
- </div>
152
- <p>The main deployment tasks are defined in <a href="lib/recap/deploy.html">recap/deploy.rb</a>. Automatic
153
- checks to ensure servers are correctly setup are in
154
- <a href="lib/recap/preflight.html">recap/preflight.rb</a>, while tasks for environment variables are in
155
- <a href="lib/recap/env.html">recap/env.rb</a></p>
156
- </td>
157
- <td class=code>
158
- <div class='highlight'><pre></pre></div>
159
- </td>
160
- </tr>
161
- <tr id='section-10'>
162
- <td class=docs>
163
- <div class="pilwrap">
164
- <a class="pilcrow" href="#section-10">&#182;</a>
165
- </div>
166
- <p>In addition, there are extensions for <a href="lib/recap/bundler.html">bundler</a>,
167
- <a href="lib/recap/foreman.html">foreman</a> and <a href="lib/recap/rails.html">rails</a></p>
168
- </td>
169
- <td class=code>
170
- <div class='highlight'><pre></pre></div>
171
- </td>
172
- </tr>
173
- <tr id='section-11'>
174
- <td class=docs>
175
- <div class="pilwrap">
176
- <a class="pilcrow" href="#section-11">&#182;</a>
177
- </div>
178
- <p>For limited compatability with other existing recipes, see
179
- <a href="lib/recap/compatibility.html">compatibility</a>.</p>
180
- </td>
181
- <td class=code>
182
- <div class='highlight'><pre></pre></div>
183
- </td>
184
- </tr>
185
- <tr id='section-Deployment_target'>
186
- <td class=docs>
187
- <div class="pilwrap">
188
- <a class="pilcrow" href="#section-Deployment_target">&#182;</a>
189
- </div>
190
- <h3>Deployment target</h3>
191
- </td>
192
- <td class=code>
193
- <div class='highlight'><pre></pre></div>
194
- </td>
195
- </tr>
196
- <tr id='section-13'>
197
- <td class=docs>
198
- <div class="pilwrap">
199
- <a class="pilcrow" href="#section-13">&#182;</a>
200
- </div>
201
- <p>These recipes have been developed and tested using Ubuntu 11.04, though they may work well with
202
- other flavours of unix.</p>
203
- </td>
204
- <td class=code>
205
- <div class='highlight'><pre></pre></div>
206
- </td>
207
- </tr>
208
- <tr id='section-14'>
209
- <td class=docs>
210
- <div class="pilwrap">
211
- <a class="pilcrow" href="#section-14">&#182;</a>
212
- </div>
213
- <p>The application should be run as the application user; if using Apache and Passenger, you should
214
- set the <code>PassengerDefaultUser</code> directive to be the same as the <code>application_user</code>.</p>
215
- </td>
216
- <td class=code>
217
- <div class='highlight'><pre></pre></div>
218
- </td>
219
- </tr>
220
- <tr id='section-15'>
221
- <td class=docs>
222
- <div class="pilwrap">
223
- <a class="pilcrow" href="#section-15">&#182;</a>
224
- </div>
225
- <p>The code is available <a href="http://github.com/freerange/recap">on github</a> and released under the
226
- <a href="https://github.com/freerange/recap/blob/master/LICENSE">MIT License</a></p>
227
-
228
- </td>
229
- <td class=code>
230
- <div class='highlight'><pre></pre></div>
231
- </td>
232
- </tr>
233
- </table>
234
- </div>
235
- </body>
@@ -1,42 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
- <title>bootstrap.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
- <div id="jump_to">
12
- Jump To &hellip;
13
- <div id="jump_wrapper">
14
- <div id="jump_page">
15
- <a class="source" href="../../index.html">index.rb</a>
16
- <a class="source" href="../recap.html">recap.rb</a>
17
- <a class="source" href="bootstrap.html">bootstrap.rb</a>
18
- <a class="source" href="bundler.html">bundler.rb</a>
19
- <a class="source" href="capistrano_extensions.html">capistrano_extensions.rb</a>
20
- <a class="source" href="cli.html">cli.rb</a>
21
- <a class="source" href="compatibility.html">compatibility.rb</a>
22
- <a class="source" href="deploy.html">deploy.rb</a>
23
- <a class="source" href="env.html">env.rb</a>
24
- <a class="source" href="foreman.html">foreman.rb</a>
25
- <a class="source" href="namespace.html">namespace.rb</a>
26
- <a class="source" href="preflight.html">preflight.rb</a>
27
- <a class="source" href="rails.html">rails.rb</a>
28
- <a class="source" href="version.html">version.rb</a>
29
- </div>
30
- </div>
31
- </div>
32
- <table cellspacing=0 cellpadding=0>
33
- <thead>
34
- <tr>
35
- <th class=docs><h1>bootstrap.rb</h1></th>
36
- <th class=code></th>
37
- </tr>
38
- </thead>
39
- <tbody>
40
- </table>
41
- </div>
42
- </body>
@@ -1,168 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
- <title>bundler.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
- <div id="jump_to">
12
- Jump To &hellip;
13
- <div id="jump_wrapper">
14
- <div id="jump_page">
15
- <a class="source" href="../../index.html">index.rb</a>
16
- <a class="source" href="../recap.html">recap.rb</a>
17
- <a class="source" href="bootstrap.html">bootstrap.rb</a>
18
- <a class="source" href="bundler.html">bundler.rb</a>
19
- <a class="source" href="capistrano_extensions.html">capistrano_extensions.rb</a>
20
- <a class="source" href="cli.html">cli.rb</a>
21
- <a class="source" href="compatibility.html">compatibility.rb</a>
22
- <a class="source" href="deploy.html">deploy.rb</a>
23
- <a class="source" href="env.html">env.rb</a>
24
- <a class="source" href="foreman.html">foreman.rb</a>
25
- <a class="source" href="namespace.html">namespace.rb</a>
26
- <a class="source" href="preflight.html">preflight.rb</a>
27
- <a class="source" href="rails.html">rails.rb</a>
28
- <a class="source" href="version.html">version.rb</a>
29
- </div>
30
- </div>
31
- </div>
32
- <table cellspacing=0 cellpadding=0>
33
- <thead>
34
- <tr>
35
- <th class=docs><h1>bundler.rb</h1></th>
36
- <th class=code></th>
37
- </tr>
38
- </thead>
39
- <tbody>
40
- <tr id='section-1'>
41
- <td class=docs>
42
- <div class="pilwrap">
43
- <a class="pilcrow" href="#section-1">&#182;</a>
44
- </div>
45
- <p>The bundler recipe ensures that the application bundle is installed whenever the code is updated.</p>
46
- </td>
47
- <td class=code>
48
- <div class='highlight'><pre><span class="k">module</span> <span class="nn">Recap::Bundler</span>
49
- <span class="kp">extend</span> <span class="no">Recap</span><span class="o">::</span><span class="no">Namespace</span>
50
-
51
- <span class="n">namespace</span> <span class="ss">:bundle</span> <span class="k">do</span></pre></div>
52
- </td>
53
- </tr>
54
- <tr id='section-2'>
55
- <td class=docs>
56
- <div class="pilwrap">
57
- <a class="pilcrow" href="#section-2">&#182;</a>
58
- </div>
59
- <p>Each bundle is declared in a <code>Gemfile</code>, by default in the root of the application directory</p>
60
- </td>
61
- <td class=code>
62
- <div class='highlight'><pre> <span class="n">set</span><span class="p">(</span><span class="ss">:bundle_gemfile</span><span class="p">)</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">/Gemfile&quot;</span> <span class="p">}</span></pre></div>
63
- </td>
64
- </tr>
65
- <tr id='section-3'>
66
- <td class=docs>
67
- <div class="pilwrap">
68
- <a class="pilcrow" href="#section-3">&#182;</a>
69
- </div>
70
- <p>As well as a <code>Gemfile</code>, application repositories should also contain a <code>Gemfile.lock</code>.</p>
71
- </td>
72
- <td class=code>
73
- <div class='highlight'><pre> <span class="n">set</span><span class="p">(</span><span class="ss">:bundle_gemfile_lock</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">bundle_gemfile</span><span class="si">}</span><span class="s2">.lock&quot;</span> <span class="p">}</span></pre></div>
74
- </td>
75
- </tr>
76
- <tr id='section-4'>
77
- <td class=docs>
78
- <div class="pilwrap">
79
- <a class="pilcrow" href="#section-4">&#182;</a>
80
- </div>
81
- <p>An application&rsquo;s gems are installed within the application directory. By default they are
82
- placed under <code>vendor/gems</code>.</p>
83
- </td>
84
- <td class=code>
85
- <div class='highlight'><pre> <span class="n">set</span><span class="p">(</span><span class="ss">:bundle_path</span><span class="p">)</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">/vendor/gems&quot;</span> <span class="p">}</span></pre></div>
86
- </td>
87
- </tr>
88
- <tr id='section-5'>
89
- <td class=docs>
90
- <div class="pilwrap">
91
- <a class="pilcrow" href="#section-5">&#182;</a>
92
- </div>
93
- <p>Not all gems are needed for production environments, so by default the <code>development</code>, <code>test</code> and
94
- <code>assets</code> groups are skipped.</p>
95
- </td>
96
- <td class=code>
97
- <div class='highlight'><pre> <span class="n">set</span><span class="p">(</span><span class="ss">:bundle_without</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;development test assets&quot;</span> <span class="p">}</span></pre></div>
98
- </td>
99
- </tr>
100
- <tr id='section-6'>
101
- <td class=docs>
102
- <div class="pilwrap">
103
- <a class="pilcrow" href="#section-6">&#182;</a>
104
- </div>
105
- <p>The main bundle install command uses all the settings above, together with the <code>&mdash;deployment</code>,
106
- <code>&mdash;binstubs</code> and <code>&mdash;quiet</code> flags</p>
107
- </td>
108
- <td class=code>
109
- <div class='highlight'><pre> <span class="n">set</span><span class="p">(</span><span class="ss">:bundle_install_command</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;bundle install --gemfile </span><span class="si">#{</span><span class="n">bundle_gemfile</span><span class="si">}</span><span class="s2"> --path </span><span class="si">#{</span><span class="n">bundle_path</span><span class="si">}</span><span class="s2"> --deployment --quiet --binstubs --without </span><span class="si">#{</span><span class="n">bundle_without</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
110
-
111
- <span class="n">namespace</span> <span class="ss">:install</span> <span class="k">do</span></pre></div>
112
- </td>
113
- </tr>
114
- <tr id='section-7'>
115
- <td class=docs>
116
- <div class="pilwrap">
117
- <a class="pilcrow" href="#section-7">&#182;</a>
118
- </div>
119
- <p>After cloning or updating the code, we only install the bundle if the <code>Gemfile</code> has changed.</p>
120
- </td>
121
- <td class=code>
122
- <div class='highlight'><pre> <span class="n">desc</span> <span class="s2">&quot;Install the latest gem bundle only if Gemfile.lock has changed&quot;</span>
123
- <span class="n">task</span> <span class="ss">:if_changed</span> <span class="k">do</span>
124
- <span class="k">if</span> <span class="n">deployed_file_changed?</span><span class="p">(</span><span class="n">bundle_gemfile_lock</span><span class="p">)</span>
125
- <span class="n">top</span><span class="o">.</span><span class="n">bundle</span><span class="o">.</span><span class="n">install</span><span class="o">.</span><span class="n">default</span>
126
- <span class="k">end</span>
127
- <span class="k">end</span></pre></div>
128
- </td>
129
- </tr>
130
- <tr id='section-8'>
131
- <td class=docs>
132
- <div class="pilwrap">
133
- <a class="pilcrow" href="#section-8">&#182;</a>
134
- </div>
135
- <p>Occassionally it&rsquo;s useful to force an install (such as if something has gone wrong in
136
- a previous deployment)</p>
137
- </td>
138
- <td class=code>
139
- <div class='highlight'><pre> <span class="n">desc</span> <span class="s2">&quot;Install the latest gem bundle&quot;</span>
140
- <span class="n">task</span> <span class="ss">:default</span> <span class="k">do</span>
141
- <span class="k">if</span> <span class="n">deployed_file_exists?</span><span class="p">(</span><span class="n">bundle_gemfile_lock</span><span class="p">)</span>
142
- <span class="n">as_app</span> <span class="n">bundle_install_command</span>
143
- <span class="k">else</span>
144
- <span class="nb">puts</span> <span class="s2">&quot;Skipping bundle:install as no Gemfile found&quot;</span>
145
- <span class="k">end</span>
146
- <span class="k">end</span>
147
- <span class="k">end</span></pre></div>
148
- </td>
149
- </tr>
150
- <tr id='section-9'>
151
- <td class=docs>
152
- <div class="pilwrap">
153
- <a class="pilcrow" href="#section-9">&#182;</a>
154
- </div>
155
- <p>To install the bundle automatically each time the code is updated or cloned, hooks are added to
156
- the <code>deploy:clone_code</code> and <code>deploy:update_code</code> tasks.</p>
157
-
158
- </td>
159
- <td class=code>
160
- <div class='highlight'><pre> <span class="n">after</span> <span class="s1">&#39;deploy:clone_code&#39;</span><span class="p">,</span> <span class="s1">&#39;bundle:install:if_changed&#39;</span>
161
- <span class="n">after</span> <span class="s1">&#39;deploy:update_code&#39;</span><span class="p">,</span> <span class="s1">&#39;bundle:install:if_changed&#39;</span>
162
- <span class="k">end</span>
163
- <span class="k">end</span></pre></div>
164
- </td>
165
- </tr>
166
- </table>
167
- </div>
168
- </body>