roro 0.3.5 → 0.3.6

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/Guardfile +9 -5
  4. data/lib/roro.rb +1 -1
  5. data/lib/roro/cli.rb +5 -1
  6. data/lib/roro/cli/base/base.rb +2 -1
  7. data/lib/roro/cli/base/base_files.rb +1 -7
  8. data/lib/roro/cli/base/check_dependencies.rb +98 -0
  9. data/lib/roro/cli/base/insert_gems.rb +15 -7
  10. data/lib/roro/cli/base/insertions.rb +3 -1
  11. data/lib/roro/cli/configuration.rb +68 -0
  12. data/lib/roro/cli/generate/config.rb +13 -0
  13. data/lib/roro/cli/generate/config/rails.rb +17 -0
  14. data/lib/roro/cli/generate/generate.rb +1 -0
  15. data/lib/roro/cli/generate/generate_keys.rb +79 -0
  16. data/lib/roro/cli/greenfield.rb +15 -16
  17. data/lib/roro/cli/rollon.rb +66 -20
  18. data/lib/roro/cli/rollon/database/database.rb +31 -0
  19. data/lib/roro/cli/rollon/database/with_mysql.rb +22 -0
  20. data/lib/roro/cli/rollon/database/with_postgres.rb +21 -0
  21. data/lib/roro/cli/rollon/stories.rb +3 -3
  22. data/lib/roro/cli/roro_configurator.yml +157 -0
  23. data/{.keep → lib/roro/cli/templates/base/.env/.keep} +0 -0
  24. data/lib/roro/cli/templates/base/.env/database.mysql.env.tt +4 -0
  25. data/lib/roro/cli/templates/base/.env/database.pg.env.tt +5 -0
  26. data/lib/roro/cli/templates/base/.env/web.env.tt +1 -0
  27. data/lib/roro/cli/templates/base/.roro_config.yml +15 -0
  28. data/lib/roro/cli/templates/base/Dockerfile.tt +44 -0
  29. data/lib/roro/cli/templates/base/config/database.mysql.yml +19 -0
  30. data/lib/roro/cli/templates/base/config/{database.yml.pg.tt → database.pg.yml} +0 -0
  31. data/lib/roro/cli/templates/{base/circleci → circleci}/config.yml.tt +0 -0
  32. data/lib/roro/cli/templates/greenfield/Dockerfile.tt +29 -7
  33. data/lib/roro/cli/templates/{base/livereload → livereload}/hosts.example +0 -0
  34. data/lib/roro/cli/templates/{base/roro → roro}/.keep +0 -0
  35. data/lib/roro/cli/templates/{greenfield → roro}/docker-compose.yml.tt +18 -13
  36. data/lib/roro/cli/templates/{base/roro/containers → roro/roro}/.keep +0 -0
  37. data/lib/roro/cli/templates/{base/roro/containers/app → roro/roro/containers}/.keep +0 -0
  38. data/lib/roro/cli/templates/{base/roro/containers/frontend → roro/roro/containers/app}/.keep +0 -0
  39. data/lib/roro/cli/templates/roro/roro/containers/frontend/.keep +0 -0
  40. data/lib/roro/cli/templates/roro/roro/docker-entrypoint.sh.tt +8 -0
  41. data/lib/roro/cli/templates/stories/.keep +0 -0
  42. data/lib/roro/cli/templates/stories/with_mysql/_service.yml +10 -0
  43. data/lib/roro/cli/templates/stories/with_postgresql/.keep +0 -0
  44. data/lib/roro/cli/templates/stories/with_postgresql/_service.yml +7 -0
  45. data/lib/roro/version.rb +1 -1
  46. metadata +33 -25
  47. data/lib/roro/cli/base/configuration.rb +0 -118
  48. data/lib/roro/cli/rollon/rollon_as_dockerize.rb +0 -42
  49. data/lib/roro/cli/rollon/rollon_as_quickstart.rb +0 -17
  50. data/lib/roro/cli/rollon/rollon_as_roro.rb +0 -30
  51. data/lib/roro/cli/templates/base/docker-compose.yml.tt +0 -53
  52. data/lib/roro/cli/templates/base/pg/config/database.yml.pg.tt +0 -20
  53. data/lib/roro/cli/templates/base/pg/database.yml.pg.tt +0 -20
  54. data/lib/roro/cli/templates/base/roro/containers/app/Dockerfile.tt +0 -32
  55. data/lib/roro/cli/templates/base/roro/containers/app/development.env.tt +0 -1
  56. data/lib/roro/cli/templates/base/roro/containers/app/docker-entrypoint.sh +0 -8
  57. data/lib/roro/cli/templates/base/roro/containers/app/test.env.tt +0 -1
  58. data/lib/roro/cli/templates/base/roro/containers/database/development.env.tt +0 -4
  59. data/lib/roro/cli/templates/base/roro/containers/database/test.env.tt +0 -4
  60. data/roro-0.3.4.gem +0 -0
