ruby_yacht 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rdoc_options +8 -2
  4. data/.rspec +1 -0
  5. data/.travis.yml +17 -1
  6. data/Gemfile.lock +18 -2
  7. data/README.md +28 -10
  8. data/bin/ruby_yacht +5 -0
  9. data/doc/TODO.md +1 -20
  10. data/doc/configuration.md +104 -21
  11. data/doc/configuration_sample.rb +19 -8
  12. data/doc/contributing.md +28 -5
  13. data/doc/plugins.md +105 -45
  14. data/lib/ruby_yacht/dsl/app.rb +14 -18
  15. data/lib/ruby_yacht/dsl/configuration.rb +51 -32
  16. data/lib/ruby_yacht/dsl/database.rb +24 -8
  17. data/lib/ruby_yacht/dsl/dsl.rb +32 -4
  18. data/lib/ruby_yacht/dsl/hook.rb +182 -48
  19. data/lib/ruby_yacht/dsl/project.rb +20 -14
  20. data/lib/ruby_yacht/dsl/server_type.rb +14 -31
  21. data/lib/ruby_yacht/dsl/web_server.rb +87 -0
  22. data/lib/ruby_yacht/dsl.rb +1 -0
  23. data/lib/ruby_yacht/images/app/Dockerfile.erb +17 -6
  24. data/lib/ruby_yacht/images/app/before_startup.bash.erb +5 -3
  25. data/lib/ruby_yacht/images/app/startup.bash.erb +5 -2
  26. data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +7 -11
  27. data/lib/ruby_yacht/images/database/Dockerfile.erb +7 -18
  28. data/lib/ruby_yacht/images/database/startup.bash.erb +1 -1
  29. data/lib/ruby_yacht/images/web/Dockerfile.erb +25 -19
  30. data/lib/ruby_yacht/plugins/mysql.rb +18 -8
  31. data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/add_app.rb +5 -5
  32. data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/add_project.rb +3 -3
  33. data/lib/ruby_yacht/plugins/nginx.rb +28 -0
  34. data/lib/ruby_yacht/plugins/rails/scripts/build_new_app.rb +10 -0
  35. data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +6 -1
  36. data/lib/ruby_yacht/plugins/rails.rb +34 -19
  37. data/lib/ruby_yacht/plugins.rb +2 -1
  38. data/lib/ruby_yacht/runner/build_images.rb +87 -73
  39. data/lib/ruby_yacht/runner/checkout.rb +1 -1
  40. data/lib/ruby_yacht/runner/command.rb +13 -1
  41. data/lib/ruby_yacht/runner/create_new_project.rb +91 -0
  42. data/lib/ruby_yacht/runner/help.rb +1 -1
  43. data/lib/ruby_yacht/runner/run_containers.rb +17 -21
  44. data/lib/ruby_yacht/runner/runner.rb +27 -2
  45. data/lib/ruby_yacht/runner/services.rb +15 -10
  46. data/lib/ruby_yacht/runner/shell.rb +1 -1
  47. data/lib/ruby_yacht/runner/update_hosts.rb +16 -11
  48. data/lib/ruby_yacht/runner.rb +1 -0
  49. data/log/.gitkeep +0 -0
  50. data/ruby_yacht.gemspec +4 -2
  51. data/spec/docker/Dockerfile +19 -3
  52. data/spec/docker/install_gems.bash +5 -0
  53. data/spec/docker/run.bash +44 -0
  54. data/spec/docker/startup.bash +10 -0
  55. data/spec/dsl/app_spec.rb +66 -38
  56. data/spec/dsl/configuration_spec.rb +236 -30
  57. data/spec/dsl/database_spec.rb +103 -4
  58. data/spec/dsl/dsl_spec.rb +46 -3
  59. data/spec/dsl/hook_spec.rb +278 -57
  60. data/spec/dsl/project_spec.rb +75 -45
  61. data/spec/dsl/server_type_spec.rb +52 -12
  62. data/spec/dsl/web_server_spec.rb +160 -0
  63. data/spec/fixtures/apollo-new-project-config +20 -0
  64. data/spec/fixtures/app-dependencies-dockerfile-generic +4 -7
  65. data/spec/fixtures/app-dependencies-dockerfile-generic-with-library-install +6 -10
  66. data/spec/fixtures/app-dependencies-dockerfile-rails +9 -11
  67. data/spec/fixtures/app-dependencies-dockerfile-with-no-repository +20 -0
  68. data/spec/fixtures/database-dockerfile +1 -1
  69. data/spec/fixtures/database-dockerfile-mysql +3 -3
  70. data/spec/fixtures/database-dockerfile-rails +5 -4
  71. data/spec/fixtures/database-dockerfile-rails-with-no-repository +27 -0
  72. data/spec/fixtures/database-dockerfile-with-seed-hooks +3 -3
  73. data/spec/fixtures/database-startup-mysql +2 -1
  74. data/spec/fixtures/mars-before-startup +2 -2
  75. data/spec/fixtures/mars-before-startup-rails +5 -4
  76. data/spec/fixtures/mars-before-startup-with-before-startup-hooks +5 -4
  77. data/spec/fixtures/mars-before-startup-with-custom-file-copy +3 -3
  78. data/spec/fixtures/mars-before-startup-with-no-repository +3 -0
  79. data/spec/fixtures/mars-dockerfile +3 -2
  80. data/spec/fixtures/mars-dockerfile-rails +6 -5
  81. data/spec/fixtures/mars-dockerfile-rails-with-no-repository +32 -0
  82. data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +5 -4
  83. data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +5 -4
  84. data/spec/fixtures/mars-dockerfile-with-custom-file-copy +4 -3
  85. data/spec/fixtures/mars-dockerfile-with-local-database +4 -2
  86. data/spec/fixtures/mars-dockerfile-with-no-repository +22 -0
  87. data/spec/fixtures/mars-dockerfile-with-remote-database +4 -2
  88. data/spec/fixtures/mars-startup +2 -2
  89. data/spec/fixtures/mars-startup-rails +2 -2
  90. data/spec/fixtures/mars-startup-rails-with-no-repository +5 -0
  91. data/spec/fixtures/mars-startup-with-no-repository +4 -0
  92. data/spec/fixtures/web-dockerfile +18 -11
  93. data/spec/fixtures/web-dockerfile-jupiter +28 -0
  94. data/spec/fixtures/web-dockerfile-nginx +38 -0
  95. data/spec/fixtures/web-dockerfile-with-eponymous-app +16 -10
  96. data/spec/fixtures/web-dockerfile-with-primary-app +16 -10
  97. data/spec/integration/build_images_spec.rb +210 -0
  98. data/spec/integration/build_spec.rb +23 -0
  99. data/spec/integration/checkout_spec.rb +94 -0
  100. data/spec/integration/create_new_project_spec.rb +50 -0
  101. data/spec/integration/implode_spec.rb +20 -0
  102. data/spec/integration/run.rb +93 -0
  103. data/spec/integration/run_containers_spec.rb +279 -0
  104. data/spec/integration/services_spec.rb +99 -0
  105. data/spec/integration/shell_spec.rb +31 -0
  106. data/spec/integration/update_hosts_spec.rb +35 -0
  107. data/spec/plugins/mysql_spec.rb +18 -1
  108. data/spec/plugins/nginx_spec.rb +66 -0
  109. data/spec/plugins/rails_spec.rb +61 -89
  110. data/spec/runner/build_images_spec.rb +111 -58
  111. data/spec/runner/command_spec.rb +55 -3
  112. data/spec/runner/create_new_project_spec.rb +93 -0
  113. data/spec/runner/help_spec.rb +5 -1
  114. data/spec/runner/run_containers_spec.rb +22 -10
  115. data/spec/runner/runner_spec.rb +31 -4
  116. data/spec/runner/services_spec.rb +32 -4
  117. data/spec/runner/update_hosts_spec.rb +2 -1
  118. data/spec/spec_helper.rb +16 -1
  119. data/spec/support/integration_helpers.rb +76 -0
  120. data/spec/support/test_project.rb +15 -3
  121. metadata +97 -14
  122. data/spec/docker/build.bash +0 -10
  123. data/spec/fixtures/deploy-dockerfile +0 -2
  124. data/spec/fixtures/multi-project-web-dockerfile +0 -25
  125. /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/app_config.erb +0 -0
  126. /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/index.html.erb +0 -0
  127. /data/lib/ruby_yacht/{images/web → plugins/nginx/scripts}/index_config.erb +0 -0
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Runner::UpdateHosts, :integration do
4
+ include IntegrationHelpers
5
+
6
+ before :all do
7
+ configure_project
8
+ end
9
+
10
+ before do
11
+ run_command 'update_hosts'
12
+ end
13
+
14
+ after do
15
+ restore_hosts_file
16
+ end
17
+
18
+ it "puts the domains for the apps in the hosts file" do
19
+ results = File.read('/etc/hosts').split("\n")
20
+ expect(results).to include '127.0.0.1 apollo.johnbrownlee.com'
21
+ expect(results).to include '127.0.0.1 mars.apollo.johnbrownlee.com'
22
+ expect(results).to include '127.0.0.1 saturn.apollo.johnbrownlee.com'
23
+ end
24
+
25
+ it "puts an old copy in the backup" do
26
+ timestamp = Time.now.utc.strftime('%Y%m%d%H')
27
+ file = Dir["/etc/hosts.#{timestamp}*.backup"].last
28
+ expect(file).not_to be_nil
29
+ results = File.read(file).split("\n")
30
+ expect(results.count).to be > 0
31
+ expect(results).not_to include 'apollo.johnbrownlee.com'
32
+ expect(results).not_to include 'mars.apollo.johnbrownlee.com'
33
+ expect(results).not_to include 'saturn.apollo.johnbrownlee.com'
34
+ end
35
+ end
@@ -10,6 +10,23 @@ describe RubyYacht::Plugins::MySQL do
10
10
  expect(RubyYacht.configuration.server_types.map(&:name)).to include :mysql
