modulorails 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +14 -0
  3. data/.gitignore +3 -0
  4. data/.travis.yml +23 -4
  5. data/Appraisals +18 -0
  6. data/CHANGELOG.md +37 -0
  7. data/Dockerfile.ruby25 +34 -0
  8. data/Dockerfile.ruby26 +28 -0
  9. data/Dockerfile.ruby27 +25 -0
  10. data/Dockerfile.ruby30 +25 -0
  11. data/Dockerfile.ruby31 +25 -0
  12. data/Gemfile.lock +61 -54
  13. data/README.md +16 -4
  14. data/Rakefile +1 -1
  15. data/docker-compose.yml +37 -0
  16. data/entrypoints/appraisal_test.sh +7 -0
  17. data/gemfiles/rails_52.gemfile +9 -0
  18. data/gemfiles/rails_60.gemfile +9 -0
  19. data/gemfiles/rails_61.gemfile +9 -0
  20. data/gemfiles/rails_70.gemfile +9 -0
  21. data/lib/generators/modulorails/docker/docker_generator.rb +19 -0
  22. data/lib/generators/modulorails/docker/templates/Dockerfile.prod.tt +57 -0
  23. data/lib/generators/modulorails/docker/templates/Dockerfile.tt +26 -0
  24. data/lib/generators/modulorails/docker/templates/config/database.yml.tt +32 -0
  25. data/lib/generators/modulorails/docker/templates/docker-compose.prod.yml.tt +50 -0
  26. data/lib/generators/modulorails/docker/templates/docker-compose.yml.tt +71 -0
  27. data/lib/generators/modulorails/docker/templates/entrypoints/docker-entrypoint.sh.tt +20 -0
  28. data/lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt +7 -0
  29. data/lib/generators/modulorails/gitlabci/gitlabci_generator.rb +34 -0
  30. data/lib/generators/modulorails/gitlabci/templates/.gitlab-ci.yml.tt +118 -0
  31. data/lib/generators/modulorails/gitlabci/templates/.modulorails-gitlab-ci +6 -0
  32. data/lib/generators/modulorails/gitlabci/templates/config/database-ci.yml.tt +8 -0
  33. data/lib/generators/modulorails/healthcheck/health_check_generator.rb +41 -0
  34. data/lib/generators/modulorails/healthcheck/templates/.modulorails-health_check +6 -0
  35. data/lib/generators/modulorails/healthcheck/templates/config/initializers/health_check.rb.tt +100 -0
  36. data/lib/generators/modulorails/self_update/self_update_generator.rb +32 -0
  37. data/lib/modulorails/configuration.rb +8 -2
  38. data/lib/modulorails/data.rb +23 -3
  39. data/lib/modulorails/railtie.rb +18 -3
  40. data/lib/modulorails/validators/database_configuration.rb +1 -1
  41. data/lib/modulorails/version.rb +1 -1
  42. data/lib/modulorails.rb +34 -21
  43. data/modulorails.gemspec +2 -0
  44. metadata +69 -17
  45. data/lib/generators/gitlabci_generator.rb +0 -132
  46. data/lib/generators/templates/.gitlab-ci.yml +0 -72
  47. data/lib/generators/templates/.modulorails-gitlab-ci +0 -3
  48. data/lib/generators/templates/config/database-ci.yml +0 -7
  49. data/lib/modulorails/updater.rb +0 -42
data/lib/modulorails.rb CHANGED
@@ -2,9 +2,10 @@ require 'modulorails/version'
2
2
  require 'modulorails/configuration'
3
3
  require 'modulorails/data'
4
4
  require 'modulorails/validators/database_configuration'
5
- require 'modulorails/updater'
6
5
  require 'modulorails/railtie' if defined?(Rails::Railtie)
7
- require 'generators/gitlabci_generator'
6
+ require 'generators/modulorails/gitlabci/gitlabci_generator'
7
+ require 'generators/modulorails/healthcheck/health_check_generator'
8
+ require 'generators/modulorails/self_update/self_update_generator'
8
9
  require 'httparty'
9
10
 
10
11
  # Author: Matthieu 'ciappa_m' Ciappara
@@ -77,17 +78,25 @@ module Modulorails
77
78
  # Define the JSON body of the request
78
79
  body = data.to_params.to_json
79
80
 
