roro 0.1.0 → 0.1.1

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 (235) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +99 -0
  3. data/.circleci/setup-gem-credentials.sh +3 -0
  4. data/.gitignore +7 -1
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile.lock +24 -10
  8. data/Guardfile +46 -0
  9. data/bin/roro +5 -0
  10. data/docker/env_files/.keep +0 -0
  11. data/docker/env_files/circleci.env.enc +2 -0
  12. data/docker/keys/.keep +0 -0
  13. data/lib/roro.rb +2 -0
  14. data/lib/roro/cli.rb +18 -0
  15. data/lib/roro/cli/base.rb +124 -0
  16. data/lib/roro/cli/dockerize.rb +30 -0
  17. data/lib/roro/cli/expose.rb +13 -0
  18. data/lib/roro/cli/generate_keys.rb +79 -0
  19. data/lib/roro/cli/greenfield.rb +37 -0
  20. data/lib/roro/cli/obfuscate.rb +20 -0
  21. data/lib/roro/cli/rollon.rb +21 -0
  22. data/lib/roro/cli/templates/Gemfile.lock +0 -0
  23. data/lib/roro/cli/templates/Guardfile +81 -0
  24. data/lib/roro/cli/templates/circleci/Rakefile +4 -0
  25. data/lib/roro/cli/templates/circleci/config.job-example.yml +33 -0
  26. data/lib/roro/cli/templates/circleci/config.yml +69 -0
  27. data/lib/roro/cli/templates/circleci/config.yml.workflow-example +62 -0
  28. data/lib/roro/cli/templates/circleci/deploy.rake +127 -0
  29. data/lib/roro/cli/templates/config.yml +71 -0
  30. data/lib/roro/cli/templates/config/database.yml +20 -0
  31. data/lib/roro/cli/templates/docker-compose.yml +51 -0
  32. data/lib/roro/cli/templates/docker/containers/app/Dockerfile.tt +12 -0
  33. data/lib/roro/cli/templates/docker/containers/database/.keep +0 -0
  34. data/lib/roro/cli/templates/docker/containers/web/Dockerfile.tt +18 -0
  35. data/lib/roro/cli/templates/docker/containers/web/app.conf.tt +23 -0
  36. data/lib/roro/cli/templates/docker/env_files/.keep +0 -0
  37. data/lib/roro/cli/templates/docker/keys/.keep +0 -0
  38. data/lib/roro/cli/templates/docker/overrides/circleci.yml.tt +19 -0
  39. data/lib/roro/cli/templates/docker/overrides/production.yml.tt +26 -0
  40. data/lib/roro/cli/templates/docker/web/Dockerfile +20 -0
  41. data/lib/roro/cli/templates/docker/web/app.conf +23 -0
  42. data/lib/roro/cli/templates/gitignore +27 -0
  43. data/lib/roro/cli/templates/greenfield/Dockerfile +8 -0
  44. data/lib/roro/cli/templates/greenfield/Gemfile +2 -0
  45. data/lib/roro/cli/templates/greenfield/Gemfile.lock +0 -0
  46. data/lib/roro/cli/templates/greenfield/config/database.yml.example +16 -0
  47. data/lib/roro/cli/templates/greenfield/docker-compose.yml +15 -0
  48. data/lib/roro/cli/templates/lib/tasks/deploy.rake +126 -0
  49. data/lib/roro/version.rb +1 -1
  50. data/lib/tasks/deploy.rake +126 -0
  51. data/roro.gemspec +9 -2
  52. data/test_apps/dummy/.gitignore +27 -0
  53. data/test_apps/dummy/Gemfile +61 -0
  54. data/test_apps/dummy/README.md +24 -0
  55. data/test_apps/dummy/Rakefile +6 -0
  56. data/test_apps/dummy/app/assets/config/manifest.js +3 -0
  57. data/test_apps/dummy/app/assets/images/.keep +0 -0
  58. data/test_apps/dummy/app/assets/javascripts/application.js +16 -0
  59. data/test_apps/dummy/app/assets/javascripts/cable.js +13 -0
  60. data/test_apps/dummy/app/assets/javascripts/channels/.keep +0 -0
  61. data/test_apps/dummy/app/assets/stylesheets/application.css +15 -0
  62. data/test_apps/dummy/app/channels/application_cable/channel.rb +4 -0
  63. data/test_apps/dummy/app/channels/application_cable/connection.rb +4 -0
  64. data/test_apps/dummy/app/controllers/application_controller.rb +2 -0
  65. data/test_apps/dummy/app/controllers/concerns/.keep +0 -0
  66. data/test_apps/dummy/app/helpers/application_helper.rb +2 -0
  67. data/test_apps/dummy/app/jobs/application_job.rb +2 -0
  68. data/test_apps/dummy/app/mailers/application_mailer.rb +4 -0
  69. data/test_apps/dummy/app/models/application_record.rb +3 -0
  70. data/test_apps/dummy/app/models/concerns/.keep +0 -0
  71. data/test_apps/dummy/app/views/layouts/application.html.erb +15 -0
  72. data/test_apps/dummy/app/views/layouts/mailer.html.erb +13 -0
  73. data/test_apps/dummy/app/views/layouts/mailer.text.erb +1 -0
  74. data/test_apps/dummy/bin/bundle +3 -0
  75. data/test_apps/dummy/bin/rails +4 -0
  76. data/test_apps/dummy/bin/rake +4 -0
  77. data/test_apps/dummy/bin/setup +36 -0
  78. data/test_apps/dummy/bin/update +31 -0
  79. data/test_apps/dummy/bin/yarn +11 -0
  80. data/test_apps/dummy/config.ru +5 -0
  81. data/test_apps/dummy/config/application.rb +19 -0
  82. data/test_apps/dummy/config/boot.rb +4 -0
  83. data/test_apps/dummy/config/cable.yml +10 -0
  84. data/test_apps/dummy/config/credentials.yml.enc +1 -0
  85. data/test_apps/dummy/config/database.yml +85 -0
  86. data/test_apps/dummy/config/environment.rb +5 -0
  87. data/test_apps/dummy/config/environments/development.rb +61 -0
  88. data/test_apps/dummy/config/environments/production.rb +94 -0
  89. data/test_apps/dummy/config/environments/test.rb +46 -0
  90. data/test_apps/dummy/config/initializers/application_controller_renderer.rb +8 -0
  91. data/test_apps/dummy/config/initializers/assets.rb +14 -0
  92. data/test_apps/dummy/config/initializers/backtrace_silencers.rb +7 -0
  93. data/test_apps/dummy/config/initializers/content_security_policy.rb +25 -0
  94. data/test_apps/dummy/config/initializers/cookies_serializer.rb +5 -0
  95. data/test_apps/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  96. data/test_apps/dummy/config/initializers/inflections.rb +16 -0
  97. data/test_apps/dummy/config/initializers/mime_types.rb +4 -0
  98. data/test_apps/dummy/config/initializers/wrap_parameters.rb +14 -0
  99. data/test_apps/dummy/config/locales/en.yml +33 -0
  100. data/test_apps/dummy/config/puma.rb +34 -0
  101. data/test_apps/dummy/config/routes.rb +3 -0
  102. data/test_apps/dummy/config/spring.rb +6 -0
  103. data/test_apps/dummy/config/storage.yml +34 -0
  104. data/test_apps/dummy/db/seeds.rb +7 -0
  105. data/test_apps/dummy/lib/assets/.keep +0 -0
  106. data/test_apps/dummy/lib/tasks/.keep +0 -0
  107. data/test_apps/dummy/log/.keep +0 -0
  108. data/test_apps/dummy/package.json +5 -0
  109. data/test_apps/dummy/public/404.html +67 -0
  110. data/test_apps/dummy/public/422.html +67 -0
  111. data/test_apps/dummy/public/500.html +66 -0
  112. data/test_apps/dummy/public/apple-touch-icon-precomposed.png +0 -0
  113. data/test_apps/dummy/public/apple-touch-icon.png +0 -0
  114. data/test_apps/dummy/public/favicon.ico +0 -0
  115. data/test_apps/dummy/public/robots.txt +1 -0
  116. data/test_apps/dummy/storage/.keep +0 -0
  117. data/test_apps/dummy/test/application_system_test_case.rb +5 -0
  118. data/test_apps/dummy/test/controllers/.keep +0 -0
  119. data/test_apps/dummy/test/fixtures/.keep +0 -0
  120. data/test_apps/dummy/test/fixtures/files/.keep +0 -0
  121. data/test_apps/dummy/test/helpers/.keep +0 -0
  122. data/test_apps/dummy/test/integration/.keep +0 -0
  123. data/test_apps/dummy/test/mailers/.keep +0 -0
  124. data/test_apps/dummy/test/models/.keep +0 -0
  125. data/test_apps/dummy/test/system/.keep +0 -0
  126. data/test_apps/dummy/test/test_helper.rb +10 -0
  127. data/test_apps/dummy/vendor/.keep +0 -0
  128. data/test_apps/dummy_roro/.circleci/Rakefile +4 -0
  129. data/test_apps/dummy_roro/.circleci/config.job-example.yml +33 -0
  130. data/test_apps/dummy_roro/.circleci/config.yml +69 -0
  131. data/test_apps/dummy_roro/.circleci/config.yml.workflow-example +62 -0
  132. data/test_apps/dummy_roro/.circleci/deploy.rake +127 -0
  133. data/test_apps/dummy_roro/.gitignore +27 -0
  134. data/test_apps/dummy_roro/Gemfile +64 -0
  135. data/test_apps/dummy_roro/README.md +24 -0
  136. data/test_apps/dummy_roro/Rakefile +6 -0
  137. data/test_apps/dummy_roro/app/assets/config/manifest.js +3 -0
  138. data/test_apps/dummy_roro/app/assets/images/.keep +0 -0
  139. data/test_apps/dummy_roro/app/assets/javascripts/application.js +16 -0
  140. data/test_apps/dummy_roro/app/assets/javascripts/cable.js +13 -0
  141. data/test_apps/dummy_roro/app/assets/javascripts/channels/.keep +0 -0
  142. data/test_apps/dummy_roro/app/assets/stylesheets/application.css +15 -0
  143. data/test_apps/dummy_roro/app/channels/application_cable/channel.rb +4 -0
  144. data/test_apps/dummy_roro/app/channels/application_cable/connection.rb +4 -0
  145. data/test_apps/dummy_roro/app/controllers/application_controller.rb +2 -0
  146. data/test_apps/dummy_roro/app/controllers/concerns/.keep +0 -0
  147. data/test_apps/dummy_roro/app/helpers/application_helper.rb +2 -0
  148. data/test_apps/dummy_roro/app/jobs/application_job.rb +2 -0
  149. data/test_apps/dummy_roro/app/mailers/application_mailer.rb +4 -0
  150. data/test_apps/dummy_roro/app/models/application_record.rb +3 -0
  151. data/test_apps/dummy_roro/app/models/concerns/.keep +0 -0
  152. data/test_apps/dummy_roro/app/views/layouts/application.html.erb +15 -0
  153. data/test_apps/dummy_roro/app/views/layouts/mailer.html.erb +13 -0
  154. data/test_apps/dummy_roro/app/views/layouts/mailer.text.erb +1 -0
  155. data/test_apps/dummy_roro/bin/bundle +3 -0
  156. data/test_apps/dummy_roro/bin/rails +4 -0
  157. data/test_apps/dummy_roro/bin/rake +4 -0
  158. data/test_apps/dummy_roro/bin/setup +36 -0
  159. data/test_apps/dummy_roro/bin/update +31 -0
  160. data/test_apps/dummy_roro/bin/yarn +11 -0
  161. data/test_apps/dummy_roro/config.ru +5 -0
  162. data/test_apps/dummy_roro/config/application.rb +19 -0
  163. data/test_apps/dummy_roro/config/boot.rb +4 -0
  164. data/test_apps/dummy_roro/config/cable.yml +10 -0
  165. data/test_apps/dummy_roro/config/credentials.yml.enc +1 -0
  166. data/test_apps/dummy_roro/config/database.yml +20 -0
  167. data/test_apps/dummy_roro/config/environment.rb +5 -0
  168. data/test_apps/dummy_roro/config/environments/development.rb +61 -0
  169. data/test_apps/dummy_roro/config/environments/production.rb +94 -0
  170. data/test_apps/dummy_roro/config/environments/test.rb +46 -0
  171. data/test_apps/dummy_roro/config/initializers/application_controller_renderer.rb +8 -0
  172. data/test_apps/dummy_roro/config/initializers/assets.rb +14 -0
  173. data/test_apps/dummy_roro/config/initializers/backtrace_silencers.rb +7 -0
  174. data/test_apps/dummy_roro/config/initializers/content_security_policy.rb +25 -0
  175. data/test_apps/dummy_roro/config/initializers/cookies_serializer.rb +5 -0
  176. data/test_apps/dummy_roro/config/initializers/filter_parameter_logging.rb +4 -0
  177. data/test_apps/dummy_roro/config/initializers/inflections.rb +16 -0
  178. data/test_apps/dummy_roro/config/initializers/mime_types.rb +4 -0
  179. data/test_apps/dummy_roro/config/initializers/wrap_parameters.rb +14 -0
  180. data/test_apps/dummy_roro/config/locales/en.yml +33 -0
  181. data/test_apps/dummy_roro/config/puma.rb +34 -0
  182. data/test_apps/dummy_roro/config/routes.rb +3 -0
  183. data/test_apps/dummy_roro/config/spring.rb +6 -0
  184. data/test_apps/dummy_roro/config/storage.yml +34 -0
  185. data/test_apps/dummy_roro/db/seeds.rb +7 -0
  186. data/test_apps/dummy_roro/docker-compose.yml +51 -0
  187. data/test_apps/dummy_roro/docker/containers/app/Dockerfile +12 -0
  188. data/test_apps/dummy_roro/docker/containers/app/circleci.env +2 -0
  189. data/test_apps/dummy_roro/docker/containers/app/development.env +2 -0
  190. data/test_apps/dummy_roro/docker/containers/app/production.env +2 -0
  191. data/test_apps/dummy_roro/docker/containers/app/staging.env +2 -0
  192. data/test_apps/dummy_roro/docker/containers/database/.keep +0 -0
  193. data/test_apps/dummy_roro/docker/containers/database/circleci.env +3 -0
  194. data/test_apps/dummy_roro/docker/containers/database/development.env +3 -0
  195. data/test_apps/dummy_roro/docker/containers/database/production.env +3 -0
  196. data/test_apps/dummy_roro/docker/containers/database/staging.env +3 -0
  197. data/test_apps/dummy_roro/docker/containers/web/Dockerfile +18 -0
  198. data/test_apps/dummy_roro/docker/containers/web/app.conf +23 -0
  199. data/test_apps/dummy_roro/docker/containers/web/circleci.env +1 -0
  200. data/test_apps/dummy_roro/docker/containers/web/development.env +1 -0
  201. data/test_apps/dummy_roro/docker/containers/web/production.env +1 -0
  202. data/test_apps/dummy_roro/docker/containers/web/staging.env +1 -0
  203. data/test_apps/dummy_roro/docker/env_files/circleci.env +12 -0
  204. data/test_apps/dummy_roro/docker/env_files/circleci.env.enc +14 -0
  205. data/test_apps/dummy_roro/docker/env_files/production.env +2 -0
  206. data/test_apps/dummy_roro/docker/env_files/production.env.enc +2 -0
  207. data/test_apps/dummy_roro/docker/keys/.keep +0 -0
  208. data/test_apps/dummy_roro/docker/overrides/circleci.yml +19 -0
  209. data/test_apps/dummy_roro/docker/overrides/production.yml +26 -0
  210. data/test_apps/dummy_roro/lib/assets/.keep +0 -0
  211. data/test_apps/dummy_roro/lib/tasks/.keep +0 -0
  212. data/test_apps/dummy_roro/lib/tasks/deploy.rake +126 -0
  213. data/test_apps/dummy_roro/log/.keep +0 -0
  214. data/test_apps/dummy_roro/package.json +5 -0
  215. data/test_apps/dummy_roro/public/404.html +67 -0
  216. data/test_apps/dummy_roro/public/422.html +67 -0
  217. data/test_apps/dummy_roro/public/500.html +66 -0
  218. data/test_apps/dummy_roro/public/apple-touch-icon-precomposed.png +0 -0
  219. data/test_apps/dummy_roro/public/apple-touch-icon.png +0 -0
  220. data/test_apps/dummy_roro/public/favicon.ico +0 -0
  221. data/test_apps/dummy_roro/public/robots.txt +1 -0
  222. data/test_apps/dummy_roro/storage/.keep +0 -0
  223. data/test_apps/dummy_roro/test/application_system_test_case.rb +5 -0
  224. data/test_apps/dummy_roro/test/controllers/.keep +0 -0
  225. data/test_apps/dummy_roro/test/fixtures/.keep +0 -0
  226. data/test_apps/dummy_roro/test/fixtures/files/.keep +0 -0
  227. data/test_apps/dummy_roro/test/helpers/.keep +0 -0
  228. data/test_apps/dummy_roro/test/integration/.keep +0 -0
  229. data/test_apps/dummy_roro/test/mailers/.keep +0 -0
  230. data/test_apps/dummy_roro/test/models/.keep +0 -0
  231. data/test_apps/dummy_roro/test/system/.keep +0 -0
  232. data/test_apps/dummy_roro/test/test_helper.rb +10 -0
  233. data/test_apps/dummy_roro/vendor/.keep +0 -0
  234. data/test_apps/greenfield/.keep +0 -0
  235. metadata +292 -5