11
11
  end
12
12
 
13
+ it "sets a default for port of 3306" do
14
+ RubyYacht.configure do
15
+ project :apollo do
16
+ system_prefix :apollo
17
+ repository "github.com"
18
+
19
+ mysql_database :apollo do
20
+ host "localhost"
21
+ username "apollo"
22
+ password "test"
23
+ end
24
+ end
25
+ end
26
+
27
+ expect(RubyYacht.configuration.projects.first.databases.first.port).to eq 3306
28
+ end
29
+
13
30
  describe "building images" do
14
31
  subject { RubyYacht::Runner::BuildImages.new }
15
32
  include DockerCommandSpec
@@ -28,13 +45,13 @@ describe RubyYacht::Plugins::MySQL do
28
45
  RubyYacht.configure do
29
46
  project :apollo do
30
47
  system_prefix :apollo
31
- domain "apollo.test.com"
32
48
  repository "github.com"
33
49
 
34
50
  mysql_database :apollo do
35
51
  host "localhost"
36
52
  username "apollo"
37
53
  password "test"
54
+ port 3306
38
55
  end
39
56
 
40
57
  generic_app :mars do
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Plugins::Nginx do
4
+ before do
5
+ RubyYacht.configuration.clear
6
+ RubyYacht::Plugins::Nginx.load
7
+ end
8
+
9
+ it 'creates a server type called nginx' do
10
+ server_type = RubyYacht.configuration.server_types.first
11
+ expect(server_type.name).to eq :nginx
12
+ expect(server_type.container_type).to eq :web
13
+ end
14
+
15
+ describe "building images" do
16
+ subject { RubyYacht::Runner::BuildImages.new }
17
+ include DockerCommandSpec
18
+
19
+ before do
20
+ RubyYacht.configuration.clear
21
+ described_class.load
22
+
23
+ RubyYacht.configure do
24
+ server_type :generic do
25
+ container_type :app
26
+ baseline_image 'ubuntu'
27
+ end
28
+ end
29
+
30
+ RubyYacht.configure do
31
+ project :apollo do
32
+ system_prefix :apollo
33
+ repository "github.com"
34
+
35
+ generic_app :mars
36
+ generic_app :saturn
37
+
38
+ nginx_web_server do
39
+ domain 'apollo.test.com'
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ it "builds all the images for the project" do
46
+ docker.fail_unexpected_commands!
47
+ docker.expect "network create apollo 2> /dev/null"
48
+ docker.expect "build -t apollo-generic-app-dependencies tmp"
49
+ docker.expect "build -t apollo-mars tmp"
50
+ docker.expect "build -t apollo-saturn tmp"
51
+ docker.expect "build -t apollo-web tmp"
52
+ subject.run
53
+ end
54
+
55
+ it "generates the dockerfiles for the web server" do
56
+ docker.expect "build -t apollo-web tmp" do
57
+ files = Dir[File.join("tmp", "*")].sort
58
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
59
+ dockerfile = File.read(File.join('tmp', 'Dockerfile'))
60
+ expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile-nginx'))
61
+ expect(dockerfile).to eq expected
62
+ end
63
+ subject.run
64
+ end
65
+ end
66
+ end
@@ -4,6 +4,18 @@ describe RubyYacht::Plugins::Rails do
4
4
  before do