80
- # Post to the configured endpoint on the Intranet
81
- response = HTTParty.post(configuration.endpoint, headers: headers, body: body)
82
-
83
- # According to the API specification, on a "Bad request" response, the server explicits what
84
- # went wrong with an `errors` field. We do not want to raise since the gem's user is not
85
- # (necessarily) responsible for the error but we still need to display it somewhere to warn
86
- # the user something went wrong.
87
- puts("Modulorails errors: #{response['errors'].join(', ')}") if response.code == 400
88
-
89
- # Return the response to allow users to do some more
90
- response
81
+ # Prevent HTTParty to raise error and crash the server in dev
82
+ begin
83
+ # Post to the configured endpoint on the Intranet
84
+ response = HTTParty.post(configuration.endpoint, headers: headers, body: body)
85
+
86
+ # According to the API specification, on a "Bad request" response, the server explicits what
87
+ # went wrong with an `errors` field. We do not want to raise since the gem's user is not
88
+ # (necessarily) responsible for the error but we still need to display it somewhere to warn
89
+ # the user something went wrong.
90
+ puts("[Modulorails] Error: #{response['errors'].join(', ')}") if response.code == 400
91
+
92
+ # Return the response to allow users to do some more
93
+ response
94
+ rescue StandardError => e
95
+ # Still need to notify the user
96
+ puts("[Modulorails] Error: Could not post to #{configuration.endpoint}")
97
+ puts e.message
98
+ nil
99
+ end
91
100
  else
92
101
  raise Error.new('No endpoint or api key')
93
102
  end
@@ -100,13 +109,7 @@ module Modulorails
100
109
  def generate_ci_template
101
110
  return if File.exists?(Rails.root.join('.modulorails-gitlab-ci'))
102
111
 
103
- generator_options = [
104
- '--app', data.rails_name.parameterize,
105
- '--database', data.adapter,
106
- '--bundler', data.bundler_version,
107
- '--ruby_version', data.ruby_version
108
- ]
109
- GitlabciGenerator.new([], generator_options, {}).invoke_all
112
+ Modulorails::GitlabciGenerator.new([], {}, {}).invoke_all
110
113
  end
111
114
 
112
115
  # @author Matthieu 'ciappa_m' Ciappara
@@ -130,9 +133,19 @@ module Modulorails
130
133
  # Check the last version of Modulorails available on rubygems and update if there was a
131
134
  # publication
132
135
  def self_update
133
- Modulorails::Updater.call unless configuration.no_auto_update
136
+ Modulorails::SelfUpdateGenerator.new([], {}, {}).invoke_all unless configuration.no_auto_update
134
137
  rescue StandardError => e
135
138
  puts("[Modulorails] An error occured: #{e.class} - #{e.message}")
136
139
  end
140
+
141
+ # @author Matthieu 'ciappa_m' Ciappara
142
+ #
143
+ # Generate a health_check configuration unless it was already done.
144
+ # The check is done using a 'keepfile'.
145
+ def generate_healthcheck_template
146
+ return if File.exists?(Rails.root.join('.modulorails-health_check'))
147
+
148
+ Modulorails::HealthCheckGenerator.new([], {}, {}).invoke_all
149
+ end
137
150
  end
138
151
  end
data/modulorails.gemspec CHANGED
@@ -33,6 +33,8 @@ Gem::Specification.new do |spec|
33
33
  spec.add_runtime_dependency 'git', '~> 1.7', '>= 1.7.0'
34
34
  spec.add_runtime_dependency 'httparty'
35
35
  spec.add_runtime_dependency 'i18n'
36
+ spec.add_runtime_dependency 'health_check', '~> 3.1'
36
37
 
37
38
  spec.add_development_dependency 'activerecord', '>= 4.2.0'
39
+ spec.add_development_dependency "appraisal"
38
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modulorails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu Ciappara
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-30 00:00:00.000000000 Z
11
+ date: 2022-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -28,22 +28,22 @@ dependencies:
28
28
  name: git
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.7'
34
31
  - - ">="
35
32
  - !ruby/object:Gem::Version
36
33
  version: 1.7.0
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: '1.7'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
42
- - !ruby/object:Gem::Version
43
- version: '1.7'
44
41
  - - ">="
45
42
  - !ruby/object:Gem::Version
46
43
  version: 1.7.0
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.7'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: httparty
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: health_check
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.1'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.1'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: activerecord
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +100,20 @@ dependencies:
86
100
  - - ">="
87
101
  - !ruby/object:Gem::Version
88
102
  version: 4.2.0
