ruby_yacht 0.6.1 → 0.7.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/Gemfile.lock +1 -1
- data/README.md +7 -5
- data/doc/TODO.md +1 -5
- data/doc/configuration.md +51 -0
- data/doc/plugins.md +4 -0
- data/lib/ruby_yacht/dsl/configuration.rb +26 -1
- data/lib/ruby_yacht/dsl/dsl.rb +35 -3
- data/lib/ruby_yacht/dsl/hook.rb +4 -0
- data/lib/ruby_yacht/dsl/project.rb +11 -0
- data/lib/ruby_yacht/images/app/Dockerfile.erb +2 -1
- data/lib/ruby_yacht/images/app/checkout.bash +1 -1
- data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +7 -1
- data/lib/ruby_yacht/images/database/Dockerfile.erb +3 -1
- data/lib/ruby_yacht/images/database/checkout.bash +3 -4
- data/lib/ruby_yacht/images/web/Dockerfile.erb +2 -0
- data/lib/ruby_yacht/plugins/nginx.rb +5 -0
- data/lib/ruby_yacht/plugins/rails/scripts/load_seeds.rb +10 -1
- data/lib/ruby_yacht/plugins/rails/scripts/prepare_rails_for_launch.rb +1 -1
- data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +6 -4
- data/lib/ruby_yacht/plugins/rails.rb +30 -17
- data/lib/ruby_yacht/plugins.rb +1 -1
- data/lib/ruby_yacht/runner/build_images.rb +5 -7
- data/lib/ruby_yacht/runner/run_containers.rb +1 -2
- data/ruby_yacht.gemspec +2 -2
- data/spec/docker/run.bash +4 -0
- data/spec/dsl/configuration_spec.rb +29 -0
- data/spec/dsl/dsl_spec.rb +56 -0
- data/spec/dsl/hook_spec.rb +28 -5
- data/spec/dsl/project_spec.rb +46 -0
- data/spec/dsl/server_type_spec.rb +3 -0
- data/spec/fixtures/app-dependencies-dockerfile-generic +3 -1
- data/spec/fixtures/app-dependencies-dockerfile-generic-with-library-install +3 -1
- data/spec/fixtures/app-dependencies-dockerfile-rails +4 -3
- data/spec/fixtures/app-dependencies-dockerfile-rails-production +35 -0
- data/spec/fixtures/app-dependencies-dockerfile-with-https-repository +25 -0
- data/spec/fixtures/app-dependencies-dockerfile-with-no-repository +2 -0
- data/spec/fixtures/database-dockerfile +1 -1
- data/spec/fixtures/database-dockerfile-mysql +1 -1
- data/spec/fixtures/database-dockerfile-rails +2 -6
- data/spec/fixtures/database-dockerfile-rails-mysql +38 -0
- data/spec/fixtures/database-dockerfile-rails-with-no-repository +1 -3
- data/spec/fixtures/database-dockerfile-with-seed-hooks +1 -1
- data/spec/fixtures/local_config.yml +8 -0
- data/spec/fixtures/mars-dockerfile +0 -1
- data/spec/fixtures/mars-dockerfile-rails +0 -1
- data/spec/fixtures/mars-dockerfile-rails-with-no-repository +0 -1
- data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +0 -1
- data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +0 -1
- data/spec/fixtures/mars-dockerfile-with-custom-file-copy +0 -1
- data/spec/fixtures/mars-dockerfile-with-local-database +0 -1
- data/spec/fixtures/mars-dockerfile-with-no-repository +0 -1
- data/spec/fixtures/mars-dockerfile-with-remote-database +0 -1
- data/spec/fixtures/mars-startup-rails +1 -1
- data/spec/fixtures/mars-startup-rails-with-no-repository +1 -1
- data/spec/fixtures/web-dockerfile-nginx +3 -0
- data/spec/integration/01_normal_config_spec.rb +352 -0
- data/spec/integration/{create_new_project_spec.rb → 02_creating_new_project_spec.rb} +2 -2
- data/spec/integration/03_no_repository_spec.rb +56 -0
- data/spec/integration/04_no_database_spec.rb +58 -0
- data/spec/integration/05_https_repository_spec.rb +52 -0
- data/spec/integration/06_production_environment_spec.rb +72 -0
- data/spec/integration/07_local_checkout_spec.rb +52 -0
- data/spec/integration/08_multiple_projects_spec.rb +46 -0
- data/spec/integration/09_titular_app_spec.rb +53 -0
- data/spec/integration/10_misc_scenarios_spec.rb +97 -0
- data/spec/integration/run.rb +18 -2
- data/spec/plugins/rails_spec.rb +73 -16
- data/spec/runner/build_images_spec.rb +17 -1
- data/spec/runner/run_containers_spec.rb +3 -3
- data/spec/support/integration_helpers.rb +18 -4
- metadata +30 -20
- data/spec/integration/build_images_spec.rb +0 -210
- data/spec/integration/build_spec.rb +0 -23
- data/spec/integration/checkout_spec.rb +0 -94
- data/spec/integration/implode_spec.rb +0 -20
- data/spec/integration/run_containers_spec.rb +0 -279
- data/spec/integration/services_spec.rb +0 -99
- data/spec/integration/shell_spec.rb +0 -31
- data/spec/integration/update_hosts_spec.rb +0 -35
data/spec/integration/run.rb
CHANGED
@@ -1,10 +1,22 @@
|
|
1
1
|
require 'ruby_yacht'
|
2
2
|
|
3
|
+
RubyYacht.configure do
|
4
|
+
add_local_config File.join(File.dirname(__FILE__), '..', 'fixtures', 'local_config.yml')
|
5
|
+
end
|
6
|
+
|
3
7
|
RubyYacht.configure do
|
4
8
|
project :apollo do
|
5
9
|
system_prefix :apollo
|
6
10
|
repository 'github.com'
|
11
|
+
if ENV['HTTPS_REPOSITORY'] == '1'
|
12
|
+
repository_protocol :https
|
13
|
+
end
|
14
|
+
|
7
15
|
rails_secret_key_base 'c330d739b502b4c43f4a850c592798243c5e92b1828b4e1e69de764fbdf8e733e0165241c67a76f34a9a46b10d27960fa288149ac662ea6bd9408fdb766aea39'
|
16
|
+
|
17
|
+
if ENV['USE_LOCAL_CONFIG'] == '1'
|
18
|
+
copy_local_config :rails_environment
|
19
|
+
end
|
8
20
|
|
9
21
|
if ENV['CHECK_OUT_LOCALLY'] == '1'
|
10
22
|
check_out_locally
|
@@ -16,6 +28,10 @@ RubyYacht.configure do
|
|
16
28
|
password 'testpass'
|
17
29
|
host 'localhost'
|
18
30
|
|
31
|
+
if ENV['USE_LOCAL_CONFIG'] == '1'
|
32
|
+
copy_local_config :username, :password, :host, from: 'database'
|
33
|
+
end
|
34
|
+
|
19
35
|
if ENV['USE_NONSTANDARD_MYSQL_PORT'] == '1'
|
20
36
|
port 3333
|
21
37
|
end
|
@@ -51,12 +67,12 @@ RubyYacht.configure do
|
|
51
67
|
end
|
52
68
|
end
|
53
69
|
|
54
|
-
if ENV['USE_PRODUCTION_ENVIRONMENT']
|
70
|
+
if ENV['USE_PRODUCTION_ENVIRONMENT'] == '1'
|
55
71
|
rails_environment 'production'
|
56
72
|
rails_excluded_gem_groups %w(development test)
|
57
73
|
end
|
58
74
|
|
59
|
-
if ENV['CREATE_PRIMARY_APP']
|
75
|
+
if ENV['CREATE_PRIMARY_APP'] == '1'
|
60
76
|
primary_app :mars
|
61
77
|
end
|
62
78
|
end
|
data/spec/plugins/rails_spec.rb
CHANGED
@@ -16,6 +16,8 @@ describe RubyYacht::Plugins::Rails do
|
|
16
16
|
@database = RubyYacht::Database.new
|
17
17
|
@database.name = :test_db
|
18
18
|
@project.databases = [@database]
|
19
|
+
|
20
|
+
@project.web_servers = []
|
19
21
|
end
|
20
22
|
|
21
23
|
def configure_project(options = {})
|
@@ -68,21 +70,7 @@ describe RubyYacht::Plugins::Rails do
|
|
68
70
|
subject { RubyYacht::Runner::BuildImages.new }
|
69
71
|
include DockerCommandSpec
|
70
72
|
|
71
|
-
|
72
|
-
RubyYacht.configuration.clear
|
73
|
-
described_class.load
|
74
|
-
|
75
|
-
RubyYacht.configure do
|
76
|
-
server_type :sqlite do
|
77
|
-
container_type :database
|
78
|
-
baseline_image 'ubuntu'
|
79
|
-
end
|
80
|
-
server_type :nginx do
|
81
|
-
container_type :web
|
82
|
-
baseline_image 'ubuntu'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
73
|
+
def configure_project
|
86
74
|
RubyYacht.configure do
|
87
75
|
project :apollo do
|
88
76
|
system_prefix :apollo
|
@@ -112,6 +100,24 @@ describe RubyYacht::Plugins::Rails do
|
|
112
100
|
end
|
113
101
|
end
|
114
102
|
end
|
103
|
+
|
104
|
+
before do
|
105
|
+
RubyYacht.configuration.clear
|
106
|
+
described_class.load
|
107
|
+
|
108
|
+
RubyYacht.configure do
|
109
|
+
server_type :sqlite do
|
110
|
+
container_type :database
|
111
|
+
baseline_image 'ubuntu'
|
112
|
+
end
|
113
|
+
server_type :nginx do
|
114
|
+
container_type :web
|
115
|
+
baseline_image 'ubuntu'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
configure_project
|
120
|
+
end
|
115
121
|
|
116
122
|
it "builds all the images for the project" do
|
117
123
|
docker.fail_unexpected_commands!
|
@@ -182,7 +188,7 @@ describe RubyYacht::Plugins::Rails do
|
|
182
188
|
it "generates the dockerfiles for the database server" do
|
183
189
|
docker.expect "build -t apollo-database tmp" do
|
184
190
|
files = Dir[File.join("tmp", "*")].sort
|
185
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/
|
191
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/startup.bash', 'tmp/startup.bash.erb']
|
186
192
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
187
193
|
expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-rails'))
|
188
194
|
expect(dockerfile).to eq expected
|
@@ -191,6 +197,57 @@ describe RubyYacht::Plugins::Rails do
|
|
191
197
|
end
|
192
198
|
end
|
193
199
|
|
200
|
+
context "with a production app" do
|
201
|
+
before do
|
202
|
+
RubyYacht.configuration.projects.first.rails_environment = 'production'
|
203
|
+
end
|
204
|
+
|
205
|
+
it "generates the dockerfiles for the app server" do
|
206
|
+
docker.expect("build -t apollo-rails-app-dependencies tmp") do
|
207
|
+
files = Dir[File.join("tmp", "*")].sort
|
208
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/id_rsa', 'tmp/install_gems.rb']
|
209
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
210
|
+
expected = File.read(File.join('spec', 'fixtures', 'app-dependencies-dockerfile-rails-production'))
|
211
|
+
expect(dockerfile).to eq expected
|
212
|
+
end
|
213
|
+
subject.run
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
context "with a local MySQL database" do
|
218
|
+
before do
|
219
|
+
RubyYacht.configuration.clear
|
220
|
+
RubyYacht::Plugins::MySQL.load
|
221
|
+
described_class.load
|
222
|
+
|
223
|
+
RubyYacht.configure do
|
224
|
+
server_type :sqlite do
|
225
|
+
container_type :database
|
226
|
+
baseline_image 'ubuntu'
|
227
|
+
end
|
228
|
+
server_type :nginx do
|
229
|
+
container_type :web
|
230
|
+
baseline_image 'ubuntu'
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
configure_project
|
235
|
+
RubyYacht.configuration.projects.first.databases.first.host = 'localhost'
|
236
|
+
RubyYacht.configuration.projects.first.databases.first.server_type = :mysql
|
237
|
+
end
|
238
|
+
|
239
|
+
it "generates the dockerfiles for the database server" do
|
240
|
+
docker.expect "build -t apollo-database tmp" do
|
241
|
+
files = Dir[File.join("tmp", "*")].sort
|
242
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/load_seeds.rb', 'tmp/setup.bash', 'tmp/startup.bash', 'tmp/startup.bash.erb']
|
243
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
244
|
+
expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-rails-mysql'))
|
245
|
+
expect(dockerfile).to eq expected
|
246
|
+
end
|
247
|
+
subject.run
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
194
251
|
context "with no repository" do
|
195
252
|
before do
|
196
253
|
RubyYacht.configuration.projects.first.apps.first.repository_name = nil
|
@@ -248,6 +248,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
248
248
|
docker.expect "build -t apollo-mars tmp"
|
249
249
|
docker.expect "build -t apollo-saturn tmp"
|
250
250
|
docker.expect "build -t apollo-nginx tmp"
|
251
|
+
docker.expect "network create jupiter 2> /dev/null"
|
251
252
|
docker.expect "build -t jupiter-debian-app-dependencies tmp"
|
252
253
|
docker.expect "build -t jupiter-venus tmp"
|
253
254
|
docker.expect "build -t jupiter-saturn tmp"
|
@@ -439,6 +440,21 @@ describe RubyYacht::Runner::BuildImages do
|
|
439
440
|
end
|
440
441
|
end
|
441
442
|
|
443
|
+
context "with an HTTPS repository" do
|
444
|
+
before do
|
445
|
+
RubyYacht.configuration.projects[0].repository_protocol = :https
|
446
|
+
end
|
447
|
+
|
448
|
+
it "builds a dependencies dockerfile that does checks the repository out over HTTPS" do
|
449
|
+
docker.expect("build -t apollo-generic-app-dependencies tmp") do
|
450
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
451
|
+
expected = File.read(File.join('spec', 'fixtures', 'app-dependencies-dockerfile-with-https-repository'))
|
452
|
+
expect(dockerfile).to eq expected
|
453
|
+
end
|
454
|
+
subject.run
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
442
458
|
context "with an app with no repository" do
|
443
459
|
before do
|
444
460
|
RubyYacht.configuration.projects[0].apps[0].repository_name = nil
|
@@ -496,7 +512,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
496
512
|
subject.instance_eval { @app = app }
|
497
513
|
subject.set_image_settings('app')
|
498
514
|
expect(subject.instance_eval { @templates }).to eq ['Dockerfile', 'before_startup.bash', 'startup.bash']
|
499
|
-
expect(subject.instance_eval { @hook_events }).to eq [:startup, :build_checkout, :build_new_app]
|
515
|
+
expect(subject.instance_eval { @hook_events }).to eq [:startup, :build_checkout, :build_new_app, :cleanup]
|
500
516
|
expect(subject.instance_eval { @hook_servers }).to eq [app]
|
501
517
|
end
|
502
518
|
end
|
@@ -62,9 +62,9 @@ describe RubyYacht::Runner::RunContainers do
|
|
62
62
|
docker.expect 'run -d --net=apollo --net-alias=apollo-mars --name=apollo-mars apollo-mars'
|
63
63
|
docker.expect 'run -d --net=apollo --net-alias=apollo-saturn --name=apollo-saturn apollo-saturn'
|
64
64
|
docker.expect 'run -d -p 80:80 --net=apollo --net-alias=apollo-nginx --name=apollo-nginx apollo-nginx'
|
65
|
-
docker.expect 'run -d --net=
|
66
|
-
docker.expect 'run -d --net=
|
67
|
-
docker.expect 'run -d -p 80:80 --net=
|
65
|
+
docker.expect 'run -d --net=jupiter --net-alias=jupiter-venus --name=jupiter-venus jupiter-venus'
|
66
|
+
docker.expect 'run -d --net=jupiter --net-alias=jupiter-saturn --name=jupiter-saturn jupiter-saturn'
|
67
|
+
docker.expect 'run -d -p 80:80 --net=jupiter --net-alias=jupiter-web --name=jupiter-web jupiter-web'
|
68
68
|
subject.run
|
69
69
|
end
|
70
70
|
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module IntegrationHelpers
|
2
|
-
def
|
3
|
-
|
4
|
-
|
2
|
+
def containers
|
3
|
+
`docker ps | grep "apollo\\|jupiter"`.split("\n").collect { |line| line.split(/\s+/).last }.sort
|
4
|
+
end
|
5
|
+
|
6
|
+
def images
|
7
|
+
`docker images | grep "apollo\\|jupiter"`.split("\n").collect { |line| line.split(/\s+/).first }.sort
|
5
8
|
end
|
6
9
|
|
7
10
|
def run_command(command, environment: {}, capture_output: false)
|
@@ -11,6 +14,8 @@ module IntegrationHelpers
|
|
11
14
|
end
|
12
15
|
if capture_output
|
13
16
|
`#{full_command}`
|
17
|
+
elsif ENV['VERBOSE_DOCKER'] == '1'
|
18
|
+
system full_command
|
14
19
|
else
|
15
20
|
system "#{full_command} 1> log/integration_stdout.txt 2> log/integration_stderr.txt"
|
16
21
|
end
|
@@ -45,6 +50,11 @@ module IntegrationHelpers
|
|
45
50
|
end
|
46
51
|
end
|
47
52
|
end
|
53
|
+
|
54
|
+
def start_database
|
55
|
+
system "docker run -d --net=apollo --net-alias=apollo-database --name=apollo-database apollo-database > /dev/null"
|
56
|
+
wait_on_command_result 'docker run --rm --net=apollo apollo-mars mysql -uapollo -ptestpass -hapollo-database', does_not_contain: 'ERROR'
|
57
|
+
end
|
48
58
|
|
49
59
|
def restore_hosts_file
|
50
60
|
backup_path = Dir["/etc/hosts*.backup"].last
|
@@ -71,6 +81,10 @@ module IntegrationHelpers
|
|
71
81
|
end
|
72
82
|
|
73
83
|
def self.clear_checkout_folders
|
74
|
-
|
84
|
+
%w(mars saturn).each do |app|
|
85
|
+
if Dir.exist?("../#{app}")
|
86
|
+
FileUtils.rm_rf("../#{app}")
|
87
|
+
end
|
88
|
+
end
|
75
89
|
end
|
76
90
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_yacht
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Brownlee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -171,15 +171,19 @@ files:
|
|
171
171
|
- spec/fixtures/app-dependencies-dockerfile-generic
|
172
172
|
- spec/fixtures/app-dependencies-dockerfile-generic-with-library-install
|
173
173
|
- spec/fixtures/app-dependencies-dockerfile-rails
|
174
|
+
- spec/fixtures/app-dependencies-dockerfile-rails-production
|
175
|
+
- spec/fixtures/app-dependencies-dockerfile-with-https-repository
|
174
176
|
- spec/fixtures/app-dependencies-dockerfile-with-no-repository
|
175
177
|
- spec/fixtures/database-dockerfile
|
176
178
|
- spec/fixtures/database-dockerfile-mysql
|
177
179
|
- spec/fixtures/database-dockerfile-rails
|
180
|
+
- spec/fixtures/database-dockerfile-rails-mysql
|
178
181
|
- spec/fixtures/database-dockerfile-rails-with-no-repository
|
179
182
|
- spec/fixtures/database-dockerfile-with-seed-hooks
|
180
183
|
- spec/fixtures/database-startup-mysql
|
181
184
|
- spec/fixtures/hooks/hook1.rb
|
182
185
|
- spec/fixtures/hooks/hook2.rb
|
186
|
+
- spec/fixtures/local_config.yml
|
183
187
|
- spec/fixtures/mars-before-startup
|
184
188
|
- spec/fixtures/mars-before-startup-rails
|
185
189
|
- spec/fixtures/mars-before-startup-with-before-startup-hooks
|
@@ -203,16 +207,17 @@ files:
|
|
203
207
|
- spec/fixtures/web-dockerfile-nginx
|
204
208
|
- spec/fixtures/web-dockerfile-with-eponymous-app
|
205
209
|
- spec/fixtures/web-dockerfile-with-primary-app
|
206
|
-
- spec/integration/
|
207
|
-
- spec/integration/
|
208
|
-
- spec/integration/
|
209
|
-
- spec/integration/
|
210
|
-
- spec/integration/
|
210
|
+
- spec/integration/01_normal_config_spec.rb
|
211
|
+
- spec/integration/02_creating_new_project_spec.rb
|
212
|
+
- spec/integration/03_no_repository_spec.rb
|
213
|
+
- spec/integration/04_no_database_spec.rb
|
214
|
+
- spec/integration/05_https_repository_spec.rb
|
215
|
+
- spec/integration/06_production_environment_spec.rb
|
216
|
+
- spec/integration/07_local_checkout_spec.rb
|
217
|
+
- spec/integration/08_multiple_projects_spec.rb
|
218
|
+
- spec/integration/09_titular_app_spec.rb
|
219
|
+
- spec/integration/10_misc_scenarios_spec.rb
|
211
220
|
- spec/integration/run.rb
|
212
|
-
- spec/integration/run_containers_spec.rb
|
213
|
-
- spec/integration/services_spec.rb
|
214
|
-
- spec/integration/shell_spec.rb
|
215
|
-
- spec/integration/update_hosts_spec.rb
|
216
221
|
- spec/plugins/mysql_spec.rb
|
217
222
|
- spec/plugins/nginx_spec.rb
|
218
223
|
- spec/plugins/rails_spec.rb
|
@@ -274,15 +279,19 @@ test_files:
|
|
274
279
|
- spec/fixtures/app-dependencies-dockerfile-generic
|
275
280
|
- spec/fixtures/app-dependencies-dockerfile-generic-with-library-install
|
276
281
|
- spec/fixtures/app-dependencies-dockerfile-rails
|
282
|
+
- spec/fixtures/app-dependencies-dockerfile-rails-production
|
283
|
+
- spec/fixtures/app-dependencies-dockerfile-with-https-repository
|
277
284
|
- spec/fixtures/app-dependencies-dockerfile-with-no-repository
|
278
285
|
- spec/fixtures/database-dockerfile
|
279
286
|
- spec/fixtures/database-dockerfile-mysql
|
280
287
|
- spec/fixtures/database-dockerfile-rails
|
288
|
+
- spec/fixtures/database-dockerfile-rails-mysql
|
281
289
|
- spec/fixtures/database-dockerfile-rails-with-no-repository
|
282
290
|
- spec/fixtures/database-dockerfile-with-seed-hooks
|
283
291
|
- spec/fixtures/database-startup-mysql
|
284
292
|
- spec/fixtures/hooks/hook1.rb
|
285
293
|
- spec/fixtures/hooks/hook2.rb
|
294
|
+
- spec/fixtures/local_config.yml
|
286
295
|
- spec/fixtures/mars-before-startup
|
287
296
|
- spec/fixtures/mars-before-startup-rails
|
288
297
|
- spec/fixtures/mars-before-startup-with-before-startup-hooks
|
@@ -306,16 +315,17 @@ test_files:
|
|
306
315
|
- spec/fixtures/web-dockerfile-nginx
|
307
316
|
- spec/fixtures/web-dockerfile-with-eponymous-app
|
308
317
|
- spec/fixtures/web-dockerfile-with-primary-app
|
309
|
-
- spec/integration/
|
310
|
-
- spec/integration/
|
311
|
-
- spec/integration/
|
312
|
-
- spec/integration/
|
313
|
-
- spec/integration/
|
318
|
+
- spec/integration/01_normal_config_spec.rb
|
319
|
+
- spec/integration/02_creating_new_project_spec.rb
|
320
|
+
- spec/integration/03_no_repository_spec.rb
|
321
|
+
- spec/integration/04_no_database_spec.rb
|
322
|
+
- spec/integration/05_https_repository_spec.rb
|
323
|
+
- spec/integration/06_production_environment_spec.rb
|
324
|
+
- spec/integration/07_local_checkout_spec.rb
|
325
|
+
- spec/integration/08_multiple_projects_spec.rb
|
326
|
+
- spec/integration/09_titular_app_spec.rb
|
327
|
+
- spec/integration/10_misc_scenarios_spec.rb
|
314
328
|
- spec/integration/run.rb
|
315
|
-
- spec/integration/run_containers_spec.rb
|
316
|
-
- spec/integration/services_spec.rb
|
317
|
-
- spec/integration/shell_spec.rb
|
318
|
-
- spec/integration/update_hosts_spec.rb
|
319
329
|
- spec/plugins/mysql_spec.rb
|
320
330
|
- spec/plugins/nginx_spec.rb
|
321
331
|
- spec/plugins/rails_spec.rb
|
@@ -1,210 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe RubyYacht::Runner::BuildImages, :integration do
|
4
|
-
include IntegrationHelpers
|
5
|
-
|
6
|
-
def start_database
|
7
|
-
system "docker run -d --net=apollo --net-alias=apollo-database --name=apollo-database apollo-database > /dev/null"
|
8
|
-
wait_on_command_result 'docker run --rm --net=apollo apollo-mars mysql -uapollo -ptestpass -hapollo-database', does_not_contain: 'ERROR'
|
9
|
-
end
|
10
|
-
|
11
|
-
let(:images) { `docker images | grep "apollo\\|jupiter"`.split("\n").collect { |line| line.split(/\s+/).first }.sort }
|
12
|
-
|
13
|
-
before :all do
|
14
|
-
configure_project
|
15
|
-
system 'docker network create apollo 1> /dev/null 2> /dev/null'
|
16
|
-
end
|
17
|
-
|
18
|
-
context "with the standard config" do
|
19
|
-
before :all do
|
20
|
-
run_command 'build_images'
|
21
|
-
end
|
22
|
-
|
23
|
-
after do
|
24
|
-
IntegrationHelpers.clear_docker_containers
|
25
|
-
end
|
26
|
-
|
27
|
-
it "creates images for the app, dependencies, database, and web server" do
|
28
|
-
expect(images).to eq ['apollo-database', 'apollo-mars', 'apollo-rails-app-dependencies', 'apollo-saturn', 'apollo-web']
|
29
|
-
end
|
30
|
-
|
31
|
-
it "populates the tables in the database image" do
|
32
|
-
start_database
|
33
|
-
|
34
|
-
results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database -e "use apollo; show tables"'
|
35
|
-
results = results.split("\n").collect { |line| line.delete('|').strip }.sort
|
36
|
-
results.shift
|
37
|
-
expect(results).to eq %w(clients posts schema_migrations users)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "populates the seed data in the database image" do
|
41
|
-
start_database
|
42
|
-
|
43
|
-
results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database -e "select count(*) FROM apollo.users"'
|
44
|
-
results = results.split("\n").collect { |line| line.delete('|').strip }
|
45
|
-
results.shift
|
46
|
-
expect(results).to eq ['1']
|
47
|
-
|
48
|
-
results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database -e "select name FROM apollo.clients"'
|
49
|
-
results = results.split("\n").collect { |line| line.delete('|').strip }
|
50
|
-
results.shift
|
51
|
-
expect(results).to eq ['Test Client']
|
52
|
-
end
|
53
|
-
|
54
|
-
it "creates a test database" do
|
55
|
-
start_database
|
56
|
-
|
57
|
-
results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database apollo_test 2>&1'
|
58
|
-
expect(results).not_to include 'ERROR'
|
59
|
-
end
|
60
|
-
|
61
|
-
it "installs the gems on the app dependency image" do
|
62
|
-
results = run_command_in_docker 'rails-app-dependencies', 'gem list'
|
63
|
-
expect(results).to include 'mysql2'
|
64
|
-
expect(results).to include 'sass-rails'
|
65
|
-
expect(results).to include 'byebug'
|
66
|
-
expect(results).to include 'factory_girl'
|
67
|
-
end
|
68
|
-
|
69
|
-
it "leaves all the apps checked out on the app dependency image" do
|
70
|
-
results = run_command_in_docker 'rails-app-dependencies', 'ls /var/code'
|
71
|
-
folders = results.split("\n")
|
72
|
-
expect(folders).to include 'mars'
|
73
|
-
expect(folders).to include 'saturn'
|
74
|
-
end
|
75
|
-
|
76
|
-
it "installs the gems on the app images" do
|
77
|
-
results = run_command_in_docker :mars, 'gem list'
|
78
|
-
expect(results).to include 'mysql2'
|
79
|
-
expect(results).not_to include 'sass-rails'
|
80
|
-
expect(results).to include 'byebug'
|
81
|
-
expect(results).to include 'factory_girl'
|
82
|
-
|
83
|
-
results = run_command_in_docker :saturn, 'gem list'
|
84
|
-
expect(results).to include 'mysql2'
|
85
|
-
expect(results).to include 'sass-rails'
|
86
|
-
expect(results).not_to include 'byebug'
|
87
|
-
expect(results).not_to include 'factory_girl'
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'installs mysql on the app images' do
|
91
|
-
results = run_command_in_docker :mars, 'which mysql'
|
92
|
-
expect(results).to eq "/usr/bin/mysql\n"
|
93
|
-
end
|
94
|
-
|
95
|
-
it "checks out just the single app on the app image" do
|
96
|
-
results = run_command_in_docker :mars, 'ls /var/code'
|
97
|
-
folders = results.split("\n")
|
98
|
-
expect(folders).to include 'app'
|
99
|
-
expect(folders).to include 'db'
|
100
|
-
end
|
101
|
-
|
102
|
-
it "installs the scripts in the /var/docker folder in the app image" do
|
103
|
-
results = run_command_in_docker :mars, 'ls /var/docker'
|
104
|
-
files = results.split("\n")
|
105
|
-
expect(files).to include 'checkout.bash'
|
106
|
-
expect(files).to include 'before_startup.bash'
|
107
|
-
expect(files).to include 'startup.bash'
|
108
|
-
expect(files).to include 'update_rails_config.rb'
|
109
|
-
expect(files).to include 'prepare_rails_for_launch.rb'
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
context 'with no database server' do
|
114
|
-
before :all do
|
115
|
-
system "docker rmi apollo-database 1> /dev/null 2> /dev/null"
|
116
|
-
run_command 'build_images', environment: { SKIP_DATABASE: 1 }
|
117
|
-
end
|
118
|
-
|
119
|
-
it "does not build a database image" do
|
120
|
-
expect(images).to eq ['apollo-mars', 'apollo-rails-app-dependencies', 'apollo-saturn', 'apollo-web']
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'does not install mysql on the app servers' do
|
124
|
-
results = run_command_in_docker :mars, 'which mysql'
|
125
|
-
expect(results).to eq ''
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
context 'with a production environment' do
|
130
|
-
before :all do
|
131
|
-
run_command 'build_images', environment: { USE_PRODUCTION_ENVIRONMENT: 1 }
|
132
|
-
end
|
133
|
-
|
134
|
-
after :all do
|
135
|
-
IntegrationHelpers.clear_docker_containers
|
136
|
-
end
|
137
|
-
|
138
|
-
it "does not install the non-production gems" do
|
139
|
-
results = run_command_in_docker 'rails-app-dependencies', 'gem list'
|
140
|
-
expect(results).to include 'mysql2'
|
141
|
-
expect(results).not_to include 'byebug'
|
142
|
-
expect(results).not_to include 'factory_girl'
|
143
|
-
|
144
|
-
results = run_command_in_docker :mars, 'gem list'
|
145
|
-
expect(results).to include 'mysql2'
|
146
|
-
expect(results).not_to include 'byebug'
|
147
|
-
expect(results).not_to include 'factory_girl'
|
148
|
-
end
|
149
|
-
|
150
|
-
it "does not create a test database" do
|
151
|
-
start_database
|
152
|
-
results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database apollo_test 2>&1'
|
153
|
-
expect(results).to include 'ERROR'
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
context "with an app with the same name as the project" do
|
158
|
-
before :all do
|
159
|
-
system "docker rmi apollo-mars 1> /dev/null 2> /dev/null"
|
160
|
-
run_command 'build_images', environment: { CREATE_TITULAR_APP: 1 }
|
161
|
-
end
|
162
|
-
|
163
|
-
after :all do
|
164
|
-
system "docker rmi apollo 1> /dev/null"
|
165
|
-
end
|
166
|
-
|
167
|
-
it "creates an image with the same name as the project" do
|
168
|
-
expect(images).to eq ['apollo', 'apollo-database', 'apollo-rails-app-dependencies', 'apollo-saturn', 'apollo-web']
|
169
|
-
end
|
170
|
-
|
171
|
-
it "checks out the app onto the image" do
|
172
|
-
results = `docker run --rm apollo ls /var/code/app/models`
|
173
|
-
expect(results).to include 'user.rb'
|
174
|
-
expect(results).to include 'post.rb'
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
context "with a second project" do
|
179
|
-
before :all do
|
180
|
-
run_command 'build_images', environment: { CREATE_SECOND_PROJECT: 1 }
|
181
|
-
end
|
182
|
-
|
183
|
-
after :all do
|
184
|
-
IntegrationHelpers.image_names.select { |name| name =~ /jupiter/ }.each do |name|
|
185
|
-
`docker rmi #{name} 1> /dev/null`
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
it "creates images for the app, dependencies, database, and web server" do
|
190
|
-
expect(images).to eq ['apollo-database', 'apollo-mars', 'apollo-rails-app-dependencies', 'apollo-saturn', 'apollo-web', 'jupiter-database', 'jupiter-rails-app-dependencies', 'jupiter-saturn', 'jupiter-web']
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
context 'with no repository name' do
|
195
|
-
before :all do
|
196
|
-
run_command 'build_images', environment: { NO_REPOSITORY: 1 }
|
197
|
-
end
|
198
|
-
|
199
|
-
|
200
|
-
it 'creates images for the app, dependencies, database, and web server' do
|
201
|
-
expect(images).to eq ['apollo-database', 'apollo-mars', 'apollo-rails-app-dependencies', 'apollo-saturn', 'apollo-web']
|
202
|
-
end
|
203
|
-
|
204
|
-
it 'creates a fresh app in the app image' do
|
205
|
-
results = run_command_in_docker :mars, 'ls /var/code'
|
206
|
-
expect(results).to include 'app'
|
207
|
-
expect(results).to include 'Gemfile'
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|