5
5
  RubyYacht.configuration.clear
6
6
  described_class.load
7
+
8
+ @project = RubyYacht::Project.new
9
+ RubyYacht.configuration.projects << @project
10
+
11
+ @app = RubyYacht::App.new
12
+ @app.server_type = :rails
13
+ @app.database_name = :test_db
14
+ @project.apps = [@app]
15
+
16
+ @database = RubyYacht::Database.new
17
+ @database.name = :test_db
18
+ @project.databases = [@database]
7
19
  end
8
20
 
9
21
  def configure_project(options = {})
@@ -13,7 +25,6 @@ describe RubyYacht::Plugins::Rails do
13
25
  RubyYacht.configure do
14
26
  project :test_project do
15
27
  system_prefix :test_project
16
- domain 'test.com'
17
28
  repository 'github.com'
18
29
  rails_secret_key_base(options[:secret_key_base]) if options[:secret_key_base]
19
30
  rails_environment(options[:environment]) if options[:environment]
@@ -53,89 +64,6 @@ describe RubyYacht::Plugins::Rails do
53
64
  expect(project.rails_excluded_gem_groups).to eq []
54
65
  end
55
66
 
56
- it "sets an environment variables for the RAILS_ENV" do
57
- @project = RubyYacht::Project.new
58
- @project.rails_environment = 'staging'
59
- variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
60
- variable = variables.find { |v| v[:name] == 'RAILS_ENV' }
61
-
62
- expect(variable).not_to be_nil
63
- expect(variable[:image]).to eq :app_dependencies
64
- expect(instance_eval(&variable[:block])).to eq 'staging'
65
- end
66
-
67
- it "sets an environment variable for the SECRET_KEY_BASE" do
68
- @project = RubyYacht::Project.new
69
- @project.rails_secret_key_base = 'abc'
70
- variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
71
- variable = variables.find { |v| v[:name] == 'SECRET_KEY_BASE' }
72
-
73
- expect(variable).not_to be_nil
74
- expect(variable[:image]).to eq :app
75
- expect(instance_eval(&variable[:block])).to eq 'abc'
76
- end
77
-
78
- it "sets an environment variable for the EXCLUDED_GEM_GROUPS" do
79
- @project = RubyYacht::Project.new
80
- @project.rails_excluded_gem_groups = %w(assets doc)
81
- variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
82
- variable = variables.find { |v| v[:name] == 'EXCLUDED_GEM_GROUPS' }
83
-
84
- expect(variable).not_to be_nil
85
- expect(variable[:image]).to eq :app_dependencies
86
- expect(instance_eval(&variable[:block])).to eq 'assets doc'
87
- end
88
-
89
- context "with no gem groups excluded" do
90
- it "sets an empty string for the EXCLUDED_GEM_GROUPS environment variable" do
91
- @project = RubyYacht::Project.new
92
- @project.rails_excluded_gem_groups = []
93
- variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
94
- variable = variables.find { |v| v[:name] == 'EXCLUDED_GEM_GROUPS' }
95
-
96
- expect(variable).not_to be_nil
97
- expect(variable[:image]).to eq :app_dependencies
98
- expect(instance_eval(&variable[:block])).to eq '""'
99
- end
100
- end
101
-
102
- it "creates a during-install-libraries hook for installing the gems" do
103
- hooks = RubyYacht.configuration.fetch_hooks(event_time: :during, event_type: :install_libraries)
104
- expect(hooks.count).to eq 1
105
- expect(hooks[0].command).to eq '/var/docker/install_gems.rb'
106
- expect(hooks[0].server_type).to eq :rails
107
- end
108
-
109
- it "creates an after-build-checkout hook for cleaning the gems" do
110
- hooks = RubyYacht.configuration.fetch_hooks(event_time: :after, event_type: :build_checkout)
111
- expect(hooks.count).to eq 1
112
- expect(hooks[0].command).to eq 'bundle install --clean'
113
- expect(hooks[0].server_type).to eq :rails
114
- end
115
-
116
- it "creates a during-load-seeds hook for loading the seeds" do
117
- hooks = RubyYacht.configuration.fetch_hooks(event_time: :during, event_type: :load_database_seeds)
118
- expect(hooks.count).to eq 1
119
- expect(hooks[0].command).to eq '/var/docker/load_seeds.rb'
120
- expect(hooks[0].server_type).to eq :rails
121
- end
122
-
123
- it "creates before-startup hooks for updating the config and preparing the app for launch" do
124
- hooks = RubyYacht.configuration.fetch_hooks(event_time: :before, event_type: :startup)
125
- expect(hooks.count).to eq 2
126
- expect(hooks[0].command).to eq '/var/docker/update_rails_config.rb'
127
- expect(hooks[0].server_type).to eq :rails
128
- expect(hooks[1].command).to eq '/var/docker/prepare_rails_for_launch.rb'
129
- expect(hooks[1].server_type).to eq :rails
130
- end
131
-
132
- it "creates a during-startup hook for starting the server" do
133
- hooks = RubyYacht.configuration.fetch_hooks(event_time: :during, event_type: :startup)
134
- expect(hooks.count).to eq 1
135
- expect(hooks[0].command).to eq 'rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV'
136
- expect(hooks[0].server_type).to eq :rails
137
- end
138
-
139
67
  describe "building images" do
