capistrano 2.1.0 → 3.0.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.
Files changed (166) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +7 -0
  4. data/CHANGELOG.md +89 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +674 -0
  7. data/README.md +226 -0
  8. data/Rakefile +5 -0
  9. data/bin/cap +2 -3
  10. data/bin/capify +7 -77
  11. data/capistrano-public_cert.pem +22 -0
  12. data/capistrano.gemspec +35 -0
  13. data/features/deploy.feature +52 -0
  14. data/features/installation.feature +16 -0
  15. data/features/remote_file_task.feature +14 -0
  16. data/features/step_definitions/assertions.rb +90 -0
  17. data/features/step_definitions/cap_commands.rb +8 -0
  18. data/features/step_definitions/setup.rb +25 -0
  19. data/features/support/env.rb +12 -0
  20. data/features/support/remote_command_helpers.rb +20 -0
  21. data/lib/Capfile +3 -0
  22. data/lib/capistrano/all.rb +16 -0
  23. data/lib/capistrano/application.rb +60 -0
  24. data/lib/capistrano/configuration/question.rb +42 -0
  25. data/lib/capistrano/configuration/server.rb +133 -0
  26. data/lib/capistrano/configuration/servers/role_filter.rb +86 -0
  27. data/lib/capistrano/configuration/servers.rb +53 -58
  28. data/lib/capistrano/configuration.rb +84 -30
  29. data/lib/capistrano/console.rb +1 -0
  30. data/lib/capistrano/defaults.rb +13 -0
  31. data/lib/capistrano/deploy.rb +3 -0
  32. data/lib/capistrano/dotfile.rb +3 -0
  33. data/lib/capistrano/dsl/env.rb +64 -0
  34. data/lib/capistrano/dsl/paths.rb +94 -0
  35. data/lib/capistrano/dsl/stages.rb +15 -0
  36. data/lib/capistrano/dsl/task_enhancements.rb +53 -0
  37. data/lib/capistrano/dsl.rb +48 -0
  38. data/lib/capistrano/git.rb +1 -0
  39. data/lib/capistrano/hg.rb +1 -0
  40. data/lib/capistrano/i18n.rb +34 -0
  41. data/lib/capistrano/install.rb +1 -0
  42. data/lib/capistrano/setup.rb +21 -0
  43. data/lib/capistrano/tasks/console.rake +21 -0
  44. data/lib/capistrano/tasks/deploy.rake +204 -0
  45. data/lib/capistrano/tasks/framework.rake +67 -0
  46. data/lib/capistrano/tasks/git.rake +62 -0
  47. data/lib/capistrano/tasks/hg.rake +39 -0
  48. data/lib/capistrano/tasks/install.rake +39 -0
  49. data/lib/capistrano/templates/Capfile +26 -0
  50. data/lib/capistrano/templates/deploy.rb.erb +40 -0
  51. data/lib/capistrano/templates/stage.rb.erb +42 -0
  52. data/lib/capistrano/version.rb +1 -20
  53. data/lib/capistrano/version_validator.rb +37 -0
  54. data/lib/capistrano.rb +0 -2
  55. data/spec/integration/dsl_spec.rb +344 -0
  56. data/spec/integration_spec_helper.rb +7 -0
  57. data/spec/lib/capistrano/application_spec.rb +61 -0
  58. data/spec/lib/capistrano/configuration/question_spec.rb +54 -0
  59. data/spec/lib/capistrano/configuration/server_spec.rb +249 -0
  60. data/spec/lib/capistrano/configuration/servers/role_filter_spec.rb +140 -0
  61. data/spec/lib/capistrano/configuration/servers_spec.rb +184 -0
  62. data/spec/lib/capistrano/configuration_spec.rb +101 -0
  63. data/spec/lib/capistrano/dsl/env_spec.rb +10 -0
  64. data/spec/lib/capistrano/dsl/paths_spec.rb +69 -0
  65. data/spec/lib/capistrano/dsl_spec.rb +63 -0
  66. data/spec/lib/capistrano/version_validator_spec.rb +103 -0
  67. data/spec/lib/capistrano_spec.rb +8 -0
  68. data/spec/spec_helper.rb +15 -0
  69. data/spec/support/.gitignore +1 -0
  70. data/spec/support/Vagrantfile +13 -0
  71. data/spec/support/matchers.rb +5 -0
  72. data/spec/support/tasks/database.cap +11 -0
  73. data/spec/support/test_app.rb +138 -0
  74. metadata +251 -179
  75. data/CHANGELOG +0 -512
  76. data/MIT-LICENSE +0 -20
  77. data/README +0 -43
  78. data/examples/sample.rb +0 -14
  79. data/lib/capistrano/callback.rb +0 -45
  80. data/lib/capistrano/cli/execute.rb +0 -82
  81. data/lib/capistrano/cli/help.rb +0 -102
  82. data/lib/capistrano/cli/help.txt +0 -53
  83. data/lib/capistrano/cli/options.rb +0 -183
  84. data/lib/capistrano/cli/ui.rb +0 -28
  85. data/lib/capistrano/cli.rb +0 -47
  86. data/lib/capistrano/command.rb +0 -161
  87. data/lib/capistrano/configuration/actions/file_transfer.rb +0 -35
  88. data/lib/capistrano/configuration/actions/inspect.rb +0 -46
  89. data/lib/capistrano/configuration/actions/invocation.rb +0 -134
  90. data/lib/capistrano/configuration/callbacks.rb +0 -148
  91. data/lib/capistrano/configuration/connections.rb +0 -159
  92. data/lib/capistrano/configuration/execution.rb +0 -126
  93. data/lib/capistrano/configuration/loading.rb +0 -198
  94. data/lib/capistrano/configuration/namespaces.rb +0 -196
  95. data/lib/capistrano/configuration/roles.rb +0 -51
  96. data/lib/capistrano/configuration/variables.rb +0 -127
  97. data/lib/capistrano/errors.rb +0 -15
  98. data/lib/capistrano/extensions.rb +0 -57
  99. data/lib/capistrano/gateway.rb +0 -131
  100. data/lib/capistrano/logger.rb +0 -59
  101. data/lib/capistrano/recipes/compat.rb +0 -32
  102. data/lib/capistrano/recipes/deploy/dependencies.rb +0 -44
  103. data/lib/capistrano/recipes/deploy/local_dependency.rb +0 -46
  104. data/lib/capistrano/recipes/deploy/remote_dependency.rb +0 -96
  105. data/lib/capistrano/recipes/deploy/scm/accurev.rb +0 -169
  106. data/lib/capistrano/recipes/deploy/scm/base.rb +0 -192
  107. data/lib/capistrano/recipes/deploy/scm/bzr.rb +0 -86
  108. data/lib/capistrano/recipes/deploy/scm/cvs.rb +0 -151
  109. data/lib/capistrano/recipes/deploy/scm/darcs.rb +0 -85
  110. data/lib/capistrano/recipes/deploy/scm/git.rb +0 -191
  111. data/lib/capistrano/recipes/deploy/scm/mercurial.rb +0 -129
  112. data/lib/capistrano/recipes/deploy/scm/perforce.rb +0 -126
  113. data/lib/capistrano/recipes/deploy/scm/subversion.rb +0 -114
  114. data/lib/capistrano/recipes/deploy/scm.rb +0 -19
  115. data/lib/capistrano/recipes/deploy/strategy/base.rb +0 -64
  116. data/lib/capistrano/recipes/deploy/strategy/checkout.rb +0 -20
  117. data/lib/capistrano/recipes/deploy/strategy/copy.rb +0 -144
  118. data/lib/capistrano/recipes/deploy/strategy/export.rb +0 -20
  119. data/lib/capistrano/recipes/deploy/strategy/remote.rb +0 -52
  120. data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +0 -47
  121. data/lib/capistrano/recipes/deploy/strategy.rb +0 -19
  122. data/lib/capistrano/recipes/deploy/templates/maintenance.rhtml +0 -53
  123. data/lib/capistrano/recipes/deploy.rb +0 -494
  124. data/lib/capistrano/recipes/standard.rb +0 -37
  125. data/lib/capistrano/recipes/templates/maintenance.rhtml +0 -53
  126. data/lib/capistrano/recipes/upgrade.rb +0 -33
  127. data/lib/capistrano/server_definition.rb +0 -51
  128. data/lib/capistrano/shell.rb +0 -256
  129. data/lib/capistrano/ssh.rb +0 -109
  130. data/lib/capistrano/task_definition.rb +0 -69
  131. data/lib/capistrano/upload.rb +0 -146
  132. data/test/cli/execute_test.rb +0 -132
  133. data/test/cli/help_test.rb +0 -139
  134. data/test/cli/options_test.rb +0 -226
  135. data/test/cli/ui_test.rb +0 -28
  136. data/test/cli_test.rb +0 -17
  137. data/test/command_test.rb +0 -309
  138. data/test/configuration/actions/file_transfer_test.rb +0 -40
  139. data/test/configuration/actions/inspect_test.rb +0 -62
  140. data/test/configuration/actions/invocation_test.rb +0 -202
  141. data/test/configuration/callbacks_test.rb +0 -206
  142. data/test/configuration/connections_test.rb +0 -288
  143. data/test/configuration/execution_test.rb +0 -159
  144. data/test/configuration/loading_test.rb +0 -127
  145. data/test/configuration/namespace_dsl_test.rb +0 -297
  146. data/test/configuration/roles_test.rb +0 -47
  147. data/test/configuration/servers_test.rb +0 -90
  148. data/test/configuration/variables_test.rb +0 -180
  149. data/test/configuration_test.rb +0 -81
  150. data/test/deploy/scm/accurev_test.rb +0 -23
  151. data/test/deploy/scm/base_test.rb +0 -55
  152. data/test/deploy/scm/git_test.rb +0 -112
  153. data/test/deploy/strategy/copy_test.rb +0 -147
  154. data/test/extensions_test.rb +0 -69
  155. data/test/fixtures/cli_integration.rb +0 -5
  156. data/test/fixtures/config.rb +0 -5
  157. data/test/fixtures/custom.rb +0 -3
  158. data/test/gateway_test.rb +0 -167
  159. data/test/logger_test.rb +0 -123
  160. data/test/server_definition_test.rb +0 -108
  161. data/test/shell_test.rb +0 -64
  162. data/test/ssh_test.rb +0 -97
  163. data/test/task_definition_test.rb +0 -101
  164. data/test/upload_test.rb +0 -131
  165. data/test/utils.rb +0 -42
  166. data/test/version_test.rb +0 -24