@@ -4,35 +4,81 @@ module Roro
4
4
 
5
5
  class CLI < Thor
6
6
 
7
- desc "rollon", "Generates files and makes changes to your rails app
8
- necessary to run it using Docker containers."
7
+ desc "rollon", "Generates files for and makes changes to your app
8
+ so it can run using Docker containers."
9
9
  method_option :interactive, desc: "Set up your environment variables as
10
10
  you go."
11
11
 
12
12
  def rollon
13
+ confirm_directory_not_empty
13
14
  confirm_dependencies
14
- confirm_dependency({
15
- system_query: "ls -A",
16
- warning: "This is an empty directory. You can generate a new and fully
17
- dockerized Rails app using the 'greenfield' command here here but if
18
- you want to containerize an existing app -- which is what the 'rollon'
19
- command is for -- you'll need to navigate to a directory with an app we
20
- can roll onto.",
21
- suggestion: "$ roro greenfield",
22
- conditional: "!Dir.glob('*').empty?" })
23
- @env_hash || get_configuration_variables
24
- # case ask("Configure using the Quickstart, Curated, or HandsomeFencer way?\n\n(1) Quikstart\n\n(2) Curated\n\n(3) HandsomeFencer\n\n", { default: '2', limited_to: %w(1 2 3) })
25
- # when '1'
26
- # rollon_as_quickstart
27
- # when '2'
28
- # rollon_as_dockerized
29
- # when '3'
30
- # end
31
- rollon_as_dockerize
15
+ remove_roro_artifacts
16
+
17
+ configure_for_rollon
18
+
19
+ copy_roro_files
20
+ generate_roro_config
21
+ startup_commands
32
22
  end
33
23
 
34
24
  no_commands do
25
+
26
+ def configure_for_rollon
27
+ @config ||= Roro::Configuration.new(options)
28
+ end
29
+
30
+ def yaml_from_template(file)
31
+ File.read(File.dirname(__FILE__) + "/templates/#{file}")
32
+ end
33
+
34
+ def copy_roro_files
35
+ configure_database
36
+ directory 'roro', './', @config.app
37
+ template 'base/Dockerfile.tt', 'roro/containers/app/Dockerfile', @config.app
38
+ take_thor_actions
39
+ end
40
+
41
+ def take_thor_actions
42
+ @config.thor_actions.each {|k, v| eval(k) if v.eql?('y') }
43
+ end
44
+
45
+ def startup_commands
46
+ system 'docker-compose build'
47
+ system 'docker-compose run web bundle'
48
+ system 'docker-compose run web bin/rails webpacker:install'
49
+ system 'docker-compose run web bin/rails yarn:install'
50
+ system 'docker-compose run web bin/rails db:create'
51
+ system 'docker-compose run web bin/rails db:migrate'
52
+ system 'docker-compose up'
53
+ end
54
+
55
+ def confirm_directory_empty
56
+ confirm = confirm_dependency({
57
+ system_query: "ls -A",
58
+ warning: "this is not an empty directory. Roro will not greenfield a new Rails app unless either a) the current directory is empty or b) you run greenfield with the --force flag",
59
+ suggestion: "$ roro greenfield --force",
60
+ conditional: "Dir.glob('*').empty?" })
61
+ confirm || true
62
+ end
63
+
35
64
 