140
68
  subject { RubyYacht::Runner::BuildImages.new }
141
69
  include DockerCommandSpec
@@ -149,12 +77,15 @@ describe RubyYacht::Plugins::Rails do
149
77
  container_type :database
150
78
  baseline_image 'ubuntu'
151
79
  end
80
+ server_type :nginx do
81
+ container_type :web
82
+ baseline_image 'ubuntu'
83
+ end
152
84
  end
153
85
 
154
86
  RubyYacht.configure do
155
87
  project :apollo do
156
88
  system_prefix :apollo
157
- domain "apollo.test.com"
158
89
  repository "github.com"
159
90
  rails_secret_key_base 'abc'
160
91
 
@@ -162,6 +93,7 @@ describe RubyYacht::Plugins::Rails do
162
93
  host "db.test.com"
163
94
  username "apollo"
164
95
  password "test"
96
+ port 1234
165
97
  end
166
98
 
167
99
  rails_app :mars do
@@ -173,6 +105,10 @@ describe RubyYacht::Plugins::Rails do
173
105
  repository_name 'brownleej/saturn'
174
106
  database_name :apollo
175
107
  end
108
+
109
+ nginx_web_server do
110
+ domain 'apollo.test.com'
111
+ end
176
112
  end
177
113
  end
178
114
  end