data/README.md ADDED
@@ -0,0 +1,226 @@
1
+ # Capistrano [![Build Status](https://travis-ci.org/capistrano/capistrano.png?branch=v3)](https://travis-ci.org/capistrano/capistrano)
2
+
3
+ ## Requirements
4
+
5
+ * Ruby >= 1.9 (JRuby and C-Ruby/YARV are supported)
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ``` ruby
12
+ gem 'capistrano', '~> 3.0.0'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ ``` ruby
18
+ $ bundle --binstubs
19
+ ```
20
+
21
+ Capify:
22
+ *make sure there's no "Capfile" or "capfile" present*
23
+ ``` shell
24
+ $ cap install
25
+ ```
26
+
27
+ This creates the following files:
28
+
29
+ ```
30
+ ├── Capfile
31
+ ├── config
32
+ │ ├── deploy
33
+ │ │ ├── production.rb
34
+ │ │ └── staging.rb
35
+ │ └── deploy.rb
36
+ └── lib
37
+ └── capistrano
38
+ └── tasks
39
+ ```
40
+
41
+ To create different stages:
42
+
43
+ ``` shell
44
+ $ cap install STAGES=local,sandbox,qa,production
45
+ ```
46
+
47
+ ## Usage
48
+
49
+ ``` shell
50
+ $ cap -vT
51
+
52
+ $ cap staging deploy
53
+ $ cap production deploy
54
+
55
+ $ cap production deploy --dry-run
56
+ $ cap production deploy --prereqs
57
+ $ cap production deploy --trace
58
+ ```
59
+
60
+ ## Tasks
61
+
62
+ ``` ruby
63
+ server 'example.com', roles: [:web, :app]
64
+ server 'example.org', roles: [:db, :workers]
65
+ desc "Report Uptimes"
66
+ task :uptime do
67
+ on roles(:all) do |host|
68
+ info "Host #{host} (#{host.roles.join(', ')}):\t#{capture(:uptime)}"
69
+ end
70
+ end
71
+ ```
72
+
73
+ ## Before / After
74
+
75
+ Where calling on the same task name, executed in order of inclusion
76
+
77
+ ``` ruby
78
+ # call an existing task
79
+ before :starting, :ensure_user
80
+
81
+ after :finishing, :notify
82
+
83
+
84
+ # or define in block
85
+ before :starting, :ensure_user do
86
+ #
87
+ end
88
+
89
+ after :finishing, :notify do
90
+ #
91
+ end
92
+ ```
93
+
94
+ If it makes sense for your use-case (often, that means *generating a file*)
95
+ the Rake prerequisite mechanism can be used:
96
+
97
+ ``` ruby
98
+ desc "Create Important File"
99
+ file 'important.txt' do |t|
100
+ sh "touch #{t.name}"
101
+ end
102
+ desc "Upload Important File"
103
+ task :upload => 'important.txt' do |t|
104
+ on roles(:all) do
105
+ upload!(t.prerequisites.first, '/tmp')
106
+ end
107
+ end
108
+ ```
109
+
110
+ The final way to call out to other tasks is to simply `invoke()` them:
111
+
112
+ ``` ruby
113
+ task :one do
114
+ on roles(:all) { info "One" }
115
+ end
116
+ task :two do
117
+ invoke :one
118
+ on roles(:all) { info "Two" }
119
+ end
120
+ ```
121
+
122
+ This method is widely used.
123
+
124
+ ## Getting User Input
125
+
126
+ ``` ruby
127
+ desc "Ask about breakfast"
128
+ task :breakfast do
129
+ breakfast = ask(:breakfast, "What would you like your colleagues to you for breakfast?")
130
+ on roles(:all) do |h|
131
+ execute "echo \"$(whoami) wants #{breakfast} for breakfast!\" | wall"
132
+ end
133
+ end
134
+ ```
135
+
136
+ Perfect, who needs telephones.
137
+
138
+
139
+ ## Running local tasks
140
+
141
+ Local tasks can be run by replacing `on` with `run_locally`
142
+
143
+ ``` ruby
144
+ desc "Notify service of deployment"
145
+ task :notify do
146
+ run_locally do
147
+ with rails_env: :development do
148
+ rake 'service:notify'
149
+ end
150
+ end
151
+ end
152
+ ```
153
+
154
+ ## Console
155
+
156
+ **Note:** Here be dragons. The console is very immature, but it's much more
157
+ cleanly architected than previous incarnations and it'll only get better from
158
+ here on in.
159
+
160
+ Execute arbitrary remote commands, to use this simply add
161
+ `require 'capistrano/console'` which will add the necessary tasks to your
162
+ environment:
163
+
164
+ ``` shell
165
+ $ cap staging console
166
+ ```
167
+
168
+ Then, after setting up the server connections, this is how that might look:
169
+
170
+ ```
171
+ $ cap production console
172
+ capistrano console - enter command to execute on production
173
+ production> uptime
174
+ INFO [94db8027] Running /usr/bin/env uptime on leehambley@example.com:22
175
+ DEBUG [94db8027] Command: /usr/bin/env uptime
176
+ DEBUG [94db8027] 17:11:17 up 50 days, 22:31, 1 user, load average: 0.02, 0.02, 0.05
177
+ INFO [94db8027] Finished in 0.435 seconds command successful.
178
+ production> who
179
+ INFO [9ce34809] Running /usr/bin/env who on leehambley@example.com:22
180
+ DEBUG [9ce34809] Command: /usr/bin/env who
181
+ DEBUG [9ce34809] leehambley pts/0 2013-06-13 17:11 (port-11262.pppoe.wtnet.de)
182
+ INFO [9ce34809] Finished in 0.420 seconds command successful.
183
+ ```
184
+
185
+ ## A word about PTYs
186
+
187
+ There is a configuration option which asks the backend driver to as the remote host
188
+ to assign the connection a *pty*. A *pty* is a pseudo-terminal, which in effect means
189
+ *tell the backend that this is an **interactive** session*. This is normally a bad idea.
190
+
191
+ Most of the differences are best explained by [this page](https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization) from the author of *rbenv*.
192
+
193
+ **When Capistrano makes a connection it is a *non-login*, *non-interactive* shell.
194
+ This was not an accident!**
195
+
196
+ It's often used as a band aid to cure issues related to RVM and rbenv not loading login
197
+ and shell initialisation scripts. In these scenarios RVM and rbenv are the tools at fault,
198
+ or at least they are being used incorrectly.
199
+
200
+ Whilst, especially in the case of language runtimes (Ruby, Node, Python and friends in
201
+ particular) there is a temptation to run multiple versions in parallel on a single server
202
+ and to switch between them using environmental variables, this is an anti-pattern, and
203
+ symptomatic of bad design (i.e. you're testing a second version of Ruby in production because
204
+ your company lacks the infrastructure to test this in a staging environment).
205
+
206
+ ## Configuration
207
+
208
+ The following variables are settable:
209
+
210
+ | Variable Name | Description | Notes |
211
+ |:---------------------:|---------------------------------------------------------------------|-----------------------------------------------------------------|
212
+ | `:repo_url` | The URL of your Git repository | file://, https://, or ssh:// are all supported |
213
+ | `:git_https_username` | The (optional) username for accessing your Git repostory over HTTPS | if this is an SSH connection, this setting will have no effect. |
214
+ | `:git_https_password` | The (optional) password for accessing your Git repostory over HTTPS | if this is an SSH connection, this setting will have no effect. |
215
+ | `:tmp_dir` | The (optional) temp directory that will be used (default: /tmp) | if you have a shared web host, this setting may need to be set (i.e. /home/user/tmp/capistrano). |
216
+
217
+ ## SSHKit
218
+
219
+ [SSHKit](https://github.com/capistrano/sshkit) is the driver for SSH
220
+ connections behind the scenes in Capistrano, depending how deep you dig, you
221
+ might run into interfaces that come directly from SSHKit (the configuration is
222
+ a good example).
223
+
224
+ ## Licence
225
+
226
+ <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Capistrano</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://www.capistranorb.com." property="cc:attributionName" rel="cc:attributionURL">Lee Hambley and Tom Clements</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US">Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://www.github.com/capistrano" rel="dct:source">https://www.github.com/capistrano</a>.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :default => :spec
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new
data/bin/cap CHANGED
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require 'capistrano/cli'
4
- Capistrano::CLI.execute
2
+ require 'capistrano/all'
3
+ Capistrano::Application.new.run
data/bin/capify CHANGED
@@ -1,78 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
-
5
- OptionParser.new do |opts|
6
- opts.banner = "Usage: #{File.basename($0)} [path]"
7
-
8
- opts.on("-h", "--help", "Displays this help info") do
9
- puts opts
10
- exit 0
11
- end
12
-
13
- begin
14
- opts.parse!(ARGV)
15
- rescue OptionParser::ParseError => e
16
- warn e.message
17
- puts opts
18
- exit 1
19
- end
20
- end
21
-
22
- if ARGV.empty?
23
- abort "Please specify the directory to capify, e.g. `#{File.basename($0)} .'"
24
- elsif !File.exists?(ARGV.first)
25
- abort "`#{ARGV.first}' does not exist."
26
- elsif !File.directory?(ARGV.first)
27
- abort "`#{ARGV.first}' is not a directory."
28
- elsif ARGV.length > 1
29
- abort "Too many arguments; please specify only the directory to capify."
30
- end
31
-
32
- def unindent(string)
33
- indentation = string[/\A\s*/]
34
- string.strip.gsub(/^#{indentation}/, "")
35
- end
36
-
37
- files = {
38
- "Capfile" => unindent(<<-FILE),
39
- load 'deploy' if respond_to?(:namespace) # cap2 differentiator
40
- Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
41
- load 'config/deploy'
42
- FILE
43
-
44
- "config/deploy.rb" => unindent(<<-FILE),
45
- set :application, "set your application name here"
46
- set :repository, "set your repository location here"
47
-
48
- # If you aren't deploying to /u/apps/\#{application} on the target
49
- # servers (which is the default), you can specify the actual location
50
- # via the :deploy_to variable:
51
- # set :deploy_to, "/var/www/\#{application}"
52
-
53
- # If you aren't using Subversion to manage your source code, specify
54
- # your SCM below:
55
- # set :scm, :subversion
56
-
57
- role :app, "your app-server here"
58
- role :web, "your web-server here"
59
- role :db, "your db-server here", :primary => true
60
- FILE
61
- }
62
-
63
- base = ARGV.shift
64
- files.each do |file, content|
65
- file = File.join(base, file)
66
- if File.exists?(file)
67
- warn "[skip] `#{file}' already exists"
68
- elsif File.exists?(file.downcase)
69
- warn "[skip] `#{file.downcase}' exists, which could conflict with `#{file}'"
70
- elsif !File.exists?(File.dirname(file))
71
- warn "[skip] directory `#{File.dirname(file)}' does not exist"
72
- else
73
- puts "[add] writing `#{file}'"
74
- File.open(file, "w") { |f| f.write(content) }
75
- end
76
- end
77
-
78
- puts "[done] capified!"
2
+ puts "-" * 80
3
+ puts "Capistrano 3.x is incompatible with Capistrano 2.x. "
4
+ puts
5
+ puts "This command has become `cap install` in Capistrano 3.x"
6
+ puts
7
+ puts "For more information see http://www.capistranorb.com/"
8
+ puts "-" * 80
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDkjCCAnqgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMRIwEAYDVQQDDAlnZW1t
3
+ YXN0ZXIxHDAaBgoJkiaJk/IsZAEZFgxjYXBpc3RyYW5vcmIxEzARBgoJkiaJk/Is
4
+ ZAEZFgNjb20wHhcNMTMwNjI4MTM0MzQ1WhcNMTQwNjI4MTM0MzQ1WjBHMRIwEAYD
5
+ VQQDDAlnZW1tYXN0ZXIxHDAaBgoJkiaJk/IsZAEZFgxjYXBpc3RyYW5vcmIxEzAR
6
+ BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
7
+ AQDnuMT+SoCTQoxEOma65Vf9ftibHTzfaZPGSNcheguiFa3/Mc69/xurtUa7bGY8
8
+ ZyuJbd2pb4pqhx7PcVlByJnBQCmOHzZPzn6wVa5n4n8/VBccYcFNePdPj8+KK13x
9
+ +97E6mjNZJtf4BZm4tZD6Ztyq90+mQ0WeoseYfYdm+ZJ9BNFdB2EHmTnh983MHMj
10
+ WNn52ZC2pAHDRuxKAOj5yq8IZWA8B/IWNjMXQCJbM9eaH0+vVvquC2RyprpkfoqQ
11
+ Xb7BJA2hftizHUMk4LOldNvy220GHjKL0Ot7tlGcD2DzaZNN0aPUfezz306ytsMp
12
+ KDYYLbLcg63TPHFHu1fzyQG9AgMBAAGjgYgwgYUwCQYDVR0TBAIwADALBgNVHQ8E
13
+ BAMCBLAwHQYDVR0OBBYEFEzXgfsvOB8Aw2b+Md3t3O9PUGZCMCUGA1UdEQQeMByB
14
+ GmdlbW1hc3RlckBjYXBpc3RyYW5vcmIuY29tMCUGA1UdEgQeMByBGmdlbW1hc3Rl
15
+ ckBjYXBpc3RyYW5vcmIuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQCnS7Pcy/srhZCb
16
+ TrUNkCTHI4QEURAWRNYFLL9TCCl3oyKkwW6aZxarpQbJK3Es99sugsKh/sKijOIE
17
+ xhflvSNN59Zc/BETve1y0VktN+94GiQQ1F82SmRwmY2tJJD7C3jQ6Og6pX7eNBWZ
18
+ W1su8leIv8sj3o5Vdn/Le1HKVXMakFICq9HdLnIH1jW2Brfthlc2ujAg0cOU58GC
19
+ wNkME+L45pR9zggNpbBY23mlbAicPrsmybEdk9SOdaOCgxh+fyGx6Q2n0m5YAXgN
20
+ KVoU0DazqHs6BVyJaajxht4kCpPDD1wUqCvwlOQtotdwD7CCGCPdcYgf6fAp4yQZ
21
+ jC76QR6/
22
+ -----END CERTIFICATE-----
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'capistrano/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "capistrano"
8
+ gem.version = Capistrano::VERSION
9
+ gem.authors = ["Tom Clements", "Lee Hambley"]
10
+ gem.email = ["seenmyfate@gmail.com", "lee.hambley@gmail.com"]
11
+ gem.description = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
12
+ gem.summary = %q{Capistrano - Welcome to easy deployment with Ruby over SSH}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = 'cap'
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.post_install_message = "If you're updating Capistrano from 2.x.x, we recommend you to read the upgrade guide: http://www.capistranorb.com/documentation/upgrading/"
21
+
22
+ #gem.signing_key = '/Volumes/SD Card/leehambley-private_key.pem'
23
+ #gem.cert_chain = ['capistrano-public_cert.pem', 'leehambley-public_cert.pem']
24
+
25
+ gem.add_dependency 'sshkit', '>= 0.0.23'
26
+ gem.add_dependency 'rake', '>= 10.0.0'
27
+ gem.add_dependency 'i18n'
28
+
29
+ gem.add_development_dependency 'rspec'
30
+ gem.add_development_dependency 'mocha'
31
+ gem.add_development_dependency 'vagrant', '~> 1.0.7'
32
+ gem.add_development_dependency 'kuroko'
33
+ gem.add_development_dependency 'cucumber'
34
+
35
+ end
@@ -0,0 +1,52 @@
1
+ Feature: Deploy
2
+
3
+ Background:
4
+ Given a test app with the default configuration
5
+ And servers with the roles app and web
6
+
7
+ Scenario: Creating the repo
8
+ When I run cap "git:check"
9
+ Then references in the remote repo are listed
10
+
11
+ Scenario: Creating the directory structure
12
+ When I run cap "deploy:check:directories"
13
+ Then the shared path is created
14
+ And the releases path is created
15
+
16
+ Scenario: Creating linked directories
17
+ When I run cap "deploy:check:linked_dirs"
18
+ Then directories in :linked_dirs are created in shared
19
+
20
+ Scenario: Creating linked directories for linked files
21
+ When I run cap "deploy:check:make_linked_dirs"
22
+ Then directories referenced in :linked_files are created in shared
23
+
24
+ Scenario: Checking linked files - missing file
25
+ Given a required file
26
+ But the file does not exist
27
+ When I run cap "deploy:check:linked_files"
28
+ Then the task will exit
29
+
30
+ Scenario: Checking linked files - file exists
31
+ Given a required file
32
+ And that file exists
33
+ When I run cap "deploy:check:linked_files"
34
+ Then the task will be successful
35
+
36
+ Scenario: Creating a release
37
+ When I run cap "git:create_release" as part of a release
38
+ Then the repo is cloned
39
+ And the release is created
40
+
41
+ Scenario: Symlink linked files
42
+ When I run cap "deploy:symlink:linked_files" as part of a release
43
+ Then file symlinks are created in the new release
44
+
45
+ Scenario: Symlink linked dirs
46
+ When I run cap "deploy:symlink:linked_dirs" as part of a release
47
+ Then directory symlinks are created in the new release
48
+
49
+ Scenario: Publishing
50
+ When I run cap "deploy:symlink:release"
51
+ Then the current directory will be a symlink to the release
52
+
@@ -0,0 +1,16 @@
1
+ Feature: Installation
2
+
3
+ Background:
4
+ Given a test app with the default configuration
5
+
6
+ Scenario: With default stages
7
+ When I run cap "install"
8
+ Then the deploy.rb file is created
9
+ And the default stage files are created
10
+ And the tasks folder is created
11
+
12
+ Scenario: With specified stages
13
+ When I run cap "install STAGES=qa,production"
14
+ Then the deploy.rb file is created
15
+ And the specified stage files are created
16
+ And the tasks folder is created
@@ -0,0 +1,14 @@
1
+ Feature: Remote file task
2
+
3
+ Background:
4
+ Given a test app with the default configuration
5
+ And a custom task to generate a file
6
+ And servers with the roles app and web
7
+
8
+ Scenario: Where the file does not exist
9
+ When I run cap "deploy:check:linked_files"
10
+ Then it creates the file with the remote_task prerequisite
11
+
12
+ Scenario: Where the file already exists
13
+ When I run cap "deploy:check:linked_files"
14
+ Then it will not recreate the file
@@ -0,0 +1,90 @@
1
+ Then(/^references in the remote repo are listed$/) do
2
+ end
3
+
4
+ Then(/^the shared path is created$/) do
5
+ run_vagrant_command(test_dir_exists(TestApp.shared_path))
6
+ end
7
+
8
+ Then(/^the releases path is created$/) do
9
+ run_vagrant_command(test_dir_exists(TestApp.releases_path))
10
+ end
11
+
12
+ Then(/^directories in :linked_dirs are created in shared$/) do
13
+ TestApp.linked_dirs.each do |dir|
14
+ run_vagrant_command(test_dir_exists(TestApp.shared_path.join(dir)))
15
+ end
16
+ end
17
+
18
+ Then(/^directories referenced in :linked_files are created in shared$/) do
19
+ dirs = TestApp.linked_files.map { |path| TestApp.shared_path.join(path).dirname }
20
+ dirs.each do | dir|
21
+ run_vagrant_command(test_dir_exists(dir))
22
+ end
23
+ end
24
+
25
+ Then(/^the task will be successful$/) do
26
+ end
27
+
28
+
29
+ Then(/^the task will exit$/) do
30
+ end
31
+
32
+ Then(/^the repo is cloned$/) do
33
+ run_vagrant_command(test_dir_exists(TestApp.repo_path))
34
+ end
35
+
36
+ Then(/^the release is created$/) do
37
+ run_vagrant_command("ls -g #{TestApp.releases_path}")
38
+ end
39
+
40
+ Then(/^file symlinks are created in the new release$/) do
41
+ pending
42
+ TestApp.linked_files.each do |file|
43
+ run_vagrant_command(test_symlink_exists(TestApp.release_path.join(file)))
44
+ end
45
+ end
46
+
47
+ Then(/^directory symlinks are created in the new release$/) do
48
+ pending
49
+ TestApp.linked_dirs.each do |dir|
50
+ run_vagrant_command(test_symlink_exists(TestApp.release_path.join(dir)))
51
+ end
52
+ end
53
+
54
+ Then(/^the current directory will be a symlink to the release$/) do
55
+ run_vagrant_command(test_symlink_exists(TestApp.current_path))
56
+ end
57
+
58
+ Then(/^the deploy\.rb file is created$/) do
59
+ file = TestApp.test_app_path.join('config/deploy.rb')
60
+ expect(File.exists?(file)).to be_true
61
+ end
62
+
63
+ Then(/^the default stage files are created$/) do
64
+ staging = TestApp.test_app_path.join('config/deploy/staging.rb')
65
+ production = TestApp.test_app_path.join('config/deploy/production.rb')
66
+ expect(File.exists?(staging)).to be_true
67
+ expect(File.exists?(production)).to be_true
68
+ end
69
+
70
+ Then(/^the tasks folder is created$/) do
71
+ path = TestApp.test_app_path.join('lib/capistrano/tasks')
72
+ expect(Dir.exists?(path)).to be_true
73
+ end
74
+
75
+ Then(/^the specified stage files are created$/) do
76
+ qa = TestApp.test_app_path.join('config/deploy/qa.rb')
77
+ production = TestApp.test_app_path.join('config/deploy/production.rb')
78
+ expect(File.exists?(qa)).to be_true
79
+ expect(File.exists?(production)).to be_true
80
+ end
81
+
82
+ Then(/^it creates the file with the remote_task prerequisite$/) do
83
+ TestApp.linked_files.each do |file|
84
+ run_vagrant_command(test_file_exists(TestApp.shared_path.join(file)))
85
+ end
86
+ end
87
+
88
+ Then(/^it will not recreate the file$/) do
89
+ #
90
+ end
@@ -0,0 +1,8 @@
1
+ When(/^I run cap "(.*?)"$/) do |task|
2
+ TestApp.cap(task)
3
+ end
4
+
5
+ When(/^I run cap "(.*?)" as part of a release$/) do |task|
6
+ TestApp.cap("deploy:new_release_path #{task}")
7
+ end
8
+
@@ -0,0 +1,25 @@
1
+ Given(/^a test app with the default configuration$/) do
2
+ TestApp.install
3
+ end
4
+
5
+ Given(/^servers with the roles app and web$/) do
6
+ vagrant_cli_command('up')
7
+ end
8
+
9
+ Given(/^a required file$/) do
10
+ end
11
+
12
+ Given(/^that file exists$/) do
13
+ run_vagrant_command("touch #{TestApp.linked_file}")
14
+ end
15
+
16
+ Given(/^the file does not exist$/) do
17
+ pending
18
+ file = TestApp.linked_file
19
+ run_vagrant_command("[ -f #{file} ] && rm #{file}")
20
+ end
21
+
22
+ Given(/^a custom task to generate a file$/) do
23
+ TestApp.copy_task_to_test_app('spec/support/tasks/database.cap')
24
+ end
25
+
@@ -0,0 +1,12 @@
1
+ require 'kuroko'
2
+
3
+ project_root = File.expand_path('../../../', __FILE__)
4
+ vagrant_root = File.join(project_root, 'spec/support')
5
+
6
+ Kuroko.configure do |config|
7
+ config.vagrant_root = 'spec/support'
8
+ end
9
+
10
+ puts vagrant_root.inspect
11
+
12
+ require_relative '../../spec/support/test_app'
@@ -0,0 +1,20 @@
1
+ module RemoteCommandHelpers
2
+
3
+ def test_dir_exists(path)
4
+ exists?('d', path)
5
+ end
6
+
7
+ def test_symlink_exists(path)
8
+ exists?('L', path)
9
+ end
10
+
11
+ def test_file_exists(path)
12
+ exists?('f', path)
13
+ end
14
+
15
+ def exists?(type, path)
16
+ %{[ -#{type} "#{path}" ] && echo "#{path} exists." || echo "Error: #{path} does not exist."}
17
+ end
18
+ end
19
+
20
+ World(RemoteCommandHelpers)
data/lib/Capfile ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env cap
2
+ include Capistrano::DSL
3
+ require 'capistrano/install'
@@ -0,0 +1,16 @@
1
+ require 'rake'
2
+ require 'sshkit'
3
+ require 'sshkit/dsl'
4
+
5
+ Rake.application.options.trace = true
6
+
7
+ require 'capistrano/version'
8
+ require 'capistrano/version_validator'
9
+ require 'capistrano/i18n'
10
+ require 'capistrano/dsl'
11
+ require 'capistrano/application'
12
+ require 'capistrano/configuration'
13
+
14
+ module Capistrano
15
+
16
+ end