modulorails 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +14 -0
- data/.gitignore +2 -0
- data/.travis.yml +23 -4
- data/Appraisals +18 -0
- data/CHANGELOG.md +12 -0
- data/Dockerfile.ruby25 +34 -0
- data/Dockerfile.ruby26 +28 -0
- data/Dockerfile.ruby27 +25 -0
- data/Dockerfile.ruby30 +25 -0
- data/Dockerfile.ruby31 +25 -0
- data/Gemfile.lock +59 -52
- data/README.md +16 -4
- data/Rakefile +1 -1
- data/docker-compose.yml +37 -0
- data/entrypoints/appraisal_test.sh +7 -0
- data/gemfiles/rails_52.gemfile +9 -0
- data/gemfiles/rails_60.gemfile +9 -0
- data/gemfiles/rails_61.gemfile +9 -0
- data/gemfiles/rails_70.gemfile +9 -0
- data/lib/generators/{docker → modulorails/docker}/docker_generator.rb +1 -1
- data/lib/generators/{docker → modulorails/docker}/templates/Dockerfile.prod.tt +14 -9
- data/lib/generators/{docker → modulorails/docker}/templates/Dockerfile.tt +5 -7
- data/lib/generators/{docker → modulorails/docker}/templates/config/database.yml.tt +11 -0
- data/lib/generators/{docker → modulorails/docker}/templates/docker-compose.prod.yml.tt +18 -4
- data/lib/generators/modulorails/docker/templates/docker-compose.yml.tt +71 -0
- data/lib/generators/{docker → modulorails/docker}/templates/entrypoints/docker-entrypoint.sh.tt +0 -0
- data/lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt +7 -0
- data/lib/generators/{gitlabci → modulorails/gitlabci}/gitlabci_generator.rb +4 -23
- data/lib/generators/modulorails/gitlabci/templates/.gitlab-ci.yml.tt +118 -0
- data/lib/generators/modulorails/gitlabci/templates/.modulorails-gitlab-ci +6 -0
- data/lib/generators/{gitlabci → modulorails/gitlabci}/templates/config/database-ci.yml.tt +0 -0
- data/lib/generators/modulorails/healthcheck/health_check_generator.rb +41 -0
- data/lib/generators/modulorails/healthcheck/templates/.modulorails-health_check +6 -0
- data/lib/generators/modulorails/healthcheck/templates/config/initializers/health_check.rb.tt +100 -0
- data/lib/generators/modulorails/self_update/self_update_generator.rb +32 -0
- data/lib/modulorails/configuration.rb +8 -2
- data/lib/modulorails/data.rb +21 -2
- data/lib/modulorails/railtie.rb +19 -4
- data/lib/modulorails/validators/database_configuration.rb +1 -1
- data/lib/modulorails/version.rb +1 -1
- data/lib/modulorails.rb +34 -15
- data/modulorails.gemspec +2 -0
- metadata +69 -24
- data/lib/generators/docker/templates/docker-compose.yml.tt +0 -37
- data/lib/generators/gitlabci/templates/.gitlab-ci.yml.tt +0 -79
- data/lib/generators/gitlabci/templates/.modulorails-gitlab-ci +0 -3
- data/lib/modulorails/updater.rb +0 -46
@@ -1,10 +1,9 @@
|
|
1
1
|
version: '3.7'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
<%- image_name = Modulorails.data.name.parameterize -%>
|
5
4
|
services:
|
6
5
|
app:
|
7
|
-
image: modulotechgroup/<%=
|
6
|
+
image: modulotechgroup/<%= image_name %>
|
8
7
|
build:
|
9
8
|
context: .
|
10
9
|
dockerfile: Dockerfile.prod
|
@@ -20,13 +19,28 @@ services:
|
|
20
19
|
<%= image_name.upcase %>_DATABASE_NAME: <%= image_name %>
|
21
20
|
RAILS_SERVE_STATIC_FILES: 'true'
|
22
21
|
|
22
|
+
<%- adapter = Modulorails.data.adapter -%>
|
23
|
+
<%- if adapter =~ /mysql/ -%>
|
23
24
|
database:
|
24
|
-
image: mysql:8.0
|
25
|
+
image: mysql/mysql-server:8.0
|
25
26
|
volumes:
|
26
27
|
- db_data:/var/lib/mysql
|
27
28
|
environment:
|
28
29
|
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
|
29
30
|
MYSQL_DATABASE: <%= image_name %>
|
31
|
+
MYSQL_ROOT_HOST: '%'
|
32
|
+
<%- else -%>
|
33
|
+
database:
|
34
|
+
image: postgres:13.5
|
35
|
+
volumes:
|
36
|
+
- db_data:/var/lib/postgresql/data
|
37
|
+
environment:
|
38
|
+
POSTGRES_USER: postgres
|
39
|
+
POSTGRES_PASSWORD: postgres
|
40
|
+
POSTGRES_DB: <%= image_name %>
|
41
|
+
LC_COLLATE: 'en_US.UTF-8'
|
42
|
+
LC_CTYPE: 'en_US.UTF-8'
|
43
|
+
<%- end -%>
|
30
44
|
|
31
45
|
redis:
|
32
46
|
image: redis:6.2-alpine
|
@@ -0,0 +1,71 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
<%- image_name = Modulorails.data.name.parameterize -%>
|
4
|
+
services:
|
5
|
+
app:
|
6
|
+
image: modulotechgroup/<%= image_name %>:dev
|
7
|
+
build:
|
8
|
+
context: .
|
9
|
+
dockerfile: Dockerfile
|
10
|
+
depends_on:
|
11
|
+
- database
|
12
|
+
- redis
|
13
|
+
ports:
|
14
|
+
- '3000:3000'
|
15
|
+
volumes:
|
16
|
+
- .:/app
|
17
|
+
environment:
|
18
|
+
RAILS_ENV: development
|
19
|
+
URL: http://localhost:3000
|
20
|
+
<%= image_name.upcase %>_DATABASE_HOST: database
|
21
|
+
<%= image_name.upcase %>_DATABASE_NAME: <%= image_name %>
|
22
|
+
entrypoint: ./entrypoints/docker-entrypoint.sh
|
23
|
+
|
24
|
+
<%- adapter = Modulorails.data.adapter -%>
|
25
|
+
<%- if adapter =~ /mysql/ -%>
|
26
|
+
database:
|
27
|
+
image: mysql/mysql-server:8.0
|
28
|
+
volumes:
|
29
|
+
- db_data:/var/lib/mysql
|
30
|
+
environment:
|
31
|
+
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
|
32
|
+
MYSQL_DATABASE: <%= image_name %>
|
33
|
+
MYSQL_ROOT_HOST: '%'
|
34
|
+
<%- else-%>
|
35
|
+
database:
|
36
|
+
image: postgres:13.5
|
37
|
+
volumes:
|
38
|
+
- db_data:/var/lib/postgresql/data
|
39
|
+
environment:
|
40
|
+
POSTGRES_USER: postgres
|
41
|
+
POSTGRES_PASSWORD: postgres
|
42
|
+
POSTGRES_DB: <%= image_name %>
|
43
|
+
LC_COLLATE: 'en_US.UTF-8'
|
44
|
+
LC_CTYPE: 'en_US.UTF-8'
|
45
|
+
<%- end-%>
|
46
|
+
|
47
|
+
redis:
|
48
|
+
image: redis:6.2-alpine
|
49
|
+
|
50
|
+
mailcatcher:
|
51
|
+
image: tophfr/mailcatcher
|
52
|
+
ports:
|
53
|
+
- 1080:80
|
54
|
+
|
55
|
+
webpack:
|
56
|
+
image: modulotechgroup/<%= image_name %>:dev
|
57
|
+
build:
|
58
|
+
context: .
|
59
|
+
dockerfile: Dockerfile
|
60
|
+
entrypoint: ./entrypoints/webpack-entrypoint.sh
|
61
|
+
volumes:
|
62
|
+
- .:/app
|
63
|
+
ports:
|
64
|
+
- '3035:3035'
|
65
|
+
environment:
|
66
|
+
NODE_ENV: development
|
67
|
+
RAILS_ENV: development
|
68
|
+
WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
|
69
|
+
|
70
|
+
volumes:
|
71
|
+
db_data:
|
data/lib/generators/{docker → modulorails/docker}/templates/entrypoints/docker-entrypoint.sh.tt
RENAMED
File without changes
|
@@ -2,36 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'rails/generators'
|
4
4
|
|
5
|
-
class GitlabciGenerator < Rails::Generators::Base
|
5
|
+
class Modulorails::GitlabciGenerator < Rails::Generators::Base
|
6
6
|
source_root File.expand_path('templates', __dir__)
|
7
7
|
desc 'This generator creates a template for a .gitlab-ci.yml file at root'
|
8
8
|
|
9
|
-
# Configurations for MySQL/Postgres dockers
|
10
|
-
MYSQL_DOCKER_DB = <<~EOS
|
11
|
-
# Install a MySQL 5.7 database and configure mandatory environment variables
|
12
|
-
# (https://hub.docker.com/_/mysql/)
|
13
|
-
services:
|
14
|
-
- mysql:5.7
|
15
|
-
variables:
|
16
|
-
MYSQL_DATABASE: test
|
17
|
-
MYSQL_ROOT_PASSWORD: password
|
18
|
-
EOS
|
19
|
-
POSTGRES_DOCKER_DB = <<~EOS
|
20
|
-
# Install a Postgres 11 database and configure mandatory environment variables
|
21
|
-
# (https://hub.docker.com/_/postgres/)
|
22
|
-
services:
|
23
|
-
- postgresql:11
|
24
|
-
variables:
|
25
|
-
POSTGRES_DB: test
|
26
|
-
POSTGRES_PASSWORD: password
|
27
|
-
EOS
|
28
|
-
|
29
9
|
def create_config_file
|
30
10
|
# Update the gitlab-ci template
|
31
11
|
template '.gitlab-ci.yml'
|
32
12
|
|
33
|
-
#
|
34
|
-
|
13
|
+
# Remove the database-ci template if it exists.
|
14
|
+
# It used to be referenced by the gitlab-ci template.
|
15
|
+
remove_file 'config/database-ci.yml'
|
35
16
|
|
36
17
|
# Create file to avoid this generator on next modulorails launch
|
37
18
|
create_keep_file
|
@@ -0,0 +1,118 @@
|
|
1
|
+
<%- image_name = Modulorails.data.name.parameterize -%>
|
2
|
+
include:
|
3
|
+
- project: 'modulosource/modulotech/devops/gitlab-ci-templates'
|
4
|
+
file:
|
5
|
+
- '/templates/helm.gitlab-ci.yml'
|
6
|
+
- '/templates/integration.gitlab-ci.yml'
|
7
|
+
- '/templates/docker-buildx.gitlab-ci.yml'
|
8
|
+
|
9
|
+
services:
|
10
|
+
<%- adapter = Modulorails.data.adapter -%>
|
11
|
+
<%- if adapter =~ /mysql/ -%>
|
12
|
+
- mysql:8.0
|
13
|
+
<%- else -%>
|
14
|
+
- postgres:13.5
|
15
|
+
<%- end -%>
|
16
|
+
- redis:6.2
|
17
|
+
|
18
|
+
variables:
|
19
|
+
IMAGE_NAME: <%= image_name %>
|
20
|
+
MYSQL_DATABASE: <%= image_name %>_test
|
21
|
+
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
|
22
|
+
<%= image_name.upcase %>_DATABASE_HOST: mysql
|
23
|
+
|
24
|
+
stages:
|
25
|
+
- test
|
26
|
+
- build
|
27
|
+
- deploy
|
28
|
+
|
29
|
+
test:
|
30
|
+
extends: .test
|
31
|
+
script:
|
32
|
+
- "bundle exec rake db:create RAILS_ENV=test"
|
33
|
+
- "RAILS_ENV=test bundle exec rake db:migrate:reset"
|
34
|
+
- RAILS_ENV=test bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml
|
35
|
+
|
36
|
+
build_integration_image:
|
37
|
+
extends: .build_integration_image
|
38
|
+
|
39
|
+
docker_build:
|
40
|
+
extends: .docker_buildx_push
|
41
|
+
only:
|
42
|
+
- merge_requests
|
43
|
+
- staging
|
44
|
+
|
45
|
+
<%- review_base_url = Modulorails.data.review_base_url -%>
|
46
|
+
<%- if review_base_url.present? -%>
|
47
|
+
deploy_review:
|
48
|
+
extends: .deploy_helm
|
49
|
+
variables:
|
50
|
+
NAMESPACE: <%= image_name %>-$CI_ENVIRONMENT_SLUG
|
51
|
+
NAME: <%= image_name %>
|
52
|
+
CHART_NAME: <%= image_name %>
|
53
|
+
CONFIG_FILE: config/deploy/kubernetes/review.yaml
|
54
|
+
EXTRA_VARS: --set image.tag=$CI_COMMIT_SHORT_SHA --set ingress.hosts[0].host=${CI_ENVIRONMENT_SLUG}.<%= review_base_url %> --set ingress.tls[0].hosts[0]=${CI_ENVIRONMENT_SLUG}.<%= review_base_url %> --set env.url=${CI_ENVIRONMENT_SLUG}.<%= review_base_url %> --set database.password=$DB_PASSWORD --set encryption.key=$ENCRYPTION_KEY
|
55
|
+
environment:
|
56
|
+
name: review/$CI_COMMIT_REF_SLUG
|
57
|
+
url: https://${CI_ENVIRONMENT_SLUG}.<%= review_base_url %>
|
58
|
+
on_stop: stop_review
|
59
|
+
auto_stop_in: 3 days
|
60
|
+
only:
|
61
|
+
- merge_requests
|
62
|
+
|
63
|
+
stop_review:
|
64
|
+
extends: .stop_review
|
65
|
+
variables:
|
66
|
+
NAMESPACE: <%= image_name %>-$CI_ENVIRONMENT_SLUG
|
67
|
+
NAME: <%= image_name %>
|
68
|
+
only:
|
69
|
+
- merge_requests
|
70
|
+
<%- end -%>
|
71
|
+
|
72
|
+
<%- staging_url = Modulorails.data.staging_url -%>
|
73
|
+
<%- if staging_url.present? -%>
|
74
|
+
deploy_staging:
|
75
|
+
extends: .deploy_helm
|
76
|
+
variables:
|
77
|
+
NAMESPACE: <%= image_name %>
|
78
|
+
NAME: <%= image_name %>
|
79
|
+
CHART_NAME: <%= image_name %>
|
80
|
+
CONFIG_FILE: config/deploy/kubernetes/staging.yaml
|
81
|
+
EXTRA_VARS: --set image.tag=$CI_COMMIT_SHORT_SHA --set database.password=$DB_PASSWORD
|
82
|
+
environment:
|
83
|
+
name: staging
|
84
|
+
url: https://<%= staging_url %>
|
85
|
+
only:
|
86
|
+
- staging
|
87
|
+
<%- else -%>
|
88
|
+
deploy_staging:
|
89
|
+
extends: .deploy_capistrano
|
90
|
+
variables:
|
91
|
+
STAGE: staging
|
92
|
+
only:
|
93
|
+
- staging
|
94
|
+
<%- end -%>
|
95
|
+
|
96
|
+
<%- production_url = Modulorails.data.production_url -%>
|
97
|
+
<%- if production_url.present? -%>
|
98
|
+
deploy_production:
|
99
|
+
extends: .deploy_helm
|
100
|
+
variables:
|
101
|
+
NAMESPACE: <%= image_name %>
|
102
|
+
NAME: <%= image_name %>
|
103
|
+
CHART_NAME: <%= image_name %>
|
104
|
+
CONFIG_FILE: config/deploy/kubernetes/production.yaml
|
105
|
+
EXTRA_VARS: --set image.tag=$CI_COMMIT_SHORT_SHA --set database.password=$DB_PASSWORD
|
106
|
+
environment:
|
107
|
+
name: production
|
108
|
+
url: https://<%= production_url %>
|
109
|
+
only:
|
110
|
+
- master
|
111
|
+
<%- else -%>
|
112
|
+
deploy_production:
|
113
|
+
extends: .deploy_capistrano
|
114
|
+
variables:
|
115
|
+
STAGE: production
|
116
|
+
only:
|
117
|
+
- master
|
118
|
+
<%- end -%>
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
class Modulorails::HealthCheckGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
|
+
desc 'This generator creates a configuration for the health_check gem'
|
8
|
+
|
9
|
+
def create_config_file
|
10
|
+
# Update the template
|
11
|
+
template 'config/initializers/health_check.rb'
|
12
|
+
|
13
|
+
# Add the route
|
14
|
+
unless File.read(Rails.root.join('config/routes.rb')).match?('health_check_routes')
|
15
|
+
inject_into_file 'config/routes.rb', after: "Rails.application.routes.draw do\n" do <<~'RUBY'
|
16
|
+
health_check_routes
|
17
|
+
RUBY
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Update the gem and the Gemfile.lock
|
22
|
+
system('bundle install')
|
23
|
+
|
24
|
+
# Create file to avoid this generator on next modulorails launch
|
25
|
+
create_keep_file
|
26
|
+
rescue StandardError => e
|
27
|
+
$stderr.puts("[Modulorails] Error: cannot generate health_check configuration: #{e.message}")
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def create_keep_file
|
33
|
+
file = '.modulorails-health_check'
|
34
|
+
|
35
|
+
# Create file to avoid this generator on next modulorails launch
|
36
|
+
copy_file(file, file)
|
37
|
+
|
38
|
+
say "Add #{file} to git"
|
39
|
+
%x(git add #{file})
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
This file ensures the modulorails gem will not try to override your current
|
2
|
+
config/initializers/health_check.rb file on Rails start.
|
3
|
+
|
4
|
+
If you want to reset your heal_check configuration, you can either:
|
5
|
+
- remove this file,
|
6
|
+
- or run `rails g modulorails:health_check`.
|
@@ -0,0 +1,100 @@
|
|
1
|
+
HealthCheck.setup do |config|
|
2
|
+
|
3
|
+
# uri prefix (no leading slash)
|
4
|
+
config.uri = 'health'
|
5
|
+
|
6
|
+
# Text output upon success
|
7
|
+
config.success = 'success'
|
8
|
+
|
9
|
+
# Text output upon failure
|
10
|
+
config.failure = 'health_check failed'
|
11
|
+
|
12
|
+
# Disable the error message to prevent /health_check from leaking
|
13
|
+
# sensitive information
|
14
|
+
config.include_error_in_response_body = false
|
15
|
+
|
16
|
+
# Log level (success or failure message with error details is sent to rails log unless this is set to nil)
|
17
|
+
config.log_level = 'info'
|
18
|
+
|
19
|
+
# Timeout in seconds used when checking smtp server
|
20
|
+
config.smtp_timeout = 30.0
|
21
|
+
|
22
|
+
# http status code used when plain text error message is output
|
23
|
+
# Set to 200 if you want your want to distinguish between partial (text does not include success) and
|
24
|
+
# total failure of rails application (http status of 500 etc)
|
25
|
+
|
26
|
+
config.http_status_for_error_text = 500
|
27
|
+
|
28
|
+
# http status code used when an error object is output (json or xml)
|
29
|
+
# Set to 200 if you want to distinguish between partial (healthy property == false) and
|
30
|
+
# total failure of rails application (http status of 500 etc)
|
31
|
+
|
32
|
+
config.http_status_for_error_object = 500
|
33
|
+
|
34
|
+
# bucket names to test connectivity - required only if s3 check used, access permissions can be mixed
|
35
|
+
# config.buckets = { 'bucket_name' => %i[R W D] }
|
36
|
+
|
37
|
+
# You can customize which checks happen on a standard health check, eg to set an explicit list use:
|
38
|
+
config.standard_checks = %w[database migrations custom]
|
39
|
+
|
40
|
+
# Or to exclude one check:
|
41
|
+
config.standard_checks -= %w[emailconf]
|
42
|
+
|
43
|
+
# You can set what tests are run with the 'full' or 'all' parameter
|
44
|
+
config.full_checks = %w[database migrations custom email cache redis]
|
45
|
+
# config.full_checks = %w[database migrations custom email cache redis sidekiq-redis s3]
|
46
|
+
|
47
|
+
# Add one or more custom checks that return a blank string if ok, or an error message if there is an error
|
48
|
+
# config.add_custom_check do
|
49
|
+
# CustomHealthCheck.perform_check # any code that returns blank on success and non blank string upon failure
|
50
|
+
# end
|
51
|
+
|
52
|
+
# Add another custom check with a name, so you can call just specific custom checks. This can also be run using
|
53
|
+
# the standard 'custom' check.
|
54
|
+
# You can define multiple tests under the same name - they will be run one after the other.
|
55
|
+
# config.add_custom_check('sometest') do
|
56
|
+
# CustomHealthCheck.perform_another_check # any code that returns blank on success and non blank string upon failure
|
57
|
+
# end
|
58
|
+
|
59
|
+
# max-age of response in seconds
|
60
|
+
# cache-control is public when max_age > 1 and basic_auth_username is not set
|
61
|
+
# You can force private without authentication for longer max_age by
|
62
|
+
# setting basic_auth_username but not basic_auth_password
|
63
|
+
config.max_age = 1
|
64
|
+
|
65
|
+
# Protect health endpoints with basic auth
|
66
|
+
# These default to nil and the endpoint is not protected
|
67
|
+
# config.basic_auth_username = 'my_username'
|
68
|
+
# config.basic_auth_password = 'my_password'
|
69
|
+
|
70
|
+
# Whitelist requesting IPs by a list of IP and/or CIDR ranges, either IPv4 or IPv6 (uses IPAddr.include? method to check)
|
71
|
+
# Defaults to blank which allows any IP
|
72
|
+
# config.origin_ip_whitelist = %w(123.123.123.123 10.11.12.0/24 2400:cb00::/32)
|
73
|
+
|
74
|
+
# Use ActionDispatch::Request's remote_ip method when behind a proxy to pick up the real remote IP for origin_ip_whitelist check
|
75
|
+
# Otherwise uses Rack::Request's ip method (the default, and always used by Middleware), which is more susceptible to spoofing
|
76
|
+
# See https://stackoverflow.com/questions/10997005/whats-the-difference-between-request-remote-ip-and-request-ip-in-rails
|
77
|
+
config.accept_proxied_requests = false
|
78
|
+
|
79
|
+
# http status code used when the ip is not allowed for the request
|
80
|
+
config.http_status_for_ip_whitelist_error = 403
|
81
|
+
|
82
|
+
# rabbitmq
|
83
|
+
# config.rabbitmq_config = {}
|
84
|
+
|
85
|
+
# When redis url/password is non-standard
|
86
|
+
config.redis_url = ENV['REDIS_URL']
|
87
|
+
# Only included if set, as url can optionally include passwords as well
|
88
|
+
# config.redis_password = 'redis_password' # default ENV['REDIS_PASSWORD']
|
89
|
+
|
90
|
+
# Failure Hooks to do something more ...
|
91
|
+
# checks lists the checks requested
|
92
|
+
config.on_failure do |checks, msg|
|
93
|
+
# log msg somewhere
|
94
|
+
end
|
95
|
+
|
96
|
+
config.on_success do |checks|
|
97
|
+
# flag that everything is well
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
# Author: Matthieu 'ciappa_m' Ciappara
|
6
|
+
# This updates modulorails by editing the gemfile and running a bundle update
|
7
|
+
class Modulorails::SelfUpdateGenerator < Rails::Generators::Base
|
8
|
+
source_root File.expand_path('templates', __dir__)
|
9
|
+
desc 'This generator updates Modulorails if required'
|
10
|
+
|
11
|
+
LATEST_VERSION_URL = 'https://rubygems.org/api/v1/versions/modulorails/latest.json'.freeze
|
12
|
+
|
13
|
+
def create_config_file
|
14
|
+
modulorails_version = Gem::Version.new(Modulorails::VERSION)
|
15
|
+
|
16
|
+
# Get the last published version
|
17
|
+
last_published_version_s = HTTParty.get(LATEST_VERSION_URL).parsed_response['version']
|
18
|
+
last_published_version = Gem::Version.new(last_published_version_s)
|
19
|
+
|
20
|
+
# Do nothing if we could not fetch the last published version (whatever the reason)
|
21
|
+
# Or if the current version is the same as the last published version
|
22
|
+
return if last_published_version <= modulorails_version
|
23
|
+
|
24
|
+
# Add gem to Gemfile
|
25
|
+
gsub_file 'Gemfile', /^\s*gem\s['"]modulorails['"].*$/, "gem 'modulorails', '= #{last_published_version}'"
|
26
|
+
|
27
|
+
# Update the gem and the Gemfile.lock
|
28
|
+
system('bundle install')
|
29
|
+
rescue StandardError => e
|
30
|
+
$stderr.puts("[Modulorails] Error: cannot generate health_check configuration: #{e.message}")
|
31
|
+
end
|
32
|
+
end
|
@@ -4,7 +4,7 @@ module Modulorails
|
|
4
4
|
class Configuration
|
5
5
|
# All the keys to configure the gem
|
6
6
|
attr_accessor :_name, :_main_developer, :_project_manager, :_endpoint, :_api_key,
|
7
|
-
:_no_auto_update
|
7
|
+
:_no_auto_update, :_production_url, :_staging_url, :_review_base_url
|
8
8
|
|
9
9
|
# This allows to define a DSL to configure the gem
|
10
10
|
# Example:
|
@@ -14,8 +14,14 @@ module Modulorails
|
|
14
14
|
# config.project_manager 'pm@modulotech.fr'
|
15
15
|
# config.endpoint "intranet's endpoint"
|
16
16
|
# config.api_key "intranet's api key"
|
17
|
+
# config.production_url "production.app.com"
|
18
|
+
# config.staging_url "staging.app.com"
|
19
|
+
# config.review_base_url "review.app.com"
|
17
20
|
# end
|
18
|
-
%i[
|
21
|
+
%i[
|
22
|
+
name main_developer project_manager endpoint api_key no_auto_update production_url staging_url
|
23
|
+
review_base_url
|
24
|
+
].each do |field|
|
19
25
|
define_method(field) do |value=nil|
|
20
26
|
# No value means we want to get the field
|
21
27
|
return send("_#{field}") unless value
|
data/lib/modulorails/data.rb
CHANGED
@@ -10,7 +10,8 @@ module Modulorails
|
|
10
10
|
# All the data handled by this class
|
11
11
|
ATTRIBUTE_KEYS = %i[
|
12
12
|
name main_developer project_manager repository type rails_name ruby_version rails_version
|
13
|
-
bundler_version modulorails_version adapter db_version adapter_version
|
13
|
+
bundler_version modulorails_version adapter db_version adapter_version production_url
|
14
|
+
staging_url review_base_url
|
14
15
|
].freeze
|
15
16
|
|
16
17
|
# Useful if the gem's user need to read one of the data
|
@@ -30,7 +31,7 @@ module Modulorails
|
|
30
31
|
# Get the gem's specifications to fetch the versions of critical gems
|
31
32
|
loaded_specs = Gem.loaded_specs
|
32
33
|
|
33
|
-
# The
|
34
|
+
# The data written by the user in the configuration
|
34
35
|
# The name is the usual name of the project, the one used in conversations at Modulotech
|
35
36
|
@name = configuration.name
|
36
37
|
# The main developer, the lead developer, in short the developer to call when something's
|
@@ -39,6 +40,19 @@ module Modulorails
|
|
39
40
|
# The project manager of the application; the other person to call when something's wrong with
|
40
41
|
# the application ;)
|
41
42
|
@project_manager = configuration.project_manager
|
43
|
+
# The URL of the production environment for the application
|
44
|
+
@production_url = configuration.production_url
|
45
|
+
# The URL of the staging environment for the application
|
46
|
+
@staging_url = configuration.staging_url
|
47
|
+
# The base URL of the review environment for the application.
|
48
|
+
# A real review URL is built like this at Modulotech:
|
49
|
+
# https://review-#{shortened_branch_name}-#{ci_slug}.#{review_base_url}
|
50
|
+
# Example:
|
51
|
+
# review_base_url: dev.app.com
|
52
|
+
# branch_name: 786-a_super_branch => shortened_branch_name: 786-a_sup
|
53
|
+
# ci_slug: jzzham
|
54
|
+
# |-> https://review-786-a_sup-jzzham.dev.app.com/
|
55
|
+
@review_base_url = configuration.review_base_url
|
42
56
|
|
43
57
|
# Theorically, origin is the main repository of the project and git is the sole VCS we use
|
44
58
|
# at Modulotech
|
@@ -101,6 +115,11 @@ module Modulorails
|
|
101
115
|
'adapter' => @adapter,
|
102
116
|
'db_version' => @db_version,
|
103
117
|
'gem_version' => @adapter_version
|
118
|
+
},
|
119
|
+
'urls' => {
|
120
|
+
'production' => @production_url,
|
121
|
+
'staging' => @staging_url,
|
122
|
+
'review_base' => @review_base_url
|
104
123
|
}
|
105
124
|
}
|
106
125
|
}
|
data/lib/modulorails/railtie.rb
CHANGED
@@ -1,9 +1,24 @@
|
|
1
1
|
module Modulorails
|
2
|
+
# Bind in the Rails lifecycle
|
2
3
|
class Railtie < ::Rails::Railtie
|
3
|
-
#
|
4
|
-
|
4
|
+
# Update and add gems before we load the configuration
|
5
|
+
config.before_configuration do
|
6
|
+
# Currently, we limit everything to the development environment
|
7
|
+
if Rails.env.development?
|
8
|
+
# Check database configuration
|
9
|
+
Modulorails.generate_healthcheck_template
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Require the gem before we read the health_check initializer
|
14
|
+
config.before_initialize do
|
15
|
+
require 'health_check'
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sending data after the initialization ensures we can access
|
19
|
+
# all gems, constants and configurations we might need.
|
5
20
|
config.after_initialize do
|
6
|
-
#
|
21
|
+
# Currently, we limit everything to the development environment
|
7
22
|
if Rails.env.development?
|
8
23
|
# Load translations
|
9
24
|
I18n.load_path += [File.expand_path('../../../config/locales/en.yml', __FILE__)]
|
@@ -18,7 +33,7 @@ module Modulorails
|
|
18
33
|
Modulorails.check_database_config
|
19
34
|
|
20
35
|
# Gem's self-update if a new version was released
|
21
|
-
|
36
|
+
Modulorails.self_update
|
22
37
|
end
|
23
38
|
end
|
24
39
|
end
|
@@ -31,7 +31,7 @@ module Modulorails
|
|
31
31
|
|
32
32
|
def call
|
33
33
|
database_configuration = check_standard_config_file_location
|
34
|
-
return
|
34
|
+
return [:standard_config_file_location] unless database_configuration
|
35
35
|
|
36
36
|
check_test_database_not_equals_dev_database(database_configuration)
|
37
37
|
check_rules_for_environment(database_configuration, :development)
|
data/lib/modulorails/version.rb
CHANGED