ruby_yacht 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -2,8 +2,8 @@ FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
4
  ENV REPOSITORY_HOST github.com
5
- ENV REPOSITORY_NAME brownleej/mars
6
5
  ENV SYSTEM_PREFIX apollo
6
+ ENV REPOSITORY_NAME brownleej/mars
7
7
 
8
8
  RUN rm -r /var/code
9
9
  RUN mkdir -p /var/code
@@ -11,13 +11,14 @@ RUN mkdir -p /var/code
11
11
  COPY checkout.bash /var/docker/checkout.bash
12
12
  COPY before_startup.bash /var/docker/before_startup.bash
13
13
  COPY startup.bash /var/docker/startup.bash
14
- COPY hook1.rb /var/docker/hook1.rb
15
14
 
16
15
  RUN chmod u+x /var/docker/*
17
16
 
18
- RUN /var/docker/checkout.bash
19
17
  WORKDIR /var/code
20
- RUN /var/docker/hook1.rb
18
+
19
+ RUN /var/docker/checkout.bash
20
+ COPY hook1.rb /var/docker/
21
+ RUN ruby /var/docker/hook1.rb
21
22
 
22
23
  EXPOSE 8080
23
24
 
@@ -2,8 +2,8 @@ FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
4
  ENV REPOSITORY_HOST github.com
5
- ENV REPOSITORY_NAME brownleej/mars
6
5
  ENV SYSTEM_PREFIX apollo
6
+ ENV REPOSITORY_NAME brownleej/mars
7
7
 
8
8
  RUN rm -r /var/code
9
9
  RUN mkdir -p /var/code
@@ -11,14 +11,15 @@ RUN mkdir -p /var/code
11
11
  COPY checkout.bash /var/docker/checkout.bash
12
12
  COPY before_startup.bash /var/docker/before_startup.bash
13
13
  COPY startup.bash /var/docker/startup.bash
14
- COPY hook1.rb /var/docker/hook1.rb
15
- COPY hook2.rb /var/docker/hook2.rb
14
+ COPY hook1.rb /var/docker/
15
+ COPY hook2.rb /var/docker/
16
16
 
17
17
  RUN chmod u+x /var/docker/*
18
18
 
19
- RUN /var/docker/checkout.bash
20
19
  WORKDIR /var/code
21
20
 
21
+ RUN /var/docker/checkout.bash
22
+
22
23
  EXPOSE 8080
23
24
 
24
25
  CMD /var/docker/startup.bash
@@ -2,8 +2,8 @@ FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
4
  ENV REPOSITORY_HOST github.com
5
- ENV REPOSITORY_NAME brownleej/mars
6
5
  ENV SYSTEM_PREFIX apollo
6
+ ENV REPOSITORY_NAME brownleej/mars
7
7
 
8
8
  RUN rm -r /var/code
9
9
  RUN mkdir -p /var/code
@@ -11,13 +11,14 @@ RUN mkdir -p /var/code
11
11
  COPY checkout.bash /var/docker/checkout.bash
12
12
  COPY before_startup.bash /var/docker/before_startup.bash
13
13
  COPY startup.bash /var/docker/startup.bash
14
- COPY hook1.rb /var/docker/hook1.rb
14
+ COPY hook1.rb /var/docker/
15
15
 
16
16
  RUN chmod u+x /var/docker/*
17
17
 
18
- RUN /var/docker/checkout.bash
19
18
  WORKDIR /var/code
20
19
 
20
+ RUN /var/docker/checkout.bash
21
+
21
22
  EXPOSE 8080
22
23
 
23
24
  CMD /var/docker/startup.bash
@@ -5,10 +5,11 @@ ENV DATABASE_NAME apollo
5
5
  ENV DATABASE_PASSWORD test
6
6
  ENV DATABASE_USERNAME apollo
7
7
  ENV DATABASE_TYPE sqlite
8
+ ENV DATABASE_PORT 1234
8
9
  ENV APP_PORT 8080
9
10
  ENV REPOSITORY_HOST github.com
10
- ENV REPOSITORY_NAME brownleej/mars
11
11
  ENV SYSTEM_PREFIX apollo
12
+ ENV REPOSITORY_NAME brownleej/mars
12
13
 
13
14
  RUN rm -r /var/code
14
15
  RUN mkdir -p /var/code
@@ -19,9 +20,10 @@ COPY startup.bash /var/docker/startup.bash
19
20
 
20
21
  RUN chmod u+x /var/docker/*
21
22
 
22
- RUN /var/docker/checkout.bash
23
23
  WORKDIR /var/code
24
24
 
25
+ RUN /var/docker/checkout.bash
26
+
25
27
  EXPOSE 8080
26
28
 
27
29
  CMD /var/docker/startup.bash
@@ -0,0 +1,22 @@
1
+ FROM apollo-generic-app-dependencies
2
+
3
+ ENV APP_PORT 8080
4
+ ENV REPOSITORY_HOST github.com
5
+ ENV SYSTEM_PREFIX apollo
6
+
7
+ RUN rm -r /var/code
8
+ RUN mkdir -p /var/code
9
+
10
+ COPY checkout.bash /var/docker/checkout.bash
11
+ COPY before_startup.bash /var/docker/before_startup.bash
12
+ COPY startup.bash /var/docker/startup.bash
13
+
14
+ RUN chmod u+x /var/docker/*
15
+
16
+ WORKDIR /var/code
17
+
18
+ RUN touch /var/code/app.bash
19
+
20
+ EXPOSE 8080
21
+
22
+ CMD /var/docker/startup.bash
@@ -5,10 +5,11 @@ ENV DATABASE_NAME apollo
5
5
  ENV DATABASE_PASSWORD test
6
6
  ENV DATABASE_USERNAME apollo
7
7
  ENV DATABASE_TYPE mysql
8
+ ENV DATABASE_PORT 3306
8
9
  ENV APP_PORT 8080
9
10
  ENV REPOSITORY_HOST github.com
10
- ENV REPOSITORY_NAME brownleej/mars
11
11
  ENV SYSTEM_PREFIX apollo
12
+ ENV REPOSITORY_NAME brownleej/mars
12
13
 
13
14
  RUN rm -r /var/code
14
15
  RUN mkdir -p /var/code
@@ -19,9 +20,10 @@ COPY startup.bash /var/docker/startup.bash
19
20
 
20
21
  RUN chmod u+x /var/docker/*
21
22
 
22
- RUN /var/docker/checkout.bash
23
23
  WORKDIR /var/code
24
24
 
25
+ RUN /var/docker/checkout.bash
26
+
25
27
  EXPOSE 8080
26
28
 
27
29
  CMD /var/docker/startup.bash
@@ -1,3 +1,3 @@
1
1
  #! /bin/bash
2
- /var/docker/before_startup.bash;
3
- /var/docker/start_app.bash;
2
+ /var/docker/before_startup.bash
3
+ /var/docker/start_app.bash
@@ -1,3 +1,3 @@
1
1
  #! /bin/bash
2
- /var/docker/before_startup.bash;
3
- rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV;
2
+ /var/docker/before_startup.bash
3
+ rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV
@@ -0,0 +1,5 @@
1
+ #! /bin/bash
2
+
3
+ ruby /var/docker/build_new_app.rb
4
+ /var/docker/before_startup.bash
5
+ rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV
@@ -0,0 +1,4 @@
1
+ #! /bin/bash
2
+ touch /var/code/app.bash
3
+ /var/docker/before_startup.bash
4
+ /var/docker/start_app.bash
@@ -2,20 +2,27 @@ FROM nginx
2
2
 
3
3
  RUN apt-get update
4
4
  RUN apt-get upgrade -y
5
- RUN apt-get install -y ruby
6
5
 
7
6
  RUN mkdir -p /var/docker
8
7
 
9
- COPY add_project.rb /var/docker/add_project.rb
10
- COPY add_app.rb /var/docker/add_app.rb
11
- COPY index.html.erb /var/docker/index.html.erb
12
- COPY index_config.erb /var/docker/index_config.erb
13
- COPY app_config.erb /var/docker/app_config.erb
8
+ ENV PROJECT apollo
9
+ ENV DOMAIN apollo.test.com
14
10
 
15
- RUN ruby /var/docker/add_project.rb apollo apollo.test.com mars,saturn
16
- RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080 false
17
- RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
11
+ ENV APP_LIST mars,saturn
12
+
13
+ ENV APP_NAME mars
14
+ ENV APP_PORT 8080
15
+ ENV APP_PRIMARY false
16
+
17
+ ENV APP_NAME saturn
18
+ ENV APP_PORT 8080
19
+ ENV APP_PRIMARY false
18
20
 
19
21
  RUN rm -r /var/docker
20
- RUN apt-get remove -y ruby
21
- RUN apt-get autoremove -y
22
+
23
+ ENV PROJECT ""
24
+ ENV DOMAIN ""
25
+ ENV APP_LIST ""
26
+ ENV APP_NAME ""
27
+ ENV APP_PORT ""
28
+ ENV APP_PRIMARY ""
@@ -0,0 +1,28 @@
1
+ FROM nginx
2
+
3
+ RUN apt-get update
4
+ RUN apt-get upgrade -y
5
+
6
+ RUN mkdir -p /var/docker
7
+
8
+ ENV PROJECT jupiter
9
+ ENV DOMAIN jupiter.test.com
10
+
11
+ ENV APP_LIST venus,saturn
12
+
13
+ ENV APP_NAME venus
14
+ ENV APP_PORT 8080
15
+ ENV APP_PRIMARY false
16
+
17
+ ENV APP_NAME saturn
18
+ ENV APP_PORT 8080
19
+ ENV APP_PRIMARY false
20
+
21
+ RUN rm -r /var/docker
22
+
23
+ ENV PROJECT ""
24
+ ENV DOMAIN ""
25
+ ENV APP_LIST ""
26
+ ENV APP_NAME ""
27
+ ENV APP_PORT ""
28
+ ENV APP_PRIMARY ""
@@ -0,0 +1,38 @@
1
+ FROM nginx
2
+
3
+ RUN apt-get update
4
+ RUN apt-get upgrade -y
5
+ RUN apt-get install -y ruby
6
+ COPY index.html.erb /var/docker/
7
+ COPY index_config.erb /var/docker/
8
+ COPY app_config.erb /var/docker/
9
+
10
+ RUN mkdir -p /var/docker
11
+
12
+ ENV PROJECT apollo
13
+ ENV DOMAIN apollo.test.com
14
+
15
+ ENV APP_LIST mars,saturn
16
+ COPY add_project.rb /var/docker/
17
+ RUN ruby /var/docker/add_project.rb
18
+
19
+ ENV APP_NAME mars
20
+ ENV APP_PORT 8080
21
+ ENV APP_PRIMARY false
22
+ COPY add_app.rb /var/docker/
23
+ RUN ruby /var/docker/add_app.rb
24
+
25
+ ENV APP_NAME saturn
26
+ ENV APP_PORT 8080
27
+ ENV APP_PRIMARY false
28
+ COPY add_app.rb /var/docker/
29
+ RUN ruby /var/docker/add_app.rb
30
+
31
+ RUN rm -r /var/docker
32
+
33
+ ENV PROJECT ""
34
+ ENV DOMAIN ""
35
+ ENV APP_LIST ""
36
+ ENV APP_NAME ""
37
+ ENV APP_PORT ""
38
+ ENV APP_PRIMARY ""
@@ -2,19 +2,25 @@ FROM nginx
2
2
 
3
3
  RUN apt-get update
4
4
  RUN apt-get upgrade -y
5
- RUN apt-get install -y ruby
6
5
 
7
6
  RUN mkdir -p /var/docker
8
7
 
9
- COPY add_project.rb /var/docker/add_project.rb
10
- COPY add_app.rb /var/docker/add_app.rb
11
- COPY index.html.erb /var/docker/index.html.erb
12
- COPY index_config.erb /var/docker/index_config.erb
13
- COPY app_config.erb /var/docker/app_config.erb
8
+ ENV PROJECT apollo
9
+ ENV DOMAIN apollo.test.com
14
10
 
15
- RUN ruby /var/docker/add_app.rb apollo apollo.test.com apollo 8080 true
16
- RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
11
+ ENV APP_NAME apollo
12
+ ENV APP_PORT 8080
13
+ ENV APP_PRIMARY true
14
+
15
+ ENV APP_NAME saturn
16
+ ENV APP_PORT 8080
17
+ ENV APP_PRIMARY false
17
18
 
18
19
  RUN rm -r /var/docker
19
- RUN apt-get remove -y ruby
20
- RUN apt-get autoremove -y
20
+
21
+ ENV PROJECT ""
22
+ ENV DOMAIN ""
23
+ ENV APP_LIST ""
24
+ ENV APP_NAME ""
25
+ ENV APP_PORT ""
26
+ ENV APP_PRIMARY ""
@@ -2,19 +2,25 @@ FROM nginx
2
2
 
3
3
  RUN apt-get update
4
4
  RUN apt-get upgrade -y
5
- RUN apt-get install -y ruby
6
5
 
7
6
  RUN mkdir -p /var/docker
8
7
 
9
- COPY add_project.rb /var/docker/add_project.rb
10
- COPY add_app.rb /var/docker/add_app.rb
11
- COPY index.html.erb /var/docker/index.html.erb
12
- COPY index_config.erb /var/docker/index_config.erb
13
- COPY app_config.erb /var/docker/app_config.erb
8
+ ENV PROJECT apollo
9
+ ENV DOMAIN apollo.test.com
14
10
 
15
- RUN ruby /var/docker/add_app.rb apollo apollo.test.com mars 8080 true
16
- RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
11
+ ENV APP_NAME mars
12
+ ENV APP_PORT 8080
13
+ ENV APP_PRIMARY true
14
+
15
+ ENV APP_NAME saturn
16
+ ENV APP_PORT 8080
17
+ ENV APP_PRIMARY false
17
18
 
18
19
  RUN rm -r /var/docker
19
- RUN apt-get remove -y ruby
20
- RUN apt-get autoremove -y
20
+
21
+ ENV PROJECT ""
22
+ ENV DOMAIN ""
23
+ ENV APP_LIST ""
24
+ ENV APP_NAME ""
25
+ ENV APP_PORT ""
26
+ ENV APP_PRIMARY ""
@@ -0,0 +1,210 @@
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
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe RubyYacht::Runner::Build, :integration do
4
+ include IntegrationHelpers
5
+
6
+ before :all do
7
+ configure_project
8
+ end
9
+
10
+ before do
11
+ run_command 'build'
12
+ wait_on_command_success 'curl apollo.johnbrownlee.com'
13
+ end
14
+
15
+ after :all do
16
+ restore_hosts_file
17
+ end
18
+
19
+ it "allows accessing the containers through their hostnames" do
20
+ results = `curl apollo.johnbrownlee.com 2>&1`
21
+ expect(results).to include '<a href="http://mars.apollo.johnbrownlee.com/">'
22
+ end
23
+ end