65
+ def confirm_dependency(options)
66
+ msg = []
67
+ msg << ""
68
+ msg << delineator
69
+ msg << "It looks like #{options[:warning]}. The following bash command returns false:"
70
+ msg << "\t$ #{options[:system_query]}"
71
+ msg << "Please try these instructions:"
72
+ msg << ("\t" + options[:suggestion])
73
+ msg << delineator
74
+ conditional = options[:conditional] ? eval(options[:conditional]) : system(options[:system_query])
75
+ if conditional == false
76
+ raise(Roro::Error.new(msg.join("\n\n")))
77
+ else
78
+ true
79
+ end
80
+ end
81
+
36
82
  end
37
83
  end
38
84
  end
@@ -0,0 +1,31 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ no_commands do
6
+
7
+ def configure_database
8
+ database = @config.thor_actions['configure_database']
9
+ vendor = @config.master['services']['database']['vendors']
10
+ case database
11
+ when 'p'
12
+ @config.app['database_vendor'] = 'postgresql'
13
+ @config.app['postgresql_env_vars'] = vendor['postgresql']['env_vars']
14
+ configure_for_pg
15
+ when 'm'
16
+ @config.app['database_vendor'] = 'mysql'
17
+ @config.app['mysql_env_vars'] = vendor['mysql']['env_vars']
18
+ configure_for_mysql
19
+ end
20
+
21
+ %w(development production test staging ci).each do |environment|
22
+ template(
23
+ 'base/.env/web.env.tt',
24
+ "roro/containers/app/#{environment}.env", @config.app
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,22 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ no_commands do
6
+
7
+ def configure_for_mysql
8
+ insert_db_gem('mysql2')
9
+ copy_file 'base/config/database.mysql.yml', 'config/database.yml', force: true
10
+ config = @config.app.clone
11
+
12
+ %w(development production test staging ci).each do |environment|
13
+ config['rails_env'] = environment
14
+
15
+ source = 'base/.env/database.mysql.env.tt'
16
+ target = "roro/containers/database/#{environment}.env"
17
+ template( source, target, config )
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module Roro
2
+
3
+ class CLI < Thor
4
+
5
+ no_commands do
6
+
7
+ def configure_for_pg
8
+ insert_db_gem('pg')
9
+ copy_file 'base/config/database.pg.yml', 'config/database.yml', force: true
10
+ config = @config.app.clone
11
+ %w(development production test staging ci).each do |environment|
12
+ config['rails_env'] = environment
13
+
14
+ source = 'base/.env/database.pg.env.tt'
15
+ target = "roro/containers/database/#{environment}.env"
16
+ template( source, target, config )
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
- require_relative 'rollon_as_quickstart.rb'
2
- require_relative 'rollon_as_dockerize.rb'
3
- require_relative 'rollon_as_roro.rb'
1
+ require_relative 'database/with_postgres.rb'
2
+ require_relative 'database/with_mysql.rb'
3
+ require_relative 'database/database.rb'
@@ -0,0 +1,157 @@
1
+ ---
2
+ main_app_name: <%= Dir.pwd.split('/').last %>
3
+ developer:
4
+ name: your-name
5
+ email: your.email@example.com
6
+
7
+ services:
8
+ server_app:
9
+ name: app
10
+ vendors:
11
+ rails:
12
+ version:
13
+ image:
14
+ official_name: ruby
15
+ variants:
16
+ - alpine
17
+ - buster
18
+ - slim
19
+ - slim-buster
20
+ - stretch
21
+
22
+ choices:
23
+
24
+ config_std_out_true:
25
+ question: |
26
+ The team at Heroku, among others, recommend logging to STDOUT
27
+ and treating your logs as streams. We'll set this to
28
+ true as an environment variable but it may also be helpful
29
+ to configure './config/boot.rb' with '$stdout.sync = true'
30
+ just in case that doesn't work.
31
+ Would you like to configure this?
32
+ choices:
33
+ y: 'Yes'
34
+ n: 'No'
35
+ default: y
36
+
37
+ insert_roro_gem_into_gemfile:
38
+ question: |
39
+ Many developers believe it's good idea to secure sensitive
40
+ environment files and variables. You can use RoRo to
41
+ generate secret keys known only to you for use in any
42
+ environment, and then use them to encrypt and decrypt
43
+ these files. Would you like to add RoRo to your Gemfile?
44
+ choices:
45
+ y: 'Yes'
46
+ n: 'No'
47
+ default: y
48
+
49
+ gitignore_sensitive_files:
50
+ question: |
51
+ If you plan to use the environment files RoRo generates for
52
+ your own environment variables, it's a good idea to keep
53
+ these files out of source control. Would you like RoRo to
54
+ modify your .gitignore file to accomplish this for you ?
55
+ choices:
56
+ y: 'Yes'
57
+ n: 'No'
58
+ default: y
59
+
60
+ insert_hfci_gem_into_gemfile:
61
+ question: |
62
+ Jim Weirich passed too soon and remains missed. In addition
63
+ to Rake, Jim wrote a beautiful gem called 'Given' that makes
64
+ Rspec and Minitest less ugly and thus your tests more easy to
65
+ write. Would you like to install a gem called
66
+ handsome_fencer-test that allows you to try it out?
67
+ choices:
68
+ y: 'Yes'
69
+ n: 'No'
70
+ default: n
71
+
72
+ backup_existing_files:
73
+ question: |
74
+ RoRo will be generating a number of files, some of which will
75
+ replace existing ones. Would you like to back them up?
76
+ choices:
77
+ y: 'Yes'
78
+ n: 'No'
79
+ default: n
80
+
81
+ copy_dockerignore:
82
+ question: |
83
+ Would you like to create a .dockerignore file?
84
+ choices:
85
+ y: 'Yes'
86
+ n: 'No'
87
+ default: y
88
+
89
+ configure_database:
90
+ question: |
91
+ RoRo can reliably dockerize your Rails app with either
92
+ MySQL or PostgreSQL stories. Which story would you prefer
93
+ to roll on?
94
+ choices:
95
+ p: PostgreSQL
96
+ m: MySQL
97
+ default: p
98
+
99
+ env_vars:
100
+ DATABASE_HOST: database
101
+
102
+ database:
103
+ name: database
104
+ vendor: postgresql
105
+ vendors:
106
+ postgresql:
107
+ images:
108
+ official_name:
109
+ versions:
110
+ - latest
111
+ env_vars:
112
+ POSTGRES_USER: postgres
113
+ POSTGRES_PASSWORD: your-postgres-password
114
+
115
+ mysql:
116
+ env_vars:
117
+ MYSQL_ROOT_PASSWORD: root
118
+ MYSQL_PASSWORD: root
119
+ MYSQL_USERNAME: root
120
+ MYSQL_DATABASE_PORT: '3306'
121
+
122
+ frontend:
123
+ name: frontend
124
+ vendors:
125
+
126
+ - frontend
127
+ - vuejs
128
+ - react
129
+ - angular
130
+ webserver:
131
+ default: nginx
132
+ vendors:
133
+ - nginx
134
+ application_server:
135
+ name: appserver
136
+ vendors:
137
+ - unicorn:
138
+ - puma:
139
+ registries:
140
+ dockerhub:
141
+ env_vars:
142
+ DOCKERHUB_EMAIL: your-docker-hub-email
143
+ DOCKERHUB_ORG: your-docker-hub-org-name
144
+ DOCKERHUB_PASSWORD: your-docker-hub-password
145
+ DOCKERHUB_USER: your-docker-hub-user-name
146
+
147
+ ci_cd:
148
+ semaphore:
149
+ circleci:
150
+ env_vars:
151
+ DEPLOY_TAG: "${CIRCLE_SHA1:0:7}"
152
+
153
+ deployment:
154
+ env_vars:
155
+ SERVER_HOST: "ip-address-of-your-server"
156
+ SERVER_PORT: '22'
157
+ SERVER_USER: root
@@ -0,0 +1,4 @@
1
+ <% config['mysql_env_vars'].each do |k,v| %><%= "\n" + k + "=" + v %><% end %>
2
+ MYSQL_DATABASE=<%= config['main_app_name'] + "_db"%>
3
+ RAILS_ENV=<%= config['rails_env'] %>
4
+ RAILS_LOG_TO_STDOUT=true
@@ -0,0 +1,5 @@
1
+ <% config['postgresql_env_vars'].each do |k,v| %><%= "\n" + k + "=" + v %><% end %>
2
+ POSTGRES_DB=<%= config['main_app_name'] + "_" + config['rails_env'] %>
3
+ RAILS_ENV=<%= config['rails_env'] %>
4
+ RAILS_LOG_TO_STDOUT=true
5
+
@@ -0,0 +1 @@
1
+ DATABASE_HOST=database
@@ -0,0 +1,15 @@
1
+ ---
2
+ main_app_name: greenfield
3
+ database_host: database
4
+ ruby_version: '2.7'
5
+ frontend_service: frontend
6
+ webserver_service: nginx
7
+ database_service: database
8
+ database_vendor: mysql
9
+ mysql_env_vars:
10
+ MYSQL_ROOT_PASSWORD: root
11
+ MYSQL_PASSWORD: root
12
+ MYSQL_USERNAME: root
13
+ MYSQL_DATABASE_PORT: '3306'
14
+ thor_actions:
15
+ insert_hfci_gem_into_gemfile: y
@@ -0,0 +1,44 @@
1
+ FROM ruby:<%= config['ruby_version'] %>
2
+ LABEL maintainer="<%= config['dockerhub_email'] %>"
3
+
4
+
5
+ ## Make sure we have yarn properly sourced:
6
+ RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
7
+ RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
8
+
9
+ ## Update OS and download yarm from source specified above:
10
+ RUN apt-get update -qq && apt-get install -y build-essential git nodejs yarn
11
+
12
+ ## Set up our workspace directories:
13
+ ENV APP_HOME /usr/src/app/
14
+ RUN mkdir ${APP_HOME}
15
+
16
+ ## Tell bundler where to store downloaded gems:
17
+ ENV BUNDLE_PATH /gems
18
+ RUN mkdir ${BUNDLE_PATH}}
19
+
20
+ ## Tell Docker to create volumes for our workspace and gems
21
+ ## so other containers can access them.
22
+ VOLUME ${APP_HOME}
23
+ VOLUME /gems
24
+
25
+ ## To speed up development, copy Gemfile and Gemfile.lock from host
26
+ ## and then bundle so changing other parts of the app don't trigger
27
+ ## a full gem install.
28
+ COPY Gemfile* ./
29
+
30
+ WORKDIR ${APP_HOME}
31
+
32
+ RUN bundle
33
+
34
+ COPY roro/docker-entrypoint.sh /usr/bin/docker-entrypoint.sh
35
+ RUN chmod +x /usr/bin/docker-entrypoint.sh
36
+ ENTRYPOINT ["docker-entrypoint.sh"]
37
+
38
+ COPY . /usr/src/app/
39
+
40
+ # RUN chmod +x /usr/src/app/roro/docker-entrypoint.sh
41
+ # ENTRYPOINT ["/usr/src/app/roro/docker-entrypoint.sh"]
42
+
43
+
44
+
@@ -0,0 +1,19 @@
1
+ default: &default
2
+ adapter: mysql2
3
+ encoding: utf8
4
+ pool: <%= ENV.fetch('RAILS_MAX_THREADS') { 5 } %>
5
+ host: <%= ENV.fetch('DATABASE_HOST') %>
6
+ username: <%= ENV.fetch('MYSQL_USERNAME') %>
7
+ password: <%= ENV.fetch('MYSQL_PASSWORD') %>
8
+ database: <%= ENV.fetch('MYSQL_DATABASE') %>
9
+ port: <%= ENV.fetch('MYSQL_DATABASE_PORT') %>
10
+ socket: /var/run/mysqld/mysqlx.sock
11
+
12
+ development:
13
+ <<: *default
14
+
15
+ test:
16
+ <<: *default
17
+
18
+ production:
19
+ <<: *default