@@ -190,7 +126,7 @@ describe RubyYacht::Plugins::Rails do
190
126
  it "generates the dockerfile for the app dependencies" do
191
127
  docker.expect("build -t apollo-rails-app-dependencies tmp") do
192
128
  files = Dir[File.join("tmp", "*")].sort
193
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/install_gems.rb']
129
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/id_rsa', 'tmp/install_gems.rb']
194
130
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
195
131
  expected = File.read(File.join('spec', 'fixtures', 'app-dependencies-dockerfile-rails'))
196
132
  expect(dockerfile).to eq expected
@@ -201,7 +137,7 @@ describe RubyYacht::Plugins::Rails do
201
137
  it "generates the dockerfiles for the apps" do
202
138
  docker.expect("build -t apollo-mars tmp") do
203
139
  files = Dir[File.join("tmp", "*")].sort
204
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/before_startup.bash', 'tmp/before_startup.bash.erb', 'tmp/checkout.bash', 'tmp/prepare_rails_for_launch.rb', 'tmp/startup.bash', 'tmp/startup.bash.erb', 'tmp/update_rails_config.rb']
140
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/before_startup.bash', 'tmp/before_startup.bash.erb', 'tmp/build_new_app.rb', 'tmp/checkout.bash', 'tmp/prepare_rails_for_launch.rb', 'tmp/startup.bash', 'tmp/startup.bash.erb', 'tmp/update_rails_config.rb']
205
141
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
206
142
  expected = File.read(File.join('spec', 'fixtures', 'mars-dockerfile-rails'))
207
143
  expect(dockerfile).to eq expected
@@ -230,7 +166,7 @@ describe RubyYacht::Plugins::Rails do
230
166
  it "generates the dockerfiles for the web server" do
231
167
  docker.expect "build -t apollo-web tmp" do
232
168
  files = Dir[File.join("tmp", "*")].sort
233
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
169
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
234
170
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
235
171
  expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile'))
236
172
  expect(dockerfile).to eq expected
@@ -246,7 +182,7 @@ describe RubyYacht::Plugins::Rails do
246
182
  it "generates the dockerfiles for the database server" do
247
183
  docker.expect "build -t apollo-database tmp" do
248
184
  files = Dir[File.join("tmp", "*")].sort
249
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/install_gems.rb', 'tmp/load_seeds.rb', 'tmp/startup.bash', 'tmp/startup.bash.erb']
185
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/load_seeds.rb', 'tmp/startup.bash', 'tmp/startup.bash.erb']
250
186
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
251
187
  expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-rails'))
252
188
  expect(dockerfile).to eq expected
@@ -254,5 +190,41 @@ describe RubyYacht::Plugins::Rails do
254
190
  subject.run
255
191
  end
256
192
  end
