recap 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/.travis.yml +4 -0
- data/README.md +12 -3
- data/Rakefile +8 -0
- data/Vagrantfile +61 -0
- data/doc/index.html +45 -26
- data/doc/lib/recap/bootstrap.html +42 -0
- data/doc/lib/recap/bundler.html +36 -19
- data/doc/lib/recap/capistrano_extensions.html +28 -23
- data/doc/lib/recap/cli.html +3 -0
- data/doc/lib/recap/compatibility.html +6 -3
- data/doc/lib/recap/deploy.html +41 -86
- data/doc/lib/recap/env.html +6 -1
- data/doc/lib/recap/foreman.html +3 -0
- data/doc/lib/recap/namespace.html +42 -0
- data/doc/lib/recap/preflight.html +12 -7
- data/doc/lib/recap/rails.html +3 -0
- data/doc/lib/recap/version.html +3 -0
- data/doc/lib/recap.html +42 -0
- data/features/bundling-gems.feature +18 -0
- data/features/deploying-projects.feature +21 -0
- data/features/managing-processes.feature +17 -0
- data/features/setting-environment-variables.feature +21 -0
- data/features/steps/capistrano_steps.rb +98 -0
- data/features/support/project.rb +211 -0
- data/features/support/server.rb +53 -0
- data/features/templates/gem/binary.erb +43 -0
- data/features/templates/gem/gemspec.erb +11 -0
- data/features/templates/project/Capfile +21 -0
- data/features/templates/project/Capfile.erb +21 -0
- data/features/templates/project/Gemfile.erb +7 -0
- data/features/templates/project/Procfile.erb +1 -0
- data/index.rb +26 -17
- data/lib/recap/bootstrap.rb +47 -0
- data/lib/recap/bundler.rb +31 -21
- data/lib/recap/capistrano_extensions.rb +11 -9
- data/lib/recap/cli.rb +1 -1
- data/lib/recap/compatibility.rb +3 -3
- data/lib/recap/deploy.rb +45 -57
- data/lib/recap/env.rb +30 -26
- data/lib/recap/environment.rb +54 -0
- data/lib/recap/foreman.rb +28 -9
- data/lib/recap/namespace.rb +37 -0
- data/lib/recap/preflight.rb +10 -8
- data/lib/recap/rails.rb +6 -4
- data/lib/recap/ruby.rb +3 -0
- data/lib/recap/static.rb +1 -0
- data/lib/recap/version.rb +1 -1
- data/lib/recap.rb +12 -0
- data/recap.gemspec +8 -4
- data/spec/models/environment_spec.rb +143 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/tasks/bootstrap_spec.rb +34 -0
- data/spec/tasks/bundler_spec.rb +126 -0
- data/spec/tasks/deploy_spec.rb +209 -0
- data/spec/tasks/env_spec.rb +38 -0
- data/spec/tasks/foreman_spec.rb +154 -0
- data/test-vm/manifests/base.pp +17 -0
- data/test-vm/share/.gitkeep +0 -0
- metadata +138 -19
- /data/bin/{tomafro-deploy → recap} +0 -0
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
-
[recap](http://github.com/freerange/recap) is
|
1
|
+
[recap](http://github.com/freerange/recap) is an opinionated set of capistrano deployment recipes, designed to use git's strengths to deploy applications and websites in a fast and simple manner.
|
2
2
|
|
3
|
-
|
3
|
+
Recap's core features are:
|
4
4
|
|
5
|
-
|
5
|
+
* Release versions are managed with git. There's no need for `releases` or `current` folders, and no symlinking.
|
6
|
+
* Intelligently decides whether tasks need to execute. e.g. The `bundle:install` task will only run if a `Gemfile.lock` exists, and if it has changed since the last deployment.
|
7
|
+
* A dedicated user account and group owns all an application's associated files and processes.
|
8
|
+
* Deployments are run using personal logins. The right to deploy is granted by adding a user to the application group.
|
9
|
+
* Environment variables are used for application specific configuration. These can easily be read and set using the `env` and `env:set` tasks.
|
10
|
+
* Out of the box support for `bundler` and `foreman`
|
11
|
+
|
12
|
+
For more information, the main documentation can be found at [http://code.gofreerange.com/recap](http://code.gofreerange.com/recap), while the code is available [on github](https://github.com/freerange/recap).
|
13
|
+
|
14
|
+
Recap was written by [Tom Ward](http://tomafro.net) and the other members of [Go Free Range](http://gofreerange.com), and is released under the [MIT License](https://github.com/freerange/recap/blob/master/LICENSE).
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
require 'rocco/tasks'
|
3
|
+
require 'rspec/core/rake_task'
|
3
4
|
|
4
5
|
desc 'build docs'
|
5
6
|
Rocco::Task.new :rocco, 'doc/', ['index.rb', 'lib/**/*.rb']
|
@@ -10,3 +11,10 @@ task :publish do
|
|
10
11
|
commit = `echo "Publishing docs from master branch" | git commit-tree #{sha} -p refs/heads/gh-pages`.strip
|
11
12
|
`git update-ref refs/heads/gh-pages #{commit}`
|
12
13
|
end
|
14
|
+
|
15
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
16
|
+
t.pattern = "spec/**/*_spec.rb"
|
17
|
+
t.rspec_opts = "-fn --color"
|
18
|
+
end
|
19
|
+
|
20
|
+
task :default => :spec
|
data/Vagrantfile
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant::Config.run do |config|
|
5
|
+
# All Vagrant configuration is done here. The most common configuration
|
6
|
+
# options are documented and commented below. For a complete reference,
|
7
|
+
# please see the online documentation at vagrantup.com.
|
8
|
+
|
9
|
+
# Every Vagrant virtual environment requires a box to build off of.
|
10
|
+
config.vm.box = "lucid64"
|
11
|
+
|
12
|
+
# The url from where the 'config.vm.box' box will be fetched if it
|
13
|
+
# doesn't already exist on the user's system.
|
14
|
+
config.vm.box_url = "http://files.vagrantup.com/lucid64.box"
|
15
|
+
|
16
|
+
# Boot with a GUI so you can see the screen. (Default is headless)
|
17
|
+
# config.vm.boot_mode = :gui
|
18
|
+
|
19
|
+
# Assign this VM to a host-only network IP, allowing you to access it
|
20
|
+
# via the IP. Host-only networks can talk to the host machine as well as
|
21
|
+
# any other machines on the same network, but cannot be accessed (through this
|
22
|
+
# network interface) by any external networks.
|
23
|
+
# config.vm.network :hostonly, "33.33.33.10"
|
24
|
+
|
25
|
+
# Assign this VM to a bridged network, allowing you to connect directly to a
|
26
|
+
# network using the host's network device. This makes the VM appear as another
|
27
|
+
# physical device on your network.
|
28
|
+
# config.vm.network :bridged
|
29
|
+
|
30
|
+
# Forward a port from the guest to the host, which allows for outside
|
31
|
+
# computers to access the VM, whereas host only networking does not.
|
32
|
+
# config.vm.forward_port 80, 8080
|
33
|
+
|
34
|
+
# Share an additional folder to the guest VM. The first argument is
|
35
|
+
# an identifier, the second is the path on the guest to mount the
|
36
|
+
# folder, and the third is the path on the host to the actual folder.
|
37
|
+
config.vm.share_folder 'test', '/recap/share', 'test-vm/share'
|
38
|
+
|
39
|
+
# Enable provisioning with Puppet stand alone. Puppet manifests
|
40
|
+
# are contained in a directory path relative to this Vagrantfile.
|
41
|
+
# You will need to create the manifests directory and a manifest in
|
42
|
+
# the file base.pp in the manifests_path directory.
|
43
|
+
#
|
44
|
+
# An example Puppet manifest to provision the message of the day:
|
45
|
+
#
|
46
|
+
# # group { "puppet":
|
47
|
+
# # ensure => "present",
|
48
|
+
# # }
|
49
|
+
# #
|
50
|
+
# # File { owner => 0, group => 0, mode => 0644 }
|
51
|
+
# #
|
52
|
+
# # file { '/etc/motd':
|
53
|
+
# # content => "Welcome to your Vagrant-built virtual machine!
|
54
|
+
# # Managed by Puppet.\n"
|
55
|
+
# # }
|
56
|
+
#
|
57
|
+
config.vm.provision :puppet do |puppet|
|
58
|
+
puppet.manifests_path = "test-vm/manifests"
|
59
|
+
puppet.manifest_file = "base.pp"
|
60
|
+
end
|
61
|
+
end
|
data/doc/index.html
CHANGED
@@ -13,6 +13,8 @@
|
|
13
13
|
<div id="jump_wrapper">
|
14
14
|
<div id="jump_page">
|
15
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>
|
16
18
|
<a class="source" href="lib/recap/bundler.html">bundler.rb</a>
|
17
19
|
<a class="source" href="lib/recap/capistrano_extensions.html">capistrano_extensions.rb</a>
|
18
20
|
<a class="source" href="lib/recap/cli.html">cli.rb</a>
|
@@ -20,6 +22,7 @@
|
|
20
22
|
<a class="source" href="lib/recap/deploy.html">deploy.rb</a>
|
21
23
|
<a class="source" href="lib/recap/env.html">env.rb</a>
|
22
24
|
<a class="source" href="lib/recap/foreman.html">foreman.rb</a>
|
25
|
+
<a class="source" href="lib/recap/namespace.html">namespace.rb</a>
|
23
26
|
<a class="source" href="lib/recap/preflight.html">preflight.rb</a>
|
24
27
|
<a class="source" href="lib/recap/rails.html">rails.rb</a>
|
25
28
|
<a class="source" href="lib/recap/version.html">version.rb</a>
|
@@ -79,8 +82,8 @@ There’s no need for <code>releases</code>, <code>shared</code> or <code>cu
|
|
79
82
|
<a class="pilcrow" href="#section-4">¶</a>
|
80
83
|
</div>
|
81
84
|
<p>Run all commands as the <code>application_user</code>, loading the full user environment. The only
|
82
|
-
exceptions are <code>git</code> commands (which often rely on SSH agent forwarding for authentication), and
|
83
|
-
that requires <code>sudo</code>.</p>
|
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>
|
84
87
|
</td>
|
85
88
|
<td class=code>
|
86
89
|
<div class='highlight'><pre></pre></div>
|
@@ -92,8 +95,8 @@ that requires <code>sudo</code>.</p>
|
|
92
95
|
<a class="pilcrow" href="#section-5">¶</a>
|
93
96
|
</div>
|
94
97
|
<p>Use <code>git</code> to avoid unecessary work. If the <code>Gemfile.lock</code> hasn’t changed, there’s no need to run
|
95
|
-
<code>bundle install</code>. Similarly if there are no new migrations, why do <code>rake db:migrate</code
|
96
|
-
mean more frequent deploys
|
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>
|
97
100
|
</td>
|
98
101
|
<td class=code>
|
99
102
|
<div class='highlight'><pre></pre></div>
|
@@ -104,9 +107,9 @@ mean more frequent deploys, which in our experience leads to better applications
|
|
104
107
|
<div class="pilwrap">
|
105
108
|
<a class="pilcrow" href="#section-6">¶</a>
|
106
109
|
</div>
|
107
|
-
<p>Avoid the use of <code>sudo</code> (other than to change to the <code>application_user</code>). As much as possible,
|
108
|
-
is only used to <code>su</code> to the <code>application_user</code> before running a command. To avoid
|
109
|
-
to perform the majority of deployment tasks,
|
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
|
110
113
|
<code>/etc/sudoers.d/application</code> (change <code>application</code> to the name of your app).</p>
|
111
114
|
</td>
|
112
115
|
<td class=code>
|
@@ -117,25 +120,25 @@ to perform the majority of deployment tasks, this code can be added to
|
|
117
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>
|
118
121
|
</td>
|
119
122
|
</tr>
|
120
|
-
<tr id='section-
|
123
|
+
<tr id='section-7'>
|
121
124
|
<td class=docs>
|
122
125
|
<div class="pilwrap">
|
123
|
-
<a class="pilcrow" href="#section-
|
126
|
+
<a class="pilcrow" href="#section-7">¶</a>
|
124
127
|
</div>
|
125
|
-
<
|
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>
|
126
131
|
</td>
|
127
132
|
<td class=code>
|
128
133
|
<div class='highlight'><pre></pre></div>
|
129
134
|
</td>
|
130
135
|
</tr>
|
131
|
-
<tr id='section-
|
136
|
+
<tr id='section-Code_layout'>
|
132
137
|
<td class=docs>
|
133
138
|
<div class="pilwrap">
|
134
|
-
<a class="pilcrow" href="#section-
|
139
|
+
<a class="pilcrow" href="#section-Code_layout">¶</a>
|
135
140
|
</div>
|
136
|
-
<
|
137
|
-
checks to ensure servers are correctly setup are in
|
138
|
-
<a href="lib/recap/preflight.html">recap/preflight.rb</a>.</p>
|
141
|
+
<h3>Code layout</h3>
|
139
142
|
</td>
|
140
143
|
<td class=code>
|
141
144
|
<div class='highlight'><pre></pre></div>
|
@@ -146,8 +149,10 @@ checks to ensure servers are correctly setup are in
|
|
146
149
|
<div class="pilwrap">
|
147
150
|
<a class="pilcrow" href="#section-9">¶</a>
|
148
151
|
</div>
|
149
|
-
<p>
|
150
|
-
|
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>
|
151
156
|
</td>
|
152
157
|
<td class=code>
|
153
158
|
<div class='highlight'><pre></pre></div>
|
@@ -158,30 +163,31 @@ checks to ensure servers are correctly setup are in
|
|
158
163
|
<div class="pilwrap">
|
159
164
|
<a class="pilcrow" href="#section-10">¶</a>
|
160
165
|
</div>
|
161
|
-
<p>
|
162
|
-
<a href="lib/recap/
|
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>
|
163
168
|
</td>
|
164
169
|
<td class=code>
|
165
170
|
<div class='highlight'><pre></pre></div>
|
166
171
|
</td>
|
167
172
|
</tr>
|
168
|
-
<tr id='section-
|
173
|
+
<tr id='section-11'>
|
169
174
|
<td class=docs>
|
170
175
|
<div class="pilwrap">
|
171
|
-
<a class="pilcrow" href="#section-
|
176
|
+
<a class="pilcrow" href="#section-11">¶</a>
|
172
177
|
</div>
|
173
|
-
<
|
178
|
+
<p>For limited compatability with other existing recipes, see
|
179
|
+
<a href="lib/recap/compatibility.html">compatibility</a>.</p>
|
174
180
|
</td>
|
175
181
|
<td class=code>
|
176
182
|
<div class='highlight'><pre></pre></div>
|
177
183
|
</td>
|
178
184
|
</tr>
|
179
|
-
<tr id='section-
|
185
|
+
<tr id='section-Deployment_target'>
|
180
186
|
<td class=docs>
|
181
187
|
<div class="pilwrap">
|
182
|
-
<a class="pilcrow" href="#section-
|
188
|
+
<a class="pilcrow" href="#section-Deployment_target">¶</a>
|
183
189
|
</div>
|
184
|
-
<
|
190
|
+
<h3>Deployment target</h3>
|
185
191
|
</td>
|
186
192
|
<td class=code>
|
187
193
|
<div class='highlight'><pre></pre></div>
|
@@ -192,7 +198,8 @@ checks to ensure servers are correctly setup are in
|
|
192
198
|
<div class="pilwrap">
|
193
199
|
<a class="pilcrow" href="#section-13">¶</a>
|
194
200
|
</div>
|
195
|
-
<p>
|
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>
|
196
203
|
</td>
|
197
204
|
<td class=code>
|
198
205
|
<div class='highlight'><pre></pre></div>
|
@@ -203,6 +210,18 @@ checks to ensure servers are correctly setup are in
|
|
203
210
|
<div class="pilwrap">
|
204
211
|
<a class="pilcrow" href="#section-14">¶</a>
|
205
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">¶</a>
|
224
|
+
</div>
|
206
225
|
<p>The code is available <a href="http://github.com/freerange/recap">on github</a> and released under the
|
207
226
|
<a href="https://github.com/freerange/recap/blob/master/LICENSE">MIT License</a></p>
|
208
227
|
|
@@ -0,0 +1,42 @@
|
|
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 …
|
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>
|
data/doc/lib/recap/bundler.html
CHANGED
@@ -13,6 +13,8 @@
|
|
13
13
|
<div id="jump_wrapper">
|
14
14
|
<div id="jump_page">
|
15
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>
|
16
18
|
<a class="source" href="bundler.html">bundler.rb</a>
|
17
19
|
<a class="source" href="capistrano_extensions.html">capistrano_extensions.rb</a>
|
18
20
|
<a class="source" href="cli.html">cli.rb</a>
|
@@ -20,6 +22,7 @@
|
|
20
22
|
<a class="source" href="deploy.html">deploy.rb</a>
|
21
23
|
<a class="source" href="env.html">env.rb</a>
|
22
24
|
<a class="source" href="foreman.html">foreman.rb</a>
|
25
|
+
<a class="source" href="namespace.html">namespace.rb</a>
|
23
26
|
<a class="source" href="preflight.html">preflight.rb</a>
|
24
27
|
<a class="source" href="rails.html">rails.rb</a>
|
25
28
|
<a class="source" href="version.html">version.rb</a>
|
@@ -42,7 +45,10 @@
|
|
42
45
|
<p>The bundler recipe ensures that the application bundle is installed whenever the code is updated.</p>
|
43
46
|
</td>
|
44
47
|
<td class=code>
|
45
|
-
<div class='highlight'><pre><span class="
|
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>
|
46
52
|
</td>
|
47
53
|
</tr>
|
48
54
|
<tr id='section-2'>
|
@@ -53,7 +59,7 @@
|
|
53
59
|
<p>Each bundle is declared in a <code>Gemfile</code>, by default in the root of the application directory</p>
|
54
60
|
</td>
|
55
61
|
<td class=code>
|
56
|
-
<div class='highlight'><pre>
|
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">"</span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/Gemfile"</span> <span class="p">}</span></pre></div>
|
57
63
|
</td>
|
58
64
|
</tr>
|
59
65
|
<tr id='section-3'>
|
@@ -64,7 +70,7 @@
|
|
64
70
|
<p>As well as a <code>Gemfile</code>, application repositories should also contain a <code>Gemfile.lock</code>.</p>
|
65
71
|
</td>
|
66
72
|
<td class=code>
|
67
|
-
<div class='highlight'><pre>
|
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">"</span><span class="si">#{</span><span class="n">bundle_gemfile</span><span class="si">}</span><span class="s2">.lock"</span> <span class="p">}</span></pre></div>
|
68
74
|
</td>
|
69
75
|
</tr>
|
70
76
|
<tr id='section-4'>
|
@@ -73,10 +79,10 @@
|
|
73
79
|
<a class="pilcrow" href="#section-4">¶</a>
|
74
80
|
</div>
|
75
81
|
<p>An application’s gems are installed within the application directory. By default they are
|
76
|
-
|
82
|
+
placed under <code>vendor/gems</code>.</p>
|
77
83
|
</td>
|
78
84
|
<td class=code>
|
79
|
-
<div class='highlight'><pre>
|
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">"</span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/vendor/gems"</span> <span class="p">}</span></pre></div>
|
80
86
|
</td>
|
81
87
|
</tr>
|
82
88
|
<tr id='section-5'>
|
@@ -88,10 +94,7 @@ places under <code>.bundle/gems</code>.</p>
|
|
88
94
|
<code>assets</code> groups are skipped.</p>
|
89
95
|
</td>
|
90
96
|
<td class=code>
|
91
|
-
<div class='highlight'><pre>
|
92
|
-
|
93
|
-
<span class="n">namespace</span> <span class="ss">:bundle</span> <span class="k">do</span>
|
94
|
-
<span class="n">namespace</span> <span class="ss">:install</span> <span class="k">do</span></pre></div>
|
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">"development test assets"</span> <span class="p">}</span></pre></div>
|
95
98
|
</td>
|
96
99
|
</tr>
|
97
100
|
<tr id='section-6'>
|
@@ -99,6 +102,20 @@ places under <code>.bundle/gems</code>.</p>
|
|
99
102
|
<div class="pilwrap">
|
100
103
|
<a class="pilcrow" href="#section-6">¶</a>
|
101
104
|
</div>
|
105
|
+
<p>The main bundle install command uses all the settings above, together with the <code>—deployment</code>,
|
106
|
+
<code>—binstubs</code> and <code>—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">"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">"</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">¶</a>
|
118
|
+
</div>
|
102
119
|
<p>After cloning or updating the code, we only install the bundle if the <code>Gemfile</code> has changed.</p>
|
103
120
|
</td>
|
104
121
|
<td class=code>
|
@@ -110,10 +127,10 @@ places under <code>.bundle/gems</code>.</p>
|
|
110
127
|
<span class="k">end</span></pre></div>
|
111
128
|
</td>
|
112
129
|
</tr>
|
113
|
-
<tr id='section-
|
130
|
+
<tr id='section-8'>
|
114
131
|
<td class=docs>
|
115
132
|
<div class="pilwrap">
|
116
|
-
<a class="pilcrow" href="#section-
|
133
|
+
<a class="pilcrow" href="#section-8">¶</a>
|
117
134
|
</div>
|
118
135
|
<p>Occassionally it’s useful to force an install (such as if something has gone wrong in
|
119
136
|
a previous deployment)</p>
|
@@ -121,28 +138,28 @@ a previous deployment)</p>
|
|
121
138
|
<td class=code>
|
122
139
|
<div class='highlight'><pre> <span class="n">desc</span> <span class="s2">"Install the latest gem bundle"</span>
|
123
140
|
<span class="n">task</span> <span class="ss">:default</span> <span class="k">do</span>
|
124
|
-
<span class="k">if</span> <span class="n">deployed_file_exists?</span><span class="p">(</span><span class="n">
|
125
|
-
<span class="n">
|
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>
|
126
143
|
<span class="k">else</span>
|
127
144
|
<span class="nb">puts</span> <span class="s2">"Skipping bundle:install as no Gemfile found"</span>
|
128
145
|
<span class="k">end</span>
|
129
146
|
<span class="k">end</span>
|
130
|
-
<span class="k">end</span>
|
131
|
-
<span class="k">end</span></pre></div>
|
147
|
+
<span class="k">end</span></pre></div>
|
132
148
|
</td>
|
133
149
|
</tr>
|
134
|
-
<tr id='section-
|
150
|
+
<tr id='section-9'>
|
135
151
|
<td class=docs>
|
136
152
|
<div class="pilwrap">
|
137
|
-
<a class="pilcrow" href="#section-
|
153
|
+
<a class="pilcrow" href="#section-9">¶</a>
|
138
154
|
</div>
|
139
155
|
<p>To install the bundle automatically each time the code is updated or cloned, hooks are added to
|
140
156
|
the <code>deploy:clone_code</code> and <code>deploy:update_code</code> tasks.</p>
|
141
157
|
|
142
158
|
</td>
|
143
159
|
<td class=code>
|
144
|
-
<div class='highlight'><pre>
|
145
|
-
|
160
|
+
<div class='highlight'><pre> <span class="n">after</span> <span class="s1">'deploy:clone_code'</span><span class="p">,</span> <span class="s1">'bundle:install:if_changed'</span>
|
161
|
+
<span class="n">after</span> <span class="s1">'deploy:update_code'</span><span class="p">,</span> <span class="s1">'bundle:install:if_changed'</span>
|
162
|
+
<span class="k">end</span>
|
146
163
|
<span class="k">end</span></pre></div>
|
147
164
|
</td>
|
148
165
|
</tr>
|