103
+ - !ruby/object:Gem::Dependency
104
+ name: appraisal
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
89
117
  description: |
90
118
  Modulorails is the common base for the Ruby on Rails project at Modulotech
91
119
  (https://www.modulotech.fr/).
@@ -98,11 +126,18 @@ executables: []
98
126
  extensions: []
99
127
  extra_rdoc_files: []
100
128
  files:
129
+ - ".dockerignore"
101
130
  - ".gitignore"
102
131
  - ".rspec"
103
132
  - ".travis.yml"
133
+ - Appraisals
104
134
  - CHANGELOG.md
105
135
  - CODE_OF_CONDUCT.md
136
+ - Dockerfile.ruby25
137
+ - Dockerfile.ruby26
138
+ - Dockerfile.ruby27
139
+ - Dockerfile.ruby30
140
+ - Dockerfile.ruby31
106
141
  - Gemfile
107
142
  - Gemfile.lock
108
143
  - LICENSE.txt
@@ -111,15 +146,32 @@ files:
111
146
  - bin/console
112
147
  - bin/setup
113
148
  - config/locales/en.yml
114
- - lib/generators/gitlabci_generator.rb
115
- - lib/generators/templates/.gitlab-ci.yml
116
- - lib/generators/templates/.modulorails-gitlab-ci
117
- - lib/generators/templates/config/database-ci.yml
149
+ - docker-compose.yml
150
+ - entrypoints/appraisal_test.sh
151
+ - gemfiles/rails_52.gemfile
152
+ - gemfiles/rails_60.gemfile
153
+ - gemfiles/rails_61.gemfile
154
+ - gemfiles/rails_70.gemfile
155
+ - lib/generators/modulorails/docker/docker_generator.rb
156
+ - lib/generators/modulorails/docker/templates/Dockerfile.prod.tt
157
+ - lib/generators/modulorails/docker/templates/Dockerfile.tt
158
+ - lib/generators/modulorails/docker/templates/config/database.yml.tt
159
+ - lib/generators/modulorails/docker/templates/docker-compose.prod.yml.tt
160
+ - lib/generators/modulorails/docker/templates/docker-compose.yml.tt
161
+ - lib/generators/modulorails/docker/templates/entrypoints/docker-entrypoint.sh.tt
162
+ - lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt
163
+ - lib/generators/modulorails/gitlabci/gitlabci_generator.rb
164
+ - lib/generators/modulorails/gitlabci/templates/.gitlab-ci.yml.tt
165
+ - lib/generators/modulorails/gitlabci/templates/.modulorails-gitlab-ci
166
+ - lib/generators/modulorails/gitlabci/templates/config/database-ci.yml.tt
167
+ - lib/generators/modulorails/healthcheck/health_check_generator.rb
168
+ - lib/generators/modulorails/healthcheck/templates/.modulorails-health_check
169
+ - lib/generators/modulorails/healthcheck/templates/config/initializers/health_check.rb.tt
170
+ - lib/generators/modulorails/self_update/self_update_generator.rb
118
171
  - lib/modulorails.rb
119
172
  - lib/modulorails/configuration.rb
120
173
  - lib/modulorails/data.rb
121
174
  - lib/modulorails/railtie.rb
122
- - lib/modulorails/updater.rb
123
175
  - lib/modulorails/validators/database_configuration.rb
124
176
  - lib/modulorails/version.rb
125
177
  - modulorails.gemspec
@@ -130,7 +182,7 @@ metadata:
130
182
  homepage_uri: https://github.com/moduloTech/modulorails
131
183
  source_code_uri: https://github.com/moduloTech/modulorails
132
184
  changelog_uri: https://github.com/moduloTech/modulorails/blob/master/CHANGELOG.md
133
- post_install_message:
185
+ post_install_message:
134
186
  rdoc_options: []
135
187
  require_paths:
136
188
  - lib
@@ -145,8 +197,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
197
  - !ruby/object:Gem::Version
146
198
  version: '0'
147
199
  requirements: []
148
- rubygems_version: 3.1.2
149
- signing_key:
200
+ rubygems_version: 3.0.3
201
+ signing_key:
150
202
  specification_version: 4
151
203
  summary: Common base for Ruby on Rails projects at Modulotech
152
204
  test_files: []
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails/generators'
4
-
5
- class GitlabciGenerator < Rails::Generators::Base
6
- source_root File.expand_path('templates', __dir__)
7
- class_option(:app,
8
- required: true, type: :string,
9
- desc: 'Specify the application name.')
10
- class_option(:database,
11
- required: true, type: :string,
12
- desc: 'Specify the database to use (either mysql or postgres).')
13
- class_option(:bundler,
14
- required: true, type: :string,
15
- desc: 'Specify the Bundler version.')
16
- class_option(:ruby_version,
17
- required: true, type: :string,
18
- desc: 'Specify the Ruby version.')
19
- desc 'This generator creates a template for a .gitlab-ci.yml file at root'
20
-
21
- # Configurations for MySQL/Postgres dockers
22
- MYSQL_DOCKER_DB = <<~EOS
23
- # Install a MySQL 5.7 database and configure mandatory environment variables
24
- # (https://hub.docker.com/_/mysql/)
25
- services:
26
- - mysql:5.7
27
- variables:
28
- MYSQL_DATABASE: test
29
- MYSQL_ROOT_PASSWORD: password
30
- EOS
31
- POSTGRES_DOCKER_DB = <<~EOS
32
- # Install a Postgres 11 database and configure mandatory environment variables
33
- # (https://hub.docker.com/_/postgres/)
34
- services:
35
- - postgresql:11
36
- variables:
37
- POSTGRES_DB: test
38
- POSTGRES_PASSWORD: password
39
- EOS
40
-
41
- def create_config_file
42
- # Get the configuration for the database engine
43
- db_conf = database_config(options[:database])
44
-
45
- # Update the gitlab-ci template
46
- update_gitlab_ci(options, db_conf)
47
-
48
- # Update the database-ci template
49
- update_database_ci(db_conf)
50
-
51
- # Create file to avoid this generator on next modulorails launch
52
- create_keep_file
53
- end
54
-
55
- private
56
-
57
- def update_gitlab_ci(options, db_conf)
58
- file = '.gitlab-ci.yml'
59
- exists = File.exists?(file)
60
-
61
- # Remove original file if there is one
62
- remove_file file if exists
63
-
64
- # Copy file
65
- copy_file file, file
66
-
67
- # Add the correct database docker
68
- prepend_file file, db_conf[:header]
69
-
70
- # Replace key for CI/CD cache
71
- gsub_file file, 'CI_CD_CACHE_KEY', "#{options[:app]}-ci_cd"
72
-
73
- # Replace key for bundler version
74
- gsub_file file, 'BUNDLER_VERSION', options[:bundler]
75
-
76
- # Replace ruby version
77
- gsub_file file, 'RUBY_VERSION', '2.5.0'
78
-
79
- # Warn the user about file overwrite/creation
80
- warn_file_update(file, exists)
81
- end
82
-
83
- def update_database_ci(db_conf)
84
- file = 'config/database-ci.yml'
85
- exists = File.exists?(file)
86
-
87
- # Remove original file if there is one
88
- remove_file file if exists
89
-
90
- # Copy file
91
- copy_file file, file
92
-
93
- # Replace configuration
94
- gsub_file file, 'HOST', db_conf[:host]
95
- gsub_file file, 'ADAPTER', db_conf[:adapter]
96
- gsub_file file, 'DATABASE', 'test'
97
-
98
- # Warn the user about file overwrite/creation
99
- warn_file_update(file, exists)
100
- end
101
-
102
- def database_config(database)
103
- case database
104
- when 'mysql', 'mysql2'
105
- { header: MYSQL_DOCKER_DB, host: 'mysql', adapter: 'mysql2' }
106
- when 'postgres', 'postgresql'
107
- { header: POSTGRES_DOCKER_DB, host: 'postgres', adapter: 'postgresql' }
108
- else
109
- raise 'Unknown database: either mysql or postgres'
110
- end
111
- end
112
-
113
- def warn_file_update(file, exists)
114
- intro = if exists
115
- "/!\\ Watch out! Your #{file} was overwritten"
116
- else
117
- "A new file #{file} was added"
118
- end
119
-
120
- say "#{intro} by Modulorails. Ensure everything is correct!"
121
- end
122
-
123
- def create_keep_file
124
- file = '.modulorails-gitlab-ci'
125
-
126
- # Create file to avoid this generator on next modulorails launch
127
- copy_file(file, file)
128
-
129
- say "Add #{file} to git"
130
- %x(git add #{file})
131
- end
132
- end
@@ -1,72 +0,0 @@
1
- image: ruby:RUBY_VERSION
2
- stages:
3
- - lint
4
- - test
5
- - deploy
6
- cache:
7
- key: CI_CD_CACHE_KEY
8
- paths:
9
- - vendor/ruby
10
-
11
- before_script:
12
- - apt-get update -qy
13
- - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
14
- - eval $(ssh-agent -s)
15
- - ssh-add <(echo "$SSH_PRIVATE_KEY")
16
- - mkdir -p ~/.ssh
17
- - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
18
- - apt-get install -y ruby-dev
19
- - gem install bundler -v BUNDLER_VERSION --no-document
20
- # You might need DPL if you're deploying using Heroku
21
- #- gem install dpl -v 1.10.15 --no-document
22
- # You might need to add some configurations here like a key for a theme
23
- #- bundle config gems.rapidrailsthemes.com "$RRT_CFG"
24
- - bundle install -j $(nproc) --path vendor
25
-
26
- rubocop:
27
- stage: lint
28
- script:
29
- - bundle exec rubocop -D
30
- tags:
31
- - rails
32
- except:
33
- - master
34
- - staging
35
-
36
- test:
37
- stage: test
38
- script:
39
- - cp config/database-ci.yml config/database.yml
40
- - "bundle exec rake db:create RAILS_ENV=test"
41
- - "RAILS_ENV=test bundle exec rake db:migrate:reset"
42
- - bundle exec rspec
43
- tags:
44
- - rails
45
- except:
46
- - master
47
-
48
- staging:
49
- stage: deploy
50
- script:
51
- # Uncomment the next line and update the application name if you're using DPL to deploy on
52
- # Heroku
53
- #- dpl --provider=heroku --app=APP_NAME --api-key=$HEROKU_API_KEY
54
- # Remove the next line if you're not using Capistrano
55
- - bundle exec cap staging deploy
56
- only:
57
- - staging
58
- tags:
59
- - rails
60
-
61
- production:
62
- stage: deploy
63
- script:
64
- # Uncomment the next line and update the application name if you're using DPL to deploy on
65
- # Heroku
66
- #- dpl --provider=heroku --app=APP_NAME --api-key=$HEROKU_API_KEY
67
- # Remove the next line if you're not using Capistrano
68
- - bundle exec cap production deploy
69
- only:
70
- - master
71
- tags:
72
- - rails
@@ -1,3 +0,0 @@
1
- This file ensures the modulorails gem will not try to override your current .gitlab-ci.yml file.
2
-
3
- You can remove this file if you want the generator to rewrite your .gitlab-ci.yml file.
@@ -1,7 +0,0 @@
1
- test:
2
- host: HOST
3
- adapter: ADAPTER
4
- database: DATABASE
5
- username: root
6
- password: password
7
- encoding: utf8
@@ -1,42 +0,0 @@
1
- module Modulorails
2
- # Author: Matthieu 'ciappa_m' Ciappara
3
- # This updates modulorails by editing the gemfile and running a bundle update
4
- class Updater
5
- LATEST_VERSION_URL = 'https://rubygems.org/api/v1/versions/modulorails/latest.json'.freeze
6
-
7
- def self.call(*args)
8
- new(*args).call
9
- end
10
-
11
- def call
12
- # Get the last published version
13
- @last_published_version = HTTParty.get(LATEST_VERSION_URL).parsed_response['version']
14
-
15
- # Do nothing if we could not fetch the last published version (whatever the reason)
16
- # Or if the current version is the same as the last published version
17
- return if @last_published_version.nil? || @last_published_version == Modulorails::VERSION
18
-
19
- # If the last published version is different from the current version, we update the gem
20
- edit_gemfile
21
- end
22
-
23
- private
24
-
25
- def edit_gemfile
26
- # Read the lines of the Gemfile
27
- gemfile_location = Rails.root.join('Gemfile')
28
- lines = File.readlines gemfile_location
29
-
30
- # Search and replace the modulorails line
31
- index = lines.index { |l| l =~ /gem\s['"]modulorails['"]/ }
32
- lines[index].gsub!(/(\s*)gem\s['"]modulorails['"].*/,
33
- "#{$1}gem 'modulorails', '= #{@last_published_version}'")
34
-
35
- # Update the Gemfile
36
- File.open(gemfile_location, 'w') { |f| f.puts(lines) }
37
-
38
- # Update the gem
39
- `bundle install || bundle update modulorails`
40
- end
41
- end
42
- end