foreplay 0.15.4 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rspec +2 -1
- data/.rubocop.yml +5 -1
- data/Gemfile +16 -0
- data/Gemfile.local.example +12 -0
- data/README.md +3 -0
- data/circle.yml +18 -0
- data/foreplay.gemspec +16 -33
- data/lib/foreplay/engine/defaults.rb +2 -1
- data/lib/foreplay/engine/steps.yml +4 -2
- data/lib/foreplay/version.rb +1 -1
- metadata +5 -249
- data/spec/lib/foreplay/deploy_spec.rb +0 -225
- data/spec/lib/foreplay/secrets_spec.rb +0 -66
- data/spec/lib/foreplay/setup_spec.rb +0 -10
- data/spec/lib/hash_spec.rb +0 -27
- data/spec/lib/yaml_spec.rb +0 -20
- data/spec/spec_helper.rb +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1acc3d32d3a9059cd7d30b0c94fd940e6b1c01ed
|
|
4
|
+
data.tar.gz: a1bc3da15901ae17b86a4bcc2654bb626bd46265
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0ecf87c49b570cf477f451b52b807494a022c60b7c2f80a2092f11233480271cd7b508d2e9959a132a96c69c698ca2641a97f32dc1b37120e1f49cbf6f53df15
|
|
7
|
+
data.tar.gz: f1a0141cb67f48da58cbc67125b3531716eb5dba45b697f2b4d4bac7789b108b7a81184d4752ba18a1a68cdf9228f68cc7b3f8865d7d1d759f34f4ddacb59237
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
ruby '2.1.9'
|
|
3
3
|
gemspec
|
|
4
|
+
|
|
5
|
+
group :test do
|
|
6
|
+
gem 'rspec'
|
|
7
|
+
gem 'rspec_junit_formatter'
|
|
8
|
+
gem 'cucumber'
|
|
9
|
+
gem 'aruba'
|
|
10
|
+
gem 'simplecov'
|
|
11
|
+
gem 'coveralls'
|
|
12
|
+
gem 'codeclimate-test-reporter'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
local_gemfile = 'Gemfile.local'
|
|
16
|
+
|
|
17
|
+
if File.exist?(local_gemfile)
|
|
18
|
+
eval(File.read(local_gemfile)) # rubocop:disable Lint/Eval
|
|
19
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Copy this file to a file named Gemfile.local to add these gems to your dev toolset
|
|
2
|
+
# Feel free to modify Gemfile.local to suit your own preferences
|
|
3
|
+
group :development do
|
|
4
|
+
gem 'rake'
|
|
5
|
+
gem 'gem-release'
|
|
6
|
+
gem 'rubocop'
|
|
7
|
+
gem 'listen', '~> 3.0', '< 3.1' # Dependency of guard, 3.1 requires Ruby 2.2+
|
|
8
|
+
gem 'guard'
|
|
9
|
+
gem 'guard-rspec'
|
|
10
|
+
gem 'guard-rubocop'
|
|
11
|
+
gem 'guard-cucumber'
|
|
12
|
+
end
|
data/README.md
CHANGED
|
@@ -80,6 +80,7 @@ production:
|
|
|
80
80
|
foreman:
|
|
81
81
|
concurrency: 'web=1,worker_immediate=2,worker_longjobs=1,scheduler=1,resque_web=1,new_relic_resque=1'
|
|
82
82
|
auxiliary:
|
|
83
|
+
config: ['stop_first'] # It runs out of memory unless I stop the service before asset precompile
|
|
83
84
|
servers: [bradman.xenapto.net,edrich.xenapto.net:10022]
|
|
84
85
|
foreman:
|
|
85
86
|
concurrency: 'worker_regular=8'
|
|
@@ -101,6 +102,7 @@ A quick walk-though of this configuration:
|
|
|
101
102
|
6. Each role contains a list of servers and any overrides to the default settings
|
|
102
103
|
7. For instance the `web` role is deployed to `sandham.xenapto.net`. For that server the database is on the same machine (`localhost`). The Foreman `concurrency` setting defines which workers from my Procfile are launched on that server.
|
|
103
104
|
8. Note that in the `auxiliary` role I am deploying to two servers. On the second (`edrich.xenapto.net`) I'm using port 10022 for SSH instead of the default.
|
|
105
|
+
9. Precompiling assets uses a lot of memory. On these servers I get Out Of Memory errors unless I shut down my app first.
|
|
104
106
|
|
|
105
107
|
General format:
|
|
106
108
|
|
|
@@ -113,6 +115,7 @@ defaults: # global defaults for all environments
|
|
|
113
115
|
keyfile: # or a file containing a private key that allows the named user access to the server
|
|
114
116
|
key: # ...or a private key that allows the named user access to the server
|
|
115
117
|
path: # absolute path to deploy the app on each server. %s will substitute to the app name
|
|
118
|
+
config: # Configuration parameters to change the behaviour of Foreplay
|
|
116
119
|
database: # the database.yml elements to write to the config folder
|
|
117
120
|
env: # contents of the .env file
|
|
118
121
|
key: value # will go into the .env file as key=value
|
data/circle.yml
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
machine:
|
|
2
|
+
ruby:
|
|
3
|
+
version: 2.1.9
|
|
4
|
+
|
|
5
|
+
dependencies:
|
|
6
|
+
pre:
|
|
7
|
+
- echo "export rvm_ignore_gemsets_flag=1" >> ~/.rvmrc
|
|
8
|
+
- gem install bundler
|
|
9
|
+
override:
|
|
10
|
+
- bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 --full-index
|
|
11
|
+
|
|
12
|
+
test:
|
|
13
|
+
override:
|
|
14
|
+
- bundle exec rspec:
|
|
15
|
+
timeout: 600
|
|
16
|
+
parallel: true
|
|
17
|
+
files:
|
|
18
|
+
- spec/**/*_spec.rb
|
data/foreplay.gemspec
CHANGED
|
@@ -2,39 +2,22 @@ lib = File.expand_path('../lib', __FILE__)
|
|
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
require 'foreplay/version'
|
|
4
4
|
|
|
5
|
-
Gem::Specification.new do |
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = 'foreplay'
|
|
7
|
+
s.version = Foreplay::VERSION
|
|
8
|
+
s.authors = ['Xenapto']
|
|
9
|
+
s.email = ['developers@xenapto.com']
|
|
10
|
+
s.description = 'Deploying Rails projects to Ubuntu using Foreman'
|
|
11
|
+
s.summary = 'Example: foreplay deploy production'
|
|
12
|
+
s.homepage = 'https://github.com/Xenapto/foreplay'
|
|
13
|
+
s.license = 'MIT'
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
s.files = `git ls-files`.split($RS).reject { |file| file =~ /^spec\// }
|
|
16
|
+
s.test_files = []
|
|
17
|
+
s.executables = s.files.grep(%r{^bin\/}) { |f| File.basename(f) }
|
|
18
|
+
s.require_paths = ['lib']
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1.9'
|
|
25
|
-
spec.add_development_dependency 'rake', '~> 10.4'
|
|
26
|
-
spec.add_development_dependency 'rspec', '~> 3.2'
|
|
27
|
-
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.2'
|
|
28
|
-
spec.add_development_dependency 'cucumber', '~> 2.0'
|
|
29
|
-
spec.add_development_dependency 'aruba', '~> 0.6'
|
|
30
|
-
spec.add_development_dependency 'gem-release', '~> 0.7'
|
|
31
|
-
spec.add_development_dependency 'simplecov', '~> 0.10'
|
|
32
|
-
spec.add_development_dependency 'coveralls', '~> 0.8'
|
|
33
|
-
spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4'
|
|
34
|
-
spec.add_development_dependency 'rubocop', '~> 0.30'
|
|
35
|
-
spec.add_development_dependency 'listen', '~> 3.0', '< 3.1' # Dependency of guard, 3.1 requires Ruby 2.2+
|
|
36
|
-
spec.add_development_dependency 'guard', '~> 2'
|
|
37
|
-
spec.add_development_dependency 'guard-rspec', '~> 4'
|
|
38
|
-
spec.add_development_dependency 'guard-rubocop', '~> 1.2'
|
|
39
|
-
spec.add_development_dependency 'guard-cucumber', '~> 1.6'
|
|
20
|
+
s.add_runtime_dependency 'foreman', '>= 0.76', '< 1.0'
|
|
21
|
+
s.add_runtime_dependency 'ssh-shell', '>= 0.4', '< 1.0'
|
|
22
|
+
s.add_runtime_dependency 'activesupport', '>= 3.2', '< 5.0'
|
|
40
23
|
end
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
commentary: 'If you have a .rvmrc file there may be a delay now while we install a new ruby'
|
|
15
15
|
- command: 'if [ -f .ruby-version ] ; then rvm install `cat .ruby-version` ; else echo "No .ruby-version file found" ; fi'
|
|
16
16
|
commentary: 'If you have a .ruby-version file there may be a delay now while we install a new ruby'
|
|
17
|
-
- command: 'env'
|
|
17
|
+
- command: 'if [ <%= instructions.key?("verbose") ? "1" : "" %> ] ; then env ; fi'
|
|
18
18
|
commentary: 'Showing environment variables'
|
|
19
|
-
- command: 'rvm rvmrc load && rvm info'
|
|
19
|
+
- command: 'if [ <%= instructions.key?("verbose") ? "1" : "" %> ] ; then rvm rvmrc load && rvm info ; fi'
|
|
20
20
|
commentary: 'Showing RVM environment'
|
|
21
21
|
- key: 'env'
|
|
22
22
|
delimiter: '='
|
|
@@ -56,6 +56,8 @@
|
|
|
56
56
|
commentary: 'Using bundler to install the required gems in deployment mode'
|
|
57
57
|
- command: 'mkdir -p ../cache/vendor && rsync -aW --no-compress --delete --info=STATS1 vendor/bundle/ ../cache/vendor/bundle'
|
|
58
58
|
commentary: 'Caching bundle'
|
|
59
|
+
- command: "if [ <%= instructions['config'].include?('stop_first') ? '1' : '' %> ] ; then sudo stop <%= former_service %> || echo 'No previous instance running' ; fi"
|
|
60
|
+
commentary: 'Stopping the previous instance'
|
|
59
61
|
- command: 'if [ -f public/assets/manifest.yml ] ; then echo "Not precompiling assets" ; else RAILS_ENV=<%= environment %> /usr/bin/bundle exec foreman run rake assets:precompile ; fi'
|
|
60
62
|
commentary: 'Precompiling assets unless they were supplied'
|
|
61
63
|
- command: 'sudo /usr/bin/bundle exec foreman export upstart<%= concurrency %> /etc/init'
|
data/lib/foreplay/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreplay
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.16.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Xenapto
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-10-
|
|
11
|
+
date: 2016-10-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: foreman
|
|
@@ -70,236 +70,6 @@ dependencies:
|
|
|
70
70
|
- - "<"
|
|
71
71
|
- !ruby/object:Gem::Version
|
|
72
72
|
version: '5.0'
|
|
73
|
-
- !ruby/object:Gem::Dependency
|
|
74
|
-
name: bundler
|
|
75
|
-
requirement: !ruby/object:Gem::Requirement
|
|
76
|
-
requirements:
|
|
77
|
-
- - "~>"
|
|
78
|
-
- !ruby/object:Gem::Version
|
|
79
|
-
version: '1.9'
|
|
80
|
-
type: :development
|
|
81
|
-
prerelease: false
|
|
82
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
83
|
-
requirements:
|
|
84
|
-
- - "~>"
|
|
85
|
-
- !ruby/object:Gem::Version
|
|
86
|
-
version: '1.9'
|
|
87
|
-
- !ruby/object:Gem::Dependency
|
|
88
|
-
name: rake
|
|
89
|
-
requirement: !ruby/object:Gem::Requirement
|
|
90
|
-
requirements:
|
|
91
|
-
- - "~>"
|
|
92
|
-
- !ruby/object:Gem::Version
|
|
93
|
-
version: '10.4'
|
|
94
|
-
type: :development
|
|
95
|
-
prerelease: false
|
|
96
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
97
|
-
requirements:
|
|
98
|
-
- - "~>"
|
|
99
|
-
- !ruby/object:Gem::Version
|
|
100
|
-
version: '10.4'
|
|
101
|
-
- !ruby/object:Gem::Dependency
|
|
102
|
-
name: rspec
|
|
103
|
-
requirement: !ruby/object:Gem::Requirement
|
|
104
|
-
requirements:
|
|
105
|
-
- - "~>"
|
|
106
|
-
- !ruby/object:Gem::Version
|
|
107
|
-
version: '3.2'
|
|
108
|
-
type: :development
|
|
109
|
-
prerelease: false
|
|
110
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
111
|
-
requirements:
|
|
112
|
-
- - "~>"
|
|
113
|
-
- !ruby/object:Gem::Version
|
|
114
|
-
version: '3.2'
|
|
115
|
-
- !ruby/object:Gem::Dependency
|
|
116
|
-
name: rspec_junit_formatter
|
|
117
|
-
requirement: !ruby/object:Gem::Requirement
|
|
118
|
-
requirements:
|
|
119
|
-
- - "~>"
|
|
120
|
-
- !ruby/object:Gem::Version
|
|
121
|
-
version: '0.2'
|
|
122
|
-
type: :development
|
|
123
|
-
prerelease: false
|
|
124
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
125
|
-
requirements:
|
|
126
|
-
- - "~>"
|
|
127
|
-
- !ruby/object:Gem::Version
|
|
128
|
-
version: '0.2'
|
|
129
|
-
- !ruby/object:Gem::Dependency
|
|
130
|
-
name: cucumber
|
|
131
|
-
requirement: !ruby/object:Gem::Requirement
|
|
132
|
-
requirements:
|
|
133
|
-
- - "~>"
|
|
134
|
-
- !ruby/object:Gem::Version
|
|
135
|
-
version: '2.0'
|
|
136
|
-
type: :development
|
|
137
|
-
prerelease: false
|
|
138
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
139
|
-
requirements:
|
|
140
|
-
- - "~>"
|
|
141
|
-
- !ruby/object:Gem::Version
|
|
142
|
-
version: '2.0'
|
|
143
|
-
- !ruby/object:Gem::Dependency
|
|
144
|
-
name: aruba
|
|
145
|
-
requirement: !ruby/object:Gem::Requirement
|
|
146
|
-
requirements:
|
|
147
|
-
- - "~>"
|
|
148
|
-
- !ruby/object:Gem::Version
|
|
149
|
-
version: '0.6'
|
|
150
|
-
type: :development
|
|
151
|
-
prerelease: false
|
|
152
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
-
requirements:
|
|
154
|
-
- - "~>"
|
|
155
|
-
- !ruby/object:Gem::Version
|
|
156
|
-
version: '0.6'
|
|
157
|
-
- !ruby/object:Gem::Dependency
|
|
158
|
-
name: gem-release
|
|
159
|
-
requirement: !ruby/object:Gem::Requirement
|
|
160
|
-
requirements:
|
|
161
|
-
- - "~>"
|
|
162
|
-
- !ruby/object:Gem::Version
|
|
163
|
-
version: '0.7'
|
|
164
|
-
type: :development
|
|
165
|
-
prerelease: false
|
|
166
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
167
|
-
requirements:
|
|
168
|
-
- - "~>"
|
|
169
|
-
- !ruby/object:Gem::Version
|
|
170
|
-
version: '0.7'
|
|
171
|
-
- !ruby/object:Gem::Dependency
|
|
172
|
-
name: simplecov
|
|
173
|
-
requirement: !ruby/object:Gem::Requirement
|
|
174
|
-
requirements:
|
|
175
|
-
- - "~>"
|
|
176
|
-
- !ruby/object:Gem::Version
|
|
177
|
-
version: '0.10'
|
|
178
|
-
type: :development
|
|
179
|
-
prerelease: false
|
|
180
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
181
|
-
requirements:
|
|
182
|
-
- - "~>"
|
|
183
|
-
- !ruby/object:Gem::Version
|
|
184
|
-
version: '0.10'
|
|
185
|
-
- !ruby/object:Gem::Dependency
|
|
186
|
-
name: coveralls
|
|
187
|
-
requirement: !ruby/object:Gem::Requirement
|
|
188
|
-
requirements:
|
|
189
|
-
- - "~>"
|
|
190
|
-
- !ruby/object:Gem::Version
|
|
191
|
-
version: '0.8'
|
|
192
|
-
type: :development
|
|
193
|
-
prerelease: false
|
|
194
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
195
|
-
requirements:
|
|
196
|
-
- - "~>"
|
|
197
|
-
- !ruby/object:Gem::Version
|
|
198
|
-
version: '0.8'
|
|
199
|
-
- !ruby/object:Gem::Dependency
|
|
200
|
-
name: codeclimate-test-reporter
|
|
201
|
-
requirement: !ruby/object:Gem::Requirement
|
|
202
|
-
requirements:
|
|
203
|
-
- - "~>"
|
|
204
|
-
- !ruby/object:Gem::Version
|
|
205
|
-
version: '0.4'
|
|
206
|
-
type: :development
|
|
207
|
-
prerelease: false
|
|
208
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
209
|
-
requirements:
|
|
210
|
-
- - "~>"
|
|
211
|
-
- !ruby/object:Gem::Version
|
|
212
|
-
version: '0.4'
|
|
213
|
-
- !ruby/object:Gem::Dependency
|
|
214
|
-
name: rubocop
|
|
215
|
-
requirement: !ruby/object:Gem::Requirement
|
|
216
|
-
requirements:
|
|
217
|
-
- - "~>"
|
|
218
|
-
- !ruby/object:Gem::Version
|
|
219
|
-
version: '0.30'
|
|
220
|
-
type: :development
|
|
221
|
-
prerelease: false
|
|
222
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
223
|
-
requirements:
|
|
224
|
-
- - "~>"
|
|
225
|
-
- !ruby/object:Gem::Version
|
|
226
|
-
version: '0.30'
|
|
227
|
-
- !ruby/object:Gem::Dependency
|
|
228
|
-
name: listen
|
|
229
|
-
requirement: !ruby/object:Gem::Requirement
|
|
230
|
-
requirements:
|
|
231
|
-
- - "~>"
|
|
232
|
-
- !ruby/object:Gem::Version
|
|
233
|
-
version: '3.0'
|
|
234
|
-
- - "<"
|
|
235
|
-
- !ruby/object:Gem::Version
|
|
236
|
-
version: '3.1'
|
|
237
|
-
type: :development
|
|
238
|
-
prerelease: false
|
|
239
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
240
|
-
requirements:
|
|
241
|
-
- - "~>"
|
|
242
|
-
- !ruby/object:Gem::Version
|
|
243
|
-
version: '3.0'
|
|
244
|
-
- - "<"
|
|
245
|
-
- !ruby/object:Gem::Version
|
|
246
|
-
version: '3.1'
|
|
247
|
-
- !ruby/object:Gem::Dependency
|
|
248
|
-
name: guard
|
|
249
|
-
requirement: !ruby/object:Gem::Requirement
|
|
250
|
-
requirements:
|
|
251
|
-
- - "~>"
|
|
252
|
-
- !ruby/object:Gem::Version
|
|
253
|
-
version: '2'
|
|
254
|
-
type: :development
|
|
255
|
-
prerelease: false
|
|
256
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
257
|
-
requirements:
|
|
258
|
-
- - "~>"
|
|
259
|
-
- !ruby/object:Gem::Version
|
|
260
|
-
version: '2'
|
|
261
|
-
- !ruby/object:Gem::Dependency
|
|
262
|
-
name: guard-rspec
|
|
263
|
-
requirement: !ruby/object:Gem::Requirement
|
|
264
|
-
requirements:
|
|
265
|
-
- - "~>"
|
|
266
|
-
- !ruby/object:Gem::Version
|
|
267
|
-
version: '4'
|
|
268
|
-
type: :development
|
|
269
|
-
prerelease: false
|
|
270
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
271
|
-
requirements:
|
|
272
|
-
- - "~>"
|
|
273
|
-
- !ruby/object:Gem::Version
|
|
274
|
-
version: '4'
|
|
275
|
-
- !ruby/object:Gem::Dependency
|
|
276
|
-
name: guard-rubocop
|
|
277
|
-
requirement: !ruby/object:Gem::Requirement
|
|
278
|
-
requirements:
|
|
279
|
-
- - "~>"
|
|
280
|
-
- !ruby/object:Gem::Version
|
|
281
|
-
version: '1.2'
|
|
282
|
-
type: :development
|
|
283
|
-
prerelease: false
|
|
284
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
285
|
-
requirements:
|
|
286
|
-
- - "~>"
|
|
287
|
-
- !ruby/object:Gem::Version
|
|
288
|
-
version: '1.2'
|
|
289
|
-
- !ruby/object:Gem::Dependency
|
|
290
|
-
name: guard-cucumber
|
|
291
|
-
requirement: !ruby/object:Gem::Requirement
|
|
292
|
-
requirements:
|
|
293
|
-
- - "~>"
|
|
294
|
-
- !ruby/object:Gem::Version
|
|
295
|
-
version: '1.6'
|
|
296
|
-
type: :development
|
|
297
|
-
prerelease: false
|
|
298
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
299
|
-
requirements:
|
|
300
|
-
- - "~>"
|
|
301
|
-
- !ruby/object:Gem::Version
|
|
302
|
-
version: '1.6'
|
|
303
73
|
description: Deploying Rails projects to Ubuntu using Foreman
|
|
304
74
|
email:
|
|
305
75
|
- developers@xenapto.com
|
|
@@ -313,11 +83,13 @@ files:
|
|
|
313
83
|
- ".rspec"
|
|
314
84
|
- ".rubocop.yml"
|
|
315
85
|
- Gemfile
|
|
86
|
+
- Gemfile.local.example
|
|
316
87
|
- Guardfile
|
|
317
88
|
- LICENSE.txt
|
|
318
89
|
- README.md
|
|
319
90
|
- Rakefile
|
|
320
91
|
- bin/foreplay
|
|
92
|
+
- circle.yml
|
|
321
93
|
- features/check.feature
|
|
322
94
|
- features/deploy.feature
|
|
323
95
|
- features/setup.feature
|
|
@@ -342,12 +114,6 @@ files:
|
|
|
342
114
|
- lib/foreplay/setup.rb
|
|
343
115
|
- lib/foreplay/setup/foreplay.template.yml
|
|
344
116
|
- lib/foreplay/version.rb
|
|
345
|
-
- spec/lib/foreplay/deploy_spec.rb
|
|
346
|
-
- spec/lib/foreplay/secrets_spec.rb
|
|
347
|
-
- spec/lib/foreplay/setup_spec.rb
|
|
348
|
-
- spec/lib/hash_spec.rb
|
|
349
|
-
- spec/lib/yaml_spec.rb
|
|
350
|
-
- spec/spec_helper.rb
|
|
351
117
|
homepage: https://github.com/Xenapto/foreplay
|
|
352
118
|
licenses:
|
|
353
119
|
- MIT
|
|
@@ -372,14 +138,4 @@ rubygems_version: 2.6.7
|
|
|
372
138
|
signing_key:
|
|
373
139
|
specification_version: 4
|
|
374
140
|
summary: 'Example: foreplay deploy production'
|
|
375
|
-
test_files:
|
|
376
|
-
- features/check.feature
|
|
377
|
-
- features/deploy.feature
|
|
378
|
-
- features/setup.feature
|
|
379
|
-
- features/support/env.rb
|
|
380
|
-
- spec/lib/foreplay/deploy_spec.rb
|
|
381
|
-
- spec/lib/foreplay/secrets_spec.rb
|
|
382
|
-
- spec/lib/foreplay/setup_spec.rb
|
|
383
|
-
- spec/lib/hash_spec.rb
|
|
384
|
-
- spec/lib/yaml_spec.rb
|
|
385
|
-
- spec/spec_helper.rb
|
|
141
|
+
test_files: []
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
require 'net/ssh/shell'
|
|
2
|
-
|
|
3
|
-
describe Foreplay::Launcher do
|
|
4
|
-
let(:session) { double(Net::SSH::Connection::Session) }
|
|
5
|
-
let(:shell) { double(Net::SSH::Shell) }
|
|
6
|
-
let(:process) { double(Net::SSH::Shell::Process) }
|
|
7
|
-
|
|
8
|
-
before :each do
|
|
9
|
-
# Setup foreplay
|
|
10
|
-
`rm -f config/foreplay.yml`
|
|
11
|
-
command = 'foreplay setup '\
|
|
12
|
-
'-r git@github.com:Xenapto/foreplay.git '\
|
|
13
|
-
'-s web1.example.com web2.example.com '\
|
|
14
|
-
'-f apps/%a '\
|
|
15
|
-
'-u fred '\
|
|
16
|
-
'--password trollope'
|
|
17
|
-
`#{command}`
|
|
18
|
-
|
|
19
|
-
# Stub all the things
|
|
20
|
-
allow(Net::SSH).to receive(:start).and_return(session)
|
|
21
|
-
allow(session).to receive(:close)
|
|
22
|
-
allow(session).to receive(:shell).and_yield(shell)
|
|
23
|
-
allow(shell).to receive(:execute).and_return(process)
|
|
24
|
-
allow(shell).to receive(:wait!).and_return(false)
|
|
25
|
-
allow(process).to receive(:on_output).and_yield(process, "output message 1\noutput message 2\n")
|
|
26
|
-
allow(process).to receive(:exit_status).and_return(0)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "complains on check if there's no config file" do
|
|
30
|
-
`rm -f config/foreplay.yml`
|
|
31
|
-
expect { Foreplay::Launcher.start([:check, 'production', '']) }
|
|
32
|
-
.to raise_error(RuntimeError, /.*Please run foreplay setup or create the file manually.*/)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "complains on deploy if there's no config file" do
|
|
36
|
-
`rm -f config/foreplay.yml`
|
|
37
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }
|
|
38
|
-
.to raise_error(RuntimeError, /.*Please run foreplay setup or create the file manually.*/)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
it 'complains on check if the config file is not valid YAML' do
|
|
42
|
-
`echo %*:*: > config/foreplay.yml`
|
|
43
|
-
expect { Foreplay::Launcher.start([:check, 'production', '']) }
|
|
44
|
-
.to raise_error(RuntimeError, /.*Please run foreplay setup or edit the file manually.*/)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it 'complains on deploy if the config file is not valid YAML' do
|
|
48
|
-
`echo %*:*: > config/foreplay.yml`
|
|
49
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }
|
|
50
|
-
.to raise_error(RuntimeError, /.*Please run foreplay setup or edit the file manually.*/)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it 'complains if there are no authentication methods defined in the config file' do
|
|
54
|
-
command = 'foreplay setup '\
|
|
55
|
-
'-r git@github.com:Xenapto/foreplay.git '\
|
|
56
|
-
'-s web.example.com '\
|
|
57
|
-
'-f apps/%a '\
|
|
58
|
-
'-u fred '\
|
|
59
|
-
'--password ""'
|
|
60
|
-
|
|
61
|
-
match = 'No authentication methods supplied. '\
|
|
62
|
-
'You must supply a private key, key file or password in the configuration file.'
|
|
63
|
-
|
|
64
|
-
`rm -f config/foreplay.yml`
|
|
65
|
-
`#{command}`
|
|
66
|
-
|
|
67
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }
|
|
68
|
-
.to raise_error(
|
|
69
|
-
RuntimeError,
|
|
70
|
-
/.*#{Regexp.quote(match)}*/
|
|
71
|
-
)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
it "complains if the private keyfile defined in the config file doesn't exist" do
|
|
75
|
-
command = 'foreplay setup '\
|
|
76
|
-
'-r git@github.com:Xenapto/foreplay.git '\
|
|
77
|
-
'-s web.example.com '\
|
|
78
|
-
'-f apps/%a '\
|
|
79
|
-
'-u fred '\
|
|
80
|
-
'--keyfile "/home/fred/no-such-file"'
|
|
81
|
-
|
|
82
|
-
`rm -f config/foreplay.yml`
|
|
83
|
-
`#{command}`
|
|
84
|
-
|
|
85
|
-
# Exact error message text is Ruby version dependent
|
|
86
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }
|
|
87
|
-
.to raise_error(Errno::ENOENT, %r{.*No such file or directory.+/home/fred/no-such-file.*})
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it 'complains if a mandatory key is missing from the config file' do
|
|
91
|
-
`sed -i 's/path:/pxth:/' config/foreplay.yml`
|
|
92
|
-
|
|
93
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }
|
|
94
|
-
.to raise_error(
|
|
95
|
-
RuntimeError,
|
|
96
|
-
/.*Required key path not found in instructions for production environment.*/
|
|
97
|
-
)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it 'complains if we try to deploy an environment that isn\'t defined' do
|
|
101
|
-
expect { Foreplay::Launcher.start([:deploy, 'unknown', '']) }
|
|
102
|
-
.to raise_error(
|
|
103
|
-
RuntimeError,
|
|
104
|
-
/.*No deployment configuration defined for unknown environment.*/
|
|
105
|
-
)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
it 'terminates if a remote process exits with a non-zero status' do
|
|
109
|
-
allow(process).to receive(:exit_status).and_return(1)
|
|
110
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }.to raise_error(RuntimeError, /.*output message.*/)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
it "terminates if a connection can't be established with the remote server" do
|
|
114
|
-
allow(Net::SSH).to receive(:start).and_call_original
|
|
115
|
-
expect { Foreplay::Launcher.start([:deploy, 'production', '']) }
|
|
116
|
-
.to raise_error(RuntimeError, /.*There was a problem starting an ssh session on web1.example.com.*/)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it 'checks the config' do
|
|
120
|
-
expect($stdout).to receive(:puts).at_least(:once)
|
|
121
|
-
Foreplay::Launcher.start [:check, 'production', '']
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it 'deploys to the environment' do
|
|
125
|
-
secret_data = { 'BIG_SECRET' => '123', 'MOUSTACHE' => '{{moustache}}' }
|
|
126
|
-
secrets = double(Foreplay::Engine::Secrets)
|
|
127
|
-
allow(secrets).to receive(:fetch).and_return(secret_data)
|
|
128
|
-
allow(Foreplay::Engine::Secrets).to receive(:new).and_return(secrets)
|
|
129
|
-
|
|
130
|
-
expect(Net::SSH)
|
|
131
|
-
.to(receive(:start))
|
|
132
|
-
.with(/web[12].example.com/, 'fred', verbose: :warn, port: 22, password: 'trollope')
|
|
133
|
-
.exactly(4).times
|
|
134
|
-
.and_return(session)
|
|
135
|
-
|
|
136
|
-
[
|
|
137
|
-
"echo Foreplay version #{Foreplay::VERSION}",
|
|
138
|
-
'mkdir -p apps/foreplay && cd apps/foreplay && rm -rf 50000 && '\
|
|
139
|
-
'git clone -b master git@github.com:Xenapto/foreplay.git 50000',
|
|
140
|
-
'rvm rvmrc trust 50000',
|
|
141
|
-
'rvm rvmrc warning ignore 50000',
|
|
142
|
-
'gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys D39DC0E3',
|
|
143
|
-
'cd 50000 && mkdir -p tmp doc log config',
|
|
144
|
-
'rvm rvmrc load && rvm info',
|
|
145
|
-
'if [ -f .ruby-version ] ; then rvm install `cat .ruby-version` ; else echo "No .ruby-version file found" ; fi',
|
|
146
|
-
'echo "BIG_SECRET=123" > .env',
|
|
147
|
-
'echo "MOUSTACHE={{moustache}}" >> .env',
|
|
148
|
-
'echo "HOME=$HOME" >> .env',
|
|
149
|
-
'echo "SHELL=$SHELL" >> .env',
|
|
150
|
-
'echo "PATH=$PATH:`which bundle`" >> .env',
|
|
151
|
-
'echo "GEM_HOME=$HOME/.rvm/gems/`rvm tools identifier`" >> .env',
|
|
152
|
-
'echo "RAILS_ENV=production" >> .env',
|
|
153
|
-
'echo "---" > config/application.yml',
|
|
154
|
-
'echo "production:" >> config/application.yml',
|
|
155
|
-
'echo " BIG_SECRET: \'123\'" >> config/application.yml',
|
|
156
|
-
'echo " MOUSTACHE: \"{{moustache}}\"" >> config/application.yml',
|
|
157
|
-
'echo "---" > .foreman',
|
|
158
|
-
'echo "concurrency: web=1,worker=0,scheduler=0" >> .foreman',
|
|
159
|
-
'echo "app: foreplay-50000" >> .foreman',
|
|
160
|
-
'echo "port: 50000" >> .foreman',
|
|
161
|
-
'echo "user: fred" >> .foreman',
|
|
162
|
-
'echo "---" > config/database.yml',
|
|
163
|
-
'echo "production:" >> config/database.yml',
|
|
164
|
-
'echo " adapter: postgresql" >> config/database.yml',
|
|
165
|
-
'echo " encoding: utf8" >> config/database.yml',
|
|
166
|
-
'echo " database: TODO Put the database name here" >> config/database.yml',
|
|
167
|
-
'echo " pool: 5" >> config/database.yml',
|
|
168
|
-
'echo " host: TODO Put here the database host name" >> config/database.yml',
|
|
169
|
-
'echo " username: TODO Put here the database user" >> config/database.yml',
|
|
170
|
-
'echo " password: TODO Put here the database user\'s password" >> config/database.yml',
|
|
171
|
-
'if [ -d ../cache/vendor/bundle ] ; then '\
|
|
172
|
-
'rsync -aW --no-compress --delete --info=STATS1 ../cache/vendor/bundle/ vendor/bundle'\
|
|
173
|
-
' ; else echo No bundle to restore ; fi',
|
|
174
|
-
'gem install bundler -v "> 1.8"',
|
|
175
|
-
'sudo ln -f `which bundle` /usr/bin/bundle || echo Using default version of bundle',
|
|
176
|
-
'/usr/bin/bundle install --deployment --clean --full-index --jobs 2 --without development test',
|
|
177
|
-
'mkdir -p ../cache/vendor && '\
|
|
178
|
-
'rsync -aW --no-compress --delete --info=STATS1 vendor/bundle/ ../cache/vendor/bundle',
|
|
179
|
-
'if [ -f public/assets/manifest.yml ] ; then echo "Not precompiling assets"'\
|
|
180
|
-
' ; else RAILS_ENV=production /usr/bin/bundle exec foreman run rake assets:precompile ; fi',
|
|
181
|
-
'sudo /usr/bin/bundle exec foreman export upstart -m web=1,worker=0,scheduler=0 /etc/init',
|
|
182
|
-
'sudo start foreplay-50000 || sudo restart foreplay-50000',
|
|
183
|
-
'mkdir -p .foreplay/foreplay && touch .foreplay/foreplay/current_port && cat .foreplay/foreplay/current_port',
|
|
184
|
-
'echo 50000 > $HOME/.foreplay/foreplay/current_port',
|
|
185
|
-
'sleep 60',
|
|
186
|
-
'sudo stop foreplay-51000 || echo \'No previous instance running\''
|
|
187
|
-
].each do |command|
|
|
188
|
-
expect(shell).to receive(:execute).with(command).and_return(process)
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
Foreplay::Launcher.start [:deploy, 'production', '']
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
it "uses another port if there's already an installed instance" do
|
|
195
|
-
allow(process).to receive(:on_output).and_yield(process, "50000\n")
|
|
196
|
-
expect(shell).to receive(:execute).with('echo 51000 > $HOME/.foreplay/foreplay/current_port').and_return(process)
|
|
197
|
-
Foreplay::Launcher.start [:deploy, 'production', '']
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
it 'uses the private key provided in the config file' do
|
|
201
|
-
command = 'foreplay setup '\
|
|
202
|
-
'-r git@github.com:Xenapto/foreplay.git '\
|
|
203
|
-
'-s web.example.com '\
|
|
204
|
-
'-f apps/%a '\
|
|
205
|
-
'-u fred '\
|
|
206
|
-
'-k "top secret private key"'
|
|
207
|
-
|
|
208
|
-
`rm -f config/foreplay.yml`
|
|
209
|
-
`#{command}`
|
|
210
|
-
Foreplay::Launcher.start([:deploy, 'production', ''])
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
it 'adds Redis details for Resque' do
|
|
214
|
-
command = 'foreplay setup '\
|
|
215
|
-
'-r git@github.com:Xenapto/foreplay.git '\
|
|
216
|
-
'-s web.example.com '\
|
|
217
|
-
'-f apps/%a '\
|
|
218
|
-
'-u fred '\
|
|
219
|
-
'--resque-redis "redis://localhost:6379"'
|
|
220
|
-
|
|
221
|
-
`rm -f config/foreplay.yml`
|
|
222
|
-
`#{command}`
|
|
223
|
-
Foreplay::Launcher.start([:deploy, 'production', ''])
|
|
224
|
-
end
|
|
225
|
-
end
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
describe Foreplay::Engine::Secrets do
|
|
2
|
-
context '#fetch' do
|
|
3
|
-
it 'returns nil if there is no secret location' do
|
|
4
|
-
expect(Foreplay::Engine::Secrets.new('x', nil).fetch).to be_nil
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
it 'fails if the secret location is not a hash' do
|
|
8
|
-
expect { Foreplay::Engine::Secrets.new('x', 'y').fetch } .to raise_error(NoMethodError)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it 'returns an empty hash if the secret location has no url' do
|
|
12
|
-
expect(Foreplay::Engine::Secrets.new('x', []).fetch).to eq({})
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it 'returns an empty hash if the secret location does not return valid YAML' do
|
|
16
|
-
expect(Foreplay::Engine::Secrets.new('x', [{ 'url' => 'http://iana.org' }]).fetch).to eq({})
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it 'returns an empty hash if the secret location does not exist' do
|
|
20
|
-
expect(Foreplay::Engine::Secrets.new('x', [{ 'url' => 'http://iana.org/404' }]).fetch).to eq({})
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
context '#fetch successful' do
|
|
25
|
-
let(:secrets) { { 'a' => 'x', 'b' => 'y', 'c' => 'z' } }
|
|
26
|
-
let(:secret) { Foreplay::Engine::Secrets.new('', ['x']) }
|
|
27
|
-
|
|
28
|
-
before :each do
|
|
29
|
-
allow(secret).to receive(:location_secrets).and_return(secrets)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it 'does what it is told' do
|
|
33
|
-
expect(secret.location_secrets).to eq(secrets)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it 'returns a hash of secrets' do
|
|
37
|
-
expect(secret.fetch).to eq(secrets)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
context '#fetch successful with merge' do
|
|
42
|
-
let(:secrets1) { { 'a' => 'x', 'b' => 'f' } }
|
|
43
|
-
let(:secrets2) { { 'b' => 'y', 'c' => 'z' } }
|
|
44
|
-
let(:secrets) { { 'a' => 'x', 'b' => 'y', 'c' => 'z' } }
|
|
45
|
-
let(:secret) { Foreplay::Engine::Secrets.new('', %w(x x)) }
|
|
46
|
-
|
|
47
|
-
before :each do
|
|
48
|
-
allow(secret).to receive(:location_secrets).and_return(secrets1, secrets2)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
it 'returns a hash of secrets' do
|
|
52
|
-
expect(secret.fetch).to eq(secrets)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
context 'Location returns a hash if one is found' do
|
|
57
|
-
let(:location) { Foreplay::Engine::Secrets::Location.new('', 'p') }
|
|
58
|
-
let(:secrets) { { 'p' => { 'a' => 'x', 'b' => 'y', 'c' => 'z' }, 'q' => 'zzz', 'r' => { 'd' => 1 } } }
|
|
59
|
-
|
|
60
|
-
before { allow(location).to receive(:all_secrets).and_return(secrets) }
|
|
61
|
-
|
|
62
|
-
it 'returns the secrets for the right environment' do
|
|
63
|
-
expect(location.secrets).to eq(secrets['p'])
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
data/spec/lib/hash_spec.rb
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
describe Hash do
|
|
2
|
-
context '#supermerge' do
|
|
3
|
-
it 'should complain unless two hashes are passed to it' do
|
|
4
|
-
expect { {}.supermerge('y') }.to raise_error(RuntimeError)
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
it 'should merge two simple hashes' do
|
|
8
|
-
expect({ a: 'x' }.supermerge(b: 'y')).to eq(a: 'x', b: 'y')
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it 'should merge two hashes both with arrays at the same key' do
|
|
12
|
-
expect({ a: ['x'] }.supermerge(a: ['y'])).to eq(a: %w(x y))
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it 'should merge an array and a value at the same key' do
|
|
16
|
-
expect({ a: 'x' }.supermerge(a: ['y'])).to eq(a: %w(x y))
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it 'should replace a value at the same key' do
|
|
20
|
-
expect({ a: 'x' }.supermerge(a: 'y')).to eq(a: 'y')
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it 'should merge two subhashes at the same key' do
|
|
24
|
-
expect({ a: { b: 'x' } }.supermerge(a: { c: 'y' })).to eq(a: { b: 'x', c: 'y' })
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
data/spec/lib/yaml_spec.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
describe YAML do
|
|
2
|
-
context '#escape' do
|
|
3
|
-
it 'uses the expected Ruby version' do
|
|
4
|
-
expect(RUBY_VERSION).to eq '2.1.9'
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
it 'uses the expected YAML version' do
|
|
8
|
-
expect(YAML::VERSION).to eq '2.0.5' # The escaping below changes with different YAML versions
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it 'correctly escape a basic string' do
|
|
12
|
-
expect(YAML.escape('brian')).to eq('brian')
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it 'correctly escape a troublesome string' do
|
|
16
|
-
expect(YAML.escape('{{moustache}} beard')).to eq('"{{moustache}} beard"')
|
|
17
|
-
expect(YAML.escape("Brian O'Brien")).to eq("Brian O'Brien")
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# CodeClimate code coverage reporting
|
|
2
|
-
require 'codeclimate-test-reporter'
|
|
3
|
-
CodeClimate::TestReporter.start
|
|
4
|
-
|
|
5
|
-
unless ENV['NO_SIMPLECOV']
|
|
6
|
-
require 'simplecov'
|
|
7
|
-
require 'coveralls'
|
|
8
|
-
|
|
9
|
-
if ENV['CIRCLE_ARTIFACTS']
|
|
10
|
-
dir = File.join('..', '..', '..', ENV['CIRCLE_ARTIFACTS'], 'coverage')
|
|
11
|
-
SimpleCov.coverage_dir(dir)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
SimpleCov.start
|
|
15
|
-
Coveralls.wear!('rails') if ENV['COVERALLS_REPO_TOKEN']
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
require 'foreplay'
|
|
19
|
-
|
|
20
|
-
RSpec.configure do |config|
|
|
21
|
-
# Run specs in random order to surface order dependencies. If you find an
|
|
22
|
-
# order dependency and want to debug it, you can fix the order by providing
|
|
23
|
-
# the seed, which is printed after each run.
|
|
24
|
-
# --seed 1234
|
|
25
|
-
config.order = 'random'
|
|
26
|
-
|
|
27
|
-
# Manually-added
|
|
28
|
-
config.tty = true
|
|
29
|
-
end
|