@@ -0,0 +1,30 @@
1
+ # module Roro
2
+ #
3
+ # class CLI < Thor
4
+ #
5
+ # desc "dockerize", "Generates files necessary to dockerize your existing Rails project, along with a set of files for continuous deployment using CircleCI and deployment ussing sshkit."
6
+ #
7
+ # def dockerize
8
+ # configurate
9
+ # copy_base_files
10
+ # append_to_existing_files
11
+ # end
12
+ #
13
+ # desc "greenfield", "Generates files necessary to greenfield a new app within a dockerized rails container, along with a set of files necessary for continuous deployment using CircleCI"
14
+ # method_option :interactive, desc: "Set up your environment variables as you go."
15
+ # method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
16
+ #
17
+ # def greenfield(app=nil)
18
+ # configurate
19
+ # self.destination_root = self.destination_root + "/#{app}" unless app.nil?
20
+ # if app.nil? && !Dir.empty?('.')
21
+ # raise Roro::Error.new("Oops -- Roro can't greenfield unless the current directory is empty.")
22
+ # end
23
+ # copy_base_files
24
+ # copy_file "gitignore", ".gitignore"
25
+ # copy_file "Gemfile"
26
+ # copy_file "Gemfile.lock"
27
+ # append_to_existing_files
28
+ # end
29
+ # end
30
+ # end
@@ -0,0 +1,13 @@
1
+ module Roro
2
+ class CLI < Thor
3
+
4
+ desc "expose", "Expose encrypted files"
5
+
6
+ def expose(*args)
7
+ environments = args.first ? [args.first] : gather_environments
8
+ environments.each do |environment|
9
+ HandsomeFencer::Crypto.expose(environment, 'docker')
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,79 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+ require 'handsome_fencer/crypto'
4
+
5
+ module Roro
6
+
7
+ class CLI < Thor
8
+
9
+ include Thor::Actions
10
+ include HandsomeFencer::Crypto
11
+
12
+ desc "generate_keys", "Generates keys for all environments. If you have .env files like './**/production.env' and './**/staging.env' this command assumes you need keys for the production and staging environments, and will generate them for you."
13
+
14
+ def generate_keys
15
+ generate_key
16
+ end
17
+
18
+ desc "generate_key", "Generate a key for each environment"
19
+ method_option :environment, type: :string, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
20
+
21
+ def generate_key(*args)
22
+ environments = args.first ? [args.first] : gather_environments
23
+ environments.each do |environment|
24
+ confirm_files_decrypted?(environment)
25
+ create_file "docker/keys/#{environment}.key", encoded_key
26
+ end
27
+ end
28
+
29
+ no_commands do
30
+
31
+ def encoded_key
32
+ @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
33
+ @salt = '8 octets'
34
+ @new_key = @cipher.random_key
35
+ Base64.encode64(@new_key)
36
+ end
37
+
38
+ def gather_environments
39
+ environments = []
40
+ ['.env', '.env.enc'].each do |extension|
41
+
42
+ HandsomeFencer::Crypto.source_files('.', extension).each do |env_file|
43
+ environments << env_file.split('/').last.split(extension).last
44
+ end
45
+ end
46
+ environments.uniq
47
+ end
48
+
49
+ def confirm_files_decrypted?(environment)
50
+ orphan_encrypted = []
51
+ HandsomeFencer::Crypto.source_files('.', '.env.enc').each do |file|
52
+ orphan_encrypted << file unless File.exist? file.split('.enc').first
53
+ end
54
+
55
+ if !orphan_encrypted.empty?
56
+ raise Roro::Error.new("You have an encrypted files (.env.enc) #{orphan_encrypted} that do not have corresponding decrypted files (.env). Please decrypt or remove these encrypted files before generating a new key for #{environment}.")
57
+ end
58
+ true
59
+ end
60
+ end
61
+ end
62
+
63
+ # desc "generate keys", "Generate keys on a per-environment basis"
64
+ #
65
+ # method_option :environment, type: :string, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "development, staging"
66
+ #
67
+
68
+ # def generate_keys
69
+ # default_environments = %w[circleci development production]
70
+ # environments = args.first ? [args.first] : default_environments
71
+ # environments.each do |environment|
72
+ # @cipher = OpenSSL::Cipher.new 'AES-128-CBC'
73
+ # @salt = '8 octets'
74
+ # @new_key = @cipher.random_key
75
+ #
76
+ # create_file "docker/keys/#{environment}.key", Base64.encode64(@new_key)
77
+ # end
78
+ # end
79
+ end
@@ -0,0 +1,37 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ include Thor::Actions
6
+
7
+ desc "greenfield", "Greenfield a brand new rails app using Docker's instructions"
8
+
9
+ method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
10
+ method_option :interactive, desc: "Set up your environment variables as you go."
11
+ method_option :force, desc: "force over-write of existing files"
12
+
13
+ def greenfield
14
+ if !Dir['./*'].empty? && options["force"].nil?
15
+ raise Roro::Error.new("Oops -- Roro can't greenfield a new Rails app for you unless the current directory is empty.")
16
+ end
17
+ copy_greenfield_files
18
+ system 'sleep 5s'
19
+ system 'sudo chown -R $USER:$USER .'
20
+ system 'sleep 5s'
21
+ system 'sudo docker-compose run web rails new . --force --database=postgresql --skip-bundle'
22
+ system 'sleep 5s'
23
+ system 'sudo chown -R $USER:$USER .'
24
+ system 'sleep 5s'
25
+ system 'sudo docker-compose build'
26
+ system 'sleep 5s'
27
+ system 'mv -f config/database.yml.example config/database.yml'
28
+ system 'sleep 5s'
29
+ system 'chmod 1777 /tmp'
30
+ system 'sudo docker-compose up -d'
31
+ system 'sleep 5s'
32
+ system 'sudo chown -R $USER:$USER .'
33
+ system 'sleep 5s'
34
+ system 'sudo docker-compose run web bin/rails db:create'
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ require 'handsome_fencer/crypto'
2
+
3
+ module Roro
4
+
5
+ class CLI < Thor
6
+
7
+ include Thor::Actions
8
+ include HandsomeFencer::Crypto
9
+
10
+ desc "obfuscate", "obfuscates any files matching the pattern ./docker/**/*.env"
11
+
12
+ def obfuscate(*args)
13
+ default_environments = %w[circleci development staging production]
14
+ environments = args.first ? [args.first] : default_environments
15
+ environments.each do |environment|
16
+ HandsomeFencer::Crypto.obfuscate(environment, 'docker')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ method_option :env_vars, type: :hash, default: {}, desc: "Pass a list of environment variables like so: env:var", banner: "key1:value1 key2:value2"
6
+ desc "rollon", "Generates files necessary to greenfield a new app within a dockerized rails container, along with a set of files necessary for continuous deployment using CircleCI"
7
+ method_option :interactive, desc: "Set up your environment variables as you go."
8
+
9
+ def rollon
10
+ configurate
11
+ if Dir['./*'].empty?
12
+ raise Roro::Error.new("Oops -- Roro can't roll itself onto a Rails app if it doesn't exist. Please either change into a directory with a Rails app or generate a new one using '$ roro greenfield'.")
13
+ end
14
+ copy_base_files
15
+ append_to_existing_files
16
+ insert_into_file 'Gemfile', "gem 'sshkit'\n\n", before: "group :development, :test do"
17
+ insert_into_file 'Gemfile', "\n\tgem 'handsome_fencer-test'", after: "group :development, :test do"
18
+
19
+ end
20
+ end
21
+ end
File without changes
@@ -0,0 +1,81 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ guard 'livereload' do
19
+ extensions = {
20
+ css: :css,
21
+ scss: :css,
22
+ sass: :css,
23
+ js: :js,
24
+ coffee: :js,
25
+ html: :html,
26
+ png: :png,
27
+ gif: :gif,
28
+ jpg: :jpg,
29
+ jpeg: :jpeg,
30
+ # less: :less, # uncomment if you want LESS stylesheets done in browser
31
+ }
32
+
33
+ rails_view_exts = %w(erb haml slim)
34
+
35
+ # file types LiveReload may optimize refresh for
36
+ compiled_exts = extensions.values.uniq
37
+ watch(%r{public/.+\.(#{compiled_exts * '|'})})
38
+
39
+ extensions.each do |ext, type|
40
+ watch(%r{
41
+ (?:app|vendor)
42
+ (?:/assets/\w+/(?<path>[^.]+) # path+base without extension
43
+ (?<ext>\.#{ext})) # matching extension (must be first encountered)
44
+ (?:\.\w+|$) # other extensions
45
+ }x) do |m|
46
+ path = m[1]
47
+ "/assets/#{path}.#{type}"
48
+ end
49
+ end
50
+
51
+ # file needing a full reload of the page anyway
52
+ watch(%r{app/views/.+\.(#{rails_view_exts * '|'})$})
53
+ watch(%r{app/helpers/.+\.rb})
54
+ watch(%r{config/locales/.+\.yml})
55
+ end
56
+
57
+ guard "minitest", spring: "bin/rails test" do
58
+ # with Minitest::Unit
59
+ # watch(%r{^test/(.*)\/?test_(.*)\.rb$})
60
+ # watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
61
+ # watch(%r{^test/test_helper\.rb$}) { 'test' }
62
+
63
+ # with Minitest::Spec
64
+ # watch(%r{^spec/(.*)_spec\.rb$})
65
+ # watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
66
+ # watch(%r{^spec/spec_helper\.rb$}) { 'spec' }
67
+
68
+ # Rails 4
69
+ watch(%r{^app/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
70
+ watch(%r{^app/controllers/application_controller\.rb$}) { 'test/controllers' }
71
+ watch(%r{^app/controllers/(.+)_controller\.rb$}) { |m| "test/integration/#{m[1]}_test.rb" }
72
+ watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
73
+ watch(%r{^lib/(.+)\.rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
74
+ watch(%r{^test/.+_test\.rb$})
75
+ watch(%r{^test/test_helper\.rb$}) { 'test' }
76
+
77
+ # Rails < 4
78
+ # watch(%r{^app/controllers/(.*)\.rb$}) { |m| "test/functional/#{m[1]}_test.rb" }
79
+ # watch(%r{^app/helpers/(.*)\.rb$}) { |m| "test/helpers/#{m[1]}_test.rb" }
80
+ # watch(%r{^app/models/(.*)\.rb$}) { |m| "test/unit/#{m[1]}_test.rb" }
81
+ end
@@ -0,0 +1,4 @@
1
+ require 'sshkit'
2
+ import '.circleci/deploy.rake'
3
+
4
+ task :default => 'docker:deploy'
@@ -0,0 +1,33 @@
1
+ defaults: &defaults
2
+ working_directory: /tmp
3
+
4
+ version: 2
5
+
6
+ jobs:
7
+
8
+ build:
9
+ machine: true
10
+ steps:
11
+ - checkout
12
+ - add_ssh_keys
13
+
14
+ - run: gem install handsome_fencer-circle_c_i
15
+ - run: handsome_fencer-circle_c_i expose circleci
16
+ - run: handsome_fencer-circle_c_i expose development
17
+ - run: echo 'source docker/env_files/circleci.env' >> $BASH_ENV
18
+ - run: docker-compose build
19
+ - run: docker-compose up -d
20
+ - run: docker-compose exec app bin/rails db:create db:migrate
21
+ - run: docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS
22
+ - run:
23
+ name: Tag app image
24
+ command: docker tag $(docker images | grep project_app | awk '{ print $3 }') ${DOCKERHUB_ORG_NAME}/${APP_NAME}_app:$DEPLOY_TAG
25
+ - run:
26
+ name: Tag web image
27
+ command: docker tag $(docker images | grep project_web | awk '{ print $3 }') ${DOCKERHUB_ORG_NAME}/${APP_NAME}_web:$DEPLOY_TAG
28
+
29
+
30
+ - run: docker push ${DOCKERHUB_ORG_NAME}/${APP_NAME}_app:$DEPLOY_TAG
31
+ - run: docker push ${DOCKERHUB_ORG_NAME}/${APP_NAME}_web:$DEPLOY_TAG
32
+
33
+ - run: rake --rakefile .circleci/Rakefile
@@ -0,0 +1,69 @@
1
+ defaults: &defaults
2
+ working_directory: /tmp
3
+
4
+ version: 2
5
+
6
+ jobs:
7
+
8
+ build:
9
+ machine: true
10
+ steps:
11
+ - checkout
12
+ - run: gem install handsome_fencer-circle_c_i
13
+ - run: handsome_fencer-circle_c_i expose circleci
14
+ - run: handsome_fencer-circle_c_i expose development
15
+ - run: echo 'source docker/env_files/circleci.env' >> $BASH_ENV
16
+ - run: docker-compose up -d app --build
17
+ - run: docker-compose exec app bin/rails db:create db:migrate
18
+ - run: docker-compose exec app bin/rails test
19
+
20
+ push:
21
+ machine: true
22
+ steps:
23
+ - checkout
24
+ - run: gem install handsome_fencer-circle_c_i
25
+ - run: handsome_fencer-circle_c_i expose circleci
26
+ - run: handsome_fencer-circle_c_i expose development
27
+ - run: echo 'source docker/env_files/circleci.env' >> $BASH_ENV
28
+ - run: docker-compose build app web
29
+ - run: docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS
30
+ - run:
31
+ name: Tag app image
32
+ command: docker tag $(docker images | grep project_app | awk '{ print $3 }') ${DOCKERHUB_ORG_NAME}/${APP_NAME}_app:$DEPLOY_TAG
33
+ - run:
34
+ name: Tag web image
35
+ command: docker tag $(docker images | grep project_web | awk '{ print $3 }') ${DOCKERHUB_ORG_NAME}/${APP_NAME}_web:$DEPLOY_TAG
36
+
37
+
38
+ - run: docker push ${DOCKERHUB_ORG_NAME}/${APP_NAME}_app:$DEPLOY_TAG
39
+ - run: docker push ${DOCKERHUB_ORG_NAME}/${APP_NAME}_web:$DEPLOY_TAG
40
+
41
+ deploy:
42
+ machine: true
43
+ steps:
44
+ - checkout
45
+ - add_ssh_keys
46
+ - run: gem install handsome_fencer-circle_c_i
47
+ - run: handsome_fencer-circle_c_i expose circleci
48
+ - run: handsome_fencer-circle_c_i expose development
49
+ - run: echo 'source docker/env_files/circleci.env' >> $BASH_ENV
50
+
51
+ - run: rake --rakefile .circleci/Rakefile
52
+
53
+ workflows:
54
+ version: 2
55
+ build-and-deploy:
56
+ jobs:
57
+ - build
58
+ - push:
59
+ requires:
60
+ - build
61
+ filters:
62
+ branches:
63
+ only: master
64
+ - deploy:
65
+ requires:
66
+ - push
67
+ filters:
68
+ branches:
69
+ only: master
@@ -0,0 +1,62 @@
1
+ defaults: &defaults
2
+ working_directory: /tmp
3
+
4
+ version: 2
5
+
6
+ jobs:
7
+
8
+ build:
9
+ machine: true
10
+ steps:
11
+ - checkout
12
+ - run: gem install handsome_fencer-circle_c_i
13
+ - run: ruby .circleci/expose_env.rb
14
+ - run: docker-compose build dev_app database
15
+ - run: docker-compose run dev_app bin/rails db:create db:migrate test
16
+
17
+ push:
18
+ docker:
19
+ - image: circleci/ruby:2.5.1-node-browsers
20
+ environment:
21
+ BASH_ENV: .env/circle/deploy.env
22
+ steps:
23
+ - checkout
24
+ - setup_remote_docker
25
+ - run: gem install handsomefencer-environment
26
+ - run: ruby expose_env.rb
27
+ - run: docker-compose up -d --build
28
+ - run:
29
+ name: Tag web image
30
+ command: docker tag $(docker images | grep project_web | awk '{ print $3 }') rennmappe/bacchanal_web:$DEPLOY_TAG
31
+ - run: docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS
32
+ - run: docker push rennmappe/bacchanal_web:$DEPLOY_TAG
33
+
34
+ deploy:
35
+ docker:
36
+ - image: circleci/ruby:2.5.1-node-browsers
37
+ environment:
38
+ BASH_ENV: .env/circle/deploy.env
39
+ steps:
40
+ - checkout
41
+ - add_ssh_keys
42
+ - run: bundle install --without production
43
+ - run: ruby expose_env.rb
44
+ - run: bin/rails docker:deploy
45
+
46
+ workflows:
47
+ version: 2
48
+ build-and-deploy:
49
+ jobs:
50
+ - build
51
+ - push:
52
+ requires:
53
+ - build
54
+ filters:
55
+ branches:
56
+ only: master
57
+ - deploy:
58
+ requires:
59
+ - push
60
+ filters:
61
+ branches:
62
+ only: master