193
+
194
+ context "with no repository" do
195
+ before do
196
+ RubyYacht.configuration.projects.first.apps.first.repository_name = nil
197
+ RubyYacht.configuration.projects.first.databases.first.host = 'localhost'
198
+ end
199
+
200
+ it "generates the dockerfiles for the app server" do
201
+ docker.expect "build -t apollo-mars tmp" do
202
+ files = Dir[File.join("tmp", "*")].sort
203
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/before_startup.bash', 'tmp/before_startup.bash.erb', 'tmp/build_new_app.rb', 'tmp/checkout.bash', 'tmp/prepare_rails_for_launch.rb', 'tmp/startup.bash', 'tmp/startup.bash.erb', 'tmp/update_rails_config.rb']
204
+ file = File.read(File.join('tmp', 'Dockerfile'))
205
+ expected = File.read(File.join('spec', 'fixtures', 'mars-dockerfile-rails-with-no-repository'))
206
+ expect(file).to eq expected
207
+ end
208
+ subject.run
209
+ end
210
+
211
+ it "generates the startup script for the app server" do
212
+ docker.expect "build -t apollo-mars tmp" do
213
+ file = File.read(File.join('tmp', 'startup.bash'))
214
+ expected = File.read(File.join('spec', 'fixtures', 'mars-startup-rails-with-no-repository'))
215
+ expect(file).to eq expected
216
+ end
217
+ subject.run
218
+ end
219
+
220
+ it "generates a dockerfile for the database server" do
221
+ docker.expect "build -t apollo-database tmp" do
222
+ file = File.read(File.join('tmp', 'Dockerfile'))
223
+ expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-rails-with-no-repository'))
224
+ expect(file).to eq expected
225
+ end
226
+ subject.run
227
+ end
228
+ end
257
229
  end
258
230
  end
@@ -16,14 +16,14 @@ describe RubyYacht::Runner::BuildImages do
16
16
  docker.expect "build -t apollo-debian-app-dependencies tmp"
17
17
  docker.expect "build -t apollo-mars tmp"
18
18
  docker.expect "build -t apollo-saturn tmp"
19
- docker.expect "build -t apollo-web tmp"
19
+ docker.expect "build -t apollo-nginx tmp"
20
20
  subject.run
21
21
  end
22
22
 
23
23
  it "generates the dockerfile for the app dependencies" do
24
24
  docker.expect("build -t apollo-generic-app-dependencies tmp") do
25
25
  files = Dir[File.join("tmp", "*")].sort
26
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
26
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/id_rsa']
27
27
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
28
28
  expected = File.read(File.join('spec', 'fixtures', 'app-dependencies-dockerfile-generic'))
29
29
  expect(dockerfile).to eq expected
@@ -61,9 +61,9 @@ describe RubyYacht::Runner::BuildImages do
61
61
  end
62
62
 
63
63
  it "generates the dockerfiles for the web server" do
64
- docker.expect "build -t apollo-web tmp" do
64
+ docker.expect "build -t apollo-nginx tmp" do
65
65
  files = Dir[File.join("tmp", "*")].sort
66
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
66
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
67
67
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
68
68
  expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile'))
69
69
  expect(dockerfile).to eq expected
@@ -90,6 +90,7 @@ describe RubyYacht::Runner::BuildImages do
90
90
  database.container_label = 'mysql'
91
91
  database.username = 'apollo'
92
92
  database.password = 'test'
93
+ database.port = 1234
93
94
  database.host = 'localhost'
94
95
  RubyYacht.configuration.projects.first.databases << database
95
96
  RubyYacht.configuration.projects.first.apps.first.database_name = 'apollo'
@@ -127,8 +128,8 @@ describe RubyYacht::Runner::BuildImages do
127
128
  before do
128
129
  script_folder = self.script_folder
129
130
  RubyYacht.configure do
130
- add_hooks folder: script_folder, server_type: :generic do
131
- during(:load_database_seeds) { run_script 'hook1.rb' }
131
+ add_hooks script_folder: script_folder, container_type: :database do
132
+ during(:load_database_seeds) { run_script :ruby, 'hook1.rb' }
132
133
  end
133
134
  end
134
135
  end
@@ -161,6 +162,7 @@ describe RubyYacht::Runner::BuildImages do
161
162
  database.username = 'apollo'
162
163
  database.password = 'test'
163
164
  database.host = 'db1.test.com'
165
+ database.port = 3306
164
166
  RubyYacht.configuration.projects.first.databases << database
165
167
  RubyYacht.configuration.projects.first.apps.first.database_name = 'apollo'
166
168
  end
@@ -183,43 +185,10 @@ describe RubyYacht::Runner::BuildImages do
183
185
  docker.expect "build -t apollo-debian-app-dependencies tmp"
184
186
  docker.expect "build -t apollo-mars tmp"
185
187
  docker.expect "build -t apollo-saturn tmp"
186
- docker.expect "build -t apollo-web tmp"
188
+ docker.expect "build -t apollo-nginx tmp"
187
189
  subject.run
188
190
  end
189
191
  end
190
-
191
- context "with an id_rsa key" do
192
- let(:id_file_path) { File.join(ENV['HOME'], '.ssh', 'id_rsa') }
193
- let(:missing_id_file) { !File.exist?(id_file_path) }
194
- before do
195
- if missing_id_file
196
- FileUtils.mkdir_p(File.dirname(id_file_path))
197
- File.open(id_file_path, 'w') do |file|
198
- file.write('test')
199
- end
200
- end
201
- end
202
-
203
- it "copies the id_rsa key to the app-dependencies container" do
204
- docker.expect "build -t apollo-generic-app-dependencies tmp" do
205
- files = Dir[File.join("tmp", "*")].sort
206
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/id_rsa']
207
- expect(File.read('tmp/id_rsa')).to eq File.read(id_file_path)
208
- end
209
-
210
- subject.run
211
- end
212
-
213
- it "returns true" do
214
- expect(subject.run).to be_truthy
215
- end
216
-
217
- after do
218
- if missing_id_file
219
- FileUtils.rm(id_file_path)
220
- end
221
- end
222
- end
223
192
 
224
193
  context "with an app set up as the primary app" do
225
194
  before do
@@ -227,9 +196,9 @@ describe RubyYacht::Runner::BuildImages do
227
196
  end
228
197
 
229
198
  it "includes that app as the primary in the web server dockerfile" do
230
- docker.expect "build -t apollo-web tmp" do
199
+ docker.expect "build -t apollo-nginx tmp" do
231
200
  files = Dir[File.join("tmp", "*")].sort
232
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
201
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
233
202
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
234
203
  expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile-with-primary-app'))
235
204
  expect(dockerfile).to eq expected
@@ -250,14 +219,14 @@ describe RubyYacht::Runner::BuildImages do
250
219
  docker.expect "build -t apollo-debian-app-dependencies tmp"
251
220
  docker.expect "build -t apollo tmp"
252
221
  docker.expect "build -t apollo-saturn tmp"
253
- docker.expect "build -t apollo-web tmp"
222
+ docker.expect "build -t apollo-nginx tmp"
254
223
  subject.run
255
224
  end
256
225
 
257
226
  it "includes that app as the primary in the web server dockerfile" do
258
- docker.expect "build -t apollo-web tmp" do
227
+ docker.expect "build -t apollo-nginx tmp" do
259
228
  files = Dir[File.join("tmp", "*")].sort
260
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
229
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
261
230
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
262
231
  expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile-with-eponymous-app'))
263
232
  expect(dockerfile).to eq expected
@@ -278,19 +247,31 @@ describe RubyYacht::Runner::BuildImages do
278
247
  docker.expect "build -t apollo-debian-app-dependencies tmp"
279
248
  docker.expect "build -t apollo-mars tmp"
280
249
  docker.expect "build -t apollo-saturn tmp"
250
+ docker.expect "build -t apollo-nginx tmp"
281
251
  docker.expect "build -t jupiter-debian-app-dependencies tmp"
282
252
  docker.expect "build -t jupiter-venus tmp"
283
253
  docker.expect "build -t jupiter-saturn tmp"
284
- docker.expect "build -t apollo-web tmp"
254
+ docker.expect "build -t jupiter-web tmp"
285
255
  subject.run
286
256
  end
287
257
 
288
- it "generates one dockerfile for the web server with both projects" do
289
- docker.expect "build -t apollo-web tmp" do
258
+ it "generates a normal dockerfile for the first project's web server" do
259
+ docker.expect "build -t apollo-nginx tmp" do
290
260
  files = Dir[File.join("tmp", "*")].sort
291
- expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
261
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
292
262
  dockerfile = File.read(File.join('tmp', 'Dockerfile'))
293
- expected = File.read(File.join('spec', 'fixtures', 'multi-project-web-dockerfile'))
263
+ expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile'))
264
+ expect(dockerfile).to eq expected
265
+ end
266
+ subject.run
267
+ end
268
+
269
+ it "generates a dockerfile for the second project's web server" do
270
+ docker.expect "build -t jupiter-web tmp" do
271
+ files = Dir[File.join("tmp", "*")].sort
272
+ expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb']
273
+ dockerfile = File.read(File.join('tmp', 'Dockerfile'))
274
+ expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile-jupiter'))
294
275
  expect(dockerfile).to eq expected
295
276
  end
296
277
  subject.run
@@ -306,9 +287,9 @@ describe RubyYacht::Runner::BuildImages do
306
287
  before do
307
288
  script_folder = self.script_folder
308
289
  RubyYacht.configure do
309
- add_hooks folder: script_folder, server_type: :generic do
310
- before(:startup) { run_script 'hook1.rb' }
311
- before(:startup) { run_script 'hook2.rb' }
290
+ add_hooks script_folder: script_folder, container_type: :app do
291
+ before(:startup) { run_script :ruby, 'hook1.rb' }
292
+ before(:startup) { run_script :ruby, 'hook2.rb' }
312
293
  end
313
294
  end
314
295
  end
@@ -346,8 +327,8 @@ describe RubyYacht::Runner::BuildImages do
346
327
  before do
347
328
  script_folder = self.script_folder
348
329
  RubyYacht.configure do
349
- add_hooks folder: script_folder, server_type: :generic do
350
- after(:build_checkout) { run_script 'hook1.rb' }
330
+ add_hooks script_folder: script_folder, container_type: :app do
331
+ after(:build_checkout) { run_script :ruby, 'hook1.rb' }
351
332
  end
352
333
  end
353
334
  end
@@ -384,8 +365,8 @@ describe RubyYacht::Runner::BuildImages do
384
365
  before do
385
366
  script_folder = self.script_folder
386
367
  RubyYacht.configure do
387
- add_hooks folder: script_folder, server_type: :generic do
388
- during(:install_libraries) { run_script 'hook2.rb' }
368
+ add_hooks script_folder: script_folder, container_type: :app do
369
+ during(:install_libraries) { run_script :ruby, 'hook2.rb' }
389
370
  end
390
371
  end
391
372
  end
@@ -422,7 +403,7 @@ describe RubyYacht::Runner::BuildImages do
422
403
  before do
423
404
  script_folder = self.script_folder
424
405
  RubyYacht.configure do
425
- add_hooks folder: script_folder, server_type: :generic do
406
+ add_hooks script_folder: script_folder, container_type: :app do
426
407
  before :startup do
427
408
  copy_file "hook1.rb"
428
409
  command "cp /var/docker/hook1.rb /var/code/scripts/hook1.rb"
@@ -457,5 +438,77 @@ describe RubyYacht::Runner::BuildImages do
457
438
  subject.run
458
439
  end
459
440
  end
441
+
442
+ context "with an app with no repository" do
443
+ before do
444
+ RubyYacht.configuration.projects[0].apps[0].repository_name = nil
445
+ RubyYacht.configure do
446
+ during :build_new_app do
447
+ container_type :app
448
+ command 'touch /var/code/app.bash'
449
+ end
450
+ end
451
+ end
452
+
453
+ it "builds a dependencies dockerfile that does not include that app" do
454
+ docker.expect("build -t apollo-generic-app-dependencies tmp") do
455
+ dockerfile = File.read(File.join('tmp', 'Dockerfile'))
456
+ expected = File.read(File.join('spec', 'fixtures', 'app-dependencies-dockerfile-with-no-repository'))
457
+ expect(dockerfile).to eq expected
458
+ end
459
+ subject.run
460
+ end
461
+
462
+ it "builds a dockerfile for that app that does not check it out" do
463
+ docker.expect("build -t apollo-mars tmp") do
464
+ dockerfile = File.read(File.join('tmp', 'Dockerfile'))
465
+ expected = File.read(File.join('spec', 'fixtures', 'mars-dockerfile-with-no-repository'))
466
+ expect(dockerfile).to eq expected
467
+ end
468
+ subject.run
469
+ end
470
+
471
+ it "builds a before-startup script for the app that does not check out the app" do
472
+ docker.expect("build -t apollo-mars tmp") do
473
+ file = File.read(File.join('tmp', 'before_startup.bash'))
474
+ expected = File.read(File.join('spec', 'fixtures', 'mars-before-startup-with-no-repository'))
475
+ expect(file).to eq expected
476
+ end
477
+ subject.run
478
+ end
479
+
480
+ it "builds a startup script for the app that creates the app before starting it" do
481
+ docker.expect("build -t apollo-mars tmp") do
482
+ file = File.read(File.join('tmp', 'startup.bash'))
483
+ expected = File.read(File.join('spec', 'fixtures', 'mars-startup-with-no-repository'))
484
+ expect(file).to eq expected
485
+ end
486
+ subject.run
487
+ end
488
+ end
489
+ end
490
+
491
+ describe 'helper methods' do
492
+ describe 'set_image_settings' do
493
+ context 'with an app folder' do
494
+ it 'sets the templates, hook events, and hook servers' do
495
+ app = RubyYacht::App.new
496
+ subject.instance_eval { @app = app }
497
+ subject.set_image_settings('app')
498
+ 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]
500
+ expect(subject.instance_eval { @hook_servers }).to eq [app]
501
+ end
502
+ end
503
+
504
+ context 'with an invalid folder' do
505
+ it 'sets the templates, hook events, and hook servers' do
506
+ subject.set_image_settings('invalid')
507
+ expect(subject.instance_eval { @templates }).to eq ['Dockerfile']
508
+ expect(subject.instance_eval { @hook_events }).to eq []
509
+ expect(subject.instance_eval { @hook_servers }).to eq []
510
+ end
511
+ end
512
+ end
460
513
  end
461
514
  end