modulorails 0.2.1 → 1.0.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 +3 -0
- data/.rubocop.yml +45 -0
- data/.travis.yml +23 -4
- data/Appraisals +18 -0
- data/CHANGELOG.md +41 -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 +60 -53
- data/README.md +16 -4
- data/Rakefile +1 -1
- data/app/assets/stylesheets/modulorails.css +21 -0
- data/app/helpers/modulorails/application_helper.rb +8 -0
- data/config/locales/en.yml +3 -0
- data/docker-compose.debug.yml +47 -0
- 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/modulorails/docker/docker_generator.rb +19 -0
- data/lib/generators/modulorails/docker/templates/Dockerfile.prod.tt +57 -0
- data/lib/generators/modulorails/docker/templates/Dockerfile.tt +26 -0
- data/lib/generators/modulorails/docker/templates/config/database.yml.tt +32 -0
- data/lib/generators/modulorails/docker/templates/docker-compose.prod.yml.tt +50 -0
- data/lib/generators/modulorails/docker/templates/docker-compose.yml.tt +71 -0
- data/lib/generators/modulorails/docker/templates/entrypoints/docker-entrypoint.sh.tt +20 -0
- data/lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt +7 -0
- data/lib/generators/modulorails/gitlabci/gitlabci_generator.rb +34 -0
- 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/modulorails/gitlabci/templates/config/database-ci.yml.tt +8 -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/rubocop/rubocop_generator.rb +24 -0
- data/lib/generators/modulorails/rubocop/templates/rubocop.yml.tt +18 -0
- data/lib/generators/modulorails/self_update/self_update_generator.rb +32 -0
- data/lib/generators/modulorails/service/service_generator.rb +13 -0
- data/lib/generators/modulorails/service/templates/service.rb.tt +28 -0
- data/lib/modulorails/configuration.rb +8 -2
- data/lib/modulorails/data.rb +21 -2
- data/lib/modulorails/error_data.rb +21 -0
- data/lib/modulorails/errors/base_error.rb +4 -0
- data/lib/modulorails/errors/errors.rb +3 -0
- data/lib/modulorails/errors/invalid_format_error.rb +14 -0
- data/lib/modulorails/errors/invalid_value_error.rb +14 -0
- data/lib/modulorails/railtie.rb +35 -3
- data/lib/modulorails/services/base_service.rb +203 -0
- data/lib/modulorails/services/logs_for_method_service.rb +42 -0
- data/lib/modulorails/services/services.rb +2 -0
- data/lib/modulorails/success_data.rb +17 -0
- data/lib/modulorails/validators/database_configuration.rb +9 -3
- data/lib/modulorails/version.rb +4 -1
- data/lib/modulorails.rb +46 -21
- data/modulorails.gemspec +4 -0
- metadata +114 -17
- data/lib/generators/gitlabci_generator.rb +0 -134
- data/lib/generators/templates/.gitlab-ci.yml +0 -72
- data/lib/generators/templates/.modulorails-gitlab-ci +0 -3
- data/lib/generators/templates/config/database-ci.yml +0 -7
- data/lib/modulorails/updater.rb +0 -42
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
class Modulorails::DockerGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
|
+
desc 'This generator creates Dockerfiles for an app'
|
8
|
+
|
9
|
+
def create_config_file
|
10
|
+
template 'Dockerfile'
|
11
|
+
template 'Dockerfile.prod'
|
12
|
+
template 'docker-compose.yml'
|
13
|
+
template 'docker-compose.prod.yml'
|
14
|
+
template 'entrypoints/docker-entrypoint.sh'
|
15
|
+
template 'config/database.yml'
|
16
|
+
rescue StandardError => e
|
17
|
+
$stderr.puts("[Modulorails] Error: cannot generate Docker configuration: #{e.message}")
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# BUILD IMAGE
|
2
|
+
FROM ruby:<%= Modulorails.data.ruby_version %>-alpine as builder
|
3
|
+
|
4
|
+
ENV RAILS_ENV=production
|
5
|
+
WORKDIR /app
|
6
|
+
|
7
|
+
RUN apk add --update --no-cache \
|
8
|
+
alpine-sdk \
|
9
|
+
nodejs \
|
10
|
+
tzdata \
|
11
|
+
yarn \
|
12
|
+
shared-mime-info \
|
13
|
+
<%- adapter = Modulorails.data.adapter -%>
|
14
|
+
<%- if adapter =~ /mysql/ -%>
|
15
|
+
mysql-dev
|
16
|
+
<%- else -%>
|
17
|
+
postgresql-dev
|
18
|
+
<%- end -%>
|
19
|
+
RUN gem install bundler -v <%= Modulorails.data.bundler_version %>
|
20
|
+
|
21
|
+
COPY Gemfile Gemfile.lock ./
|
22
|
+
RUN bundle check || bundle install --deployment --jobs=2 \
|
23
|
+
&& rm -rf vendor/bundle/ruby/*/cache/*
|
24
|
+
|
25
|
+
COPY package.json yarn.lock ./
|
26
|
+
RUN yarn install
|
27
|
+
|
28
|
+
COPY . .
|
29
|
+
RUN bundle exec rake assets:precompile
|
30
|
+
|
31
|
+
# FINAL IMAGE
|
32
|
+
FROM ruby:<%= Modulorails.data.ruby_version %>-alpine
|
33
|
+
|
34
|
+
WORKDIR /app
|
35
|
+
|
36
|
+
RUN apk add --update --no-cache \
|
37
|
+
curl \
|
38
|
+
git \
|
39
|
+
nodejs \
|
40
|
+
tzdata \
|
41
|
+
shared-mime-info \
|
42
|
+
<%- adapter = Modulorails.data.adapter -%>
|
43
|
+
<%- if adapter =~ /mysql/ -%>
|
44
|
+
mysql-dev \
|
45
|
+
<%- else -%>
|
46
|
+
postgresql-dev \
|
47
|
+
<%- end -%>
|
48
|
+
&& rm -rf .git/
|
49
|
+
|
50
|
+
COPY --from=builder /app .
|
51
|
+
|
52
|
+
RUN bundle config --local path vendor/bundle \
|
53
|
+
&& bundle config --local without development:test:assets
|
54
|
+
|
55
|
+
EXPOSE 3000
|
56
|
+
|
57
|
+
ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]
|
@@ -0,0 +1,26 @@
|
|
1
|
+
FROM ruby:<%= Modulorails.data.ruby_version %>-alpine
|
2
|
+
|
3
|
+
ENV RAILS_ENV=development
|
4
|
+
WORKDIR /app
|
5
|
+
|
6
|
+
RUN apk add --update --no-cache \
|
7
|
+
alpine-sdk \
|
8
|
+
nodejs \
|
9
|
+
yarn \
|
10
|
+
tzdata \
|
11
|
+
<%- adapter = Modulorails.data.adapter -%>
|
12
|
+
<%- if adapter =~ /mysql/ -%>
|
13
|
+
mysql-dev
|
14
|
+
<%- else -%>
|
15
|
+
postgresql-dev
|
16
|
+
<%- end -%>
|
17
|
+
RUN gem install bundler -v <%= Modulorails.data.bundler_version %>
|
18
|
+
|
19
|
+
COPY Gemfile Gemfile.lock ./
|
20
|
+
RUN bundle install --jobs=2
|
21
|
+
|
22
|
+
COPY . .
|
23
|
+
|
24
|
+
EXPOSE 3000
|
25
|
+
|
26
|
+
ENTRYPOINT ["./entrypoints/docker-entrypoint.sh"]
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<%- image_name = Modulorails.data.name.parameterize -%>
|
2
|
+
<%- upper_image_name = image_name.upcase -%>
|
3
|
+
<%- adapter = Modulorails.data.adapter -%>
|
4
|
+
<%- if adapter =~ /mysql/ -%>
|
5
|
+
development: &default
|
6
|
+
adapter: mysql2
|
7
|
+
encoding: utf8mb4
|
8
|
+
collation: utf8mb4_unicode_ci
|
9
|
+
database: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_NAME', '<%= image_name %>') %>
|
10
|
+
username: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_USERNAME', 'root') %>
|
11
|
+
password: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_PASSWORD', '') %>
|
12
|
+
host: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_HOST', 'database') %>
|
13
|
+
port: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_PORT', 3306) %>
|
14
|
+
<%- else -%>
|
15
|
+
development: &default
|
16
|
+
adapter: pg
|
17
|
+
database: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_NAME', '<%= image_name %>') %>
|
18
|
+
username: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_USERNAME', 'postgres') %>
|
19
|
+
password: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_PASSWORD', 'postgres') %>
|
20
|
+
host: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_HOST', 'database') %>
|
21
|
+
port: <%%= ENV.fetch('<%= upper_image_name %>_DATABASE_PORT', 5432) %>
|
22
|
+
<%- end -%>
|
23
|
+
|
24
|
+
test:
|
25
|
+
<<: *default
|
26
|
+
database: <%%= ENV.fetch('<%= upper_image_name %>_TEST_DATABASE_NAME', '<%= image_name %>_test') %>
|
27
|
+
|
28
|
+
staging:
|
29
|
+
<<: *default
|
30
|
+
|
31
|
+
production:
|
32
|
+
<<: *default
|
@@ -0,0 +1,50 @@
|
|
1
|
+
version: '3.7'
|
2
|
+
|
3
|
+
<%- image_name = Modulorails.data.name.parameterize -%>
|
4
|
+
services:
|
5
|
+
app:
|
6
|
+
image: modulotechgroup/<%= image_name %>
|
7
|
+
build:
|
8
|
+
context: .
|
9
|
+
dockerfile: Dockerfile.prod
|
10
|
+
depends_on:
|
11
|
+
- database
|
12
|
+
- redis
|
13
|
+
ports:
|
14
|
+
- '3000:3000'
|
15
|
+
environment:
|
16
|
+
RAILS_ENV: production
|
17
|
+
URL: http://localhost:3000
|
18
|
+
<%= image_name.upcase %>_DATABASE_HOST: database
|
19
|
+
<%= image_name.upcase %>_DATABASE_NAME: <%= image_name %>
|
20
|
+
RAILS_SERVE_STATIC_FILES: 'true'
|
21
|
+
|
22
|
+
<%- adapter = Modulorails.data.adapter -%>
|
23
|
+
<%- if adapter =~ /mysql/ -%>
|
24
|
+
database:
|
25
|
+
image: mysql/mysql-server:8.0
|
26
|
+
volumes:
|
27
|
+
- db_data:/var/lib/mysql
|
28
|
+
environment:
|
29
|
+
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
|
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 -%>
|
44
|
+
|
45
|
+
redis:
|
46
|
+
image: redis:6.2-alpine
|
47
|
+
|
48
|
+
# Define the volumes references in the services
|
49
|
+
volumes:
|
50
|
+
db_data:
|
@@ -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:
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
# Exit immediately if a command exits with a non-zero status
|
4
|
+
set -e
|
5
|
+
|
6
|
+
# No `node_modules` directory means `yarn install` was never launched.
|
7
|
+
# It is mandatory to install yarn dependencies.
|
8
|
+
if [ ! -d node_modules ]
|
9
|
+
then
|
10
|
+
yarn install
|
11
|
+
fi
|
12
|
+
|
13
|
+
# Remove pidfile if it exists else the server will not launch
|
14
|
+
if [ -f tmp/pids/server.pid ]
|
15
|
+
then
|
16
|
+
rm tmp/pids/server.pid
|
17
|
+
fi
|
18
|
+
|
19
|
+
# Launch the application listening from all origins on port 3000
|
20
|
+
./bin/bundle exec rails s -b 0.0.0.0 -p 3000
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
class Modulorails::GitlabciGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
|
+
desc 'This generator creates a template for a .gitlab-ci.yml file at root'
|
8
|
+
|
9
|
+
def create_config_file
|
10
|
+
# Update the gitlab-ci template
|
11
|
+
template '.gitlab-ci.yml'
|
12
|
+
|
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'
|
16
|
+
|
17
|
+
# Create file to avoid this generator on next modulorails launch
|
18
|
+
create_keep_file
|
19
|
+
rescue StandardError => e
|
20
|
+
$stderr.puts("[Modulorails] Error: cannot generate CI configuration: #{e.message}")
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def create_keep_file
|
26
|
+
file = '.modulorails-gitlab-ci'
|
27
|
+
|
28
|
+
# Create file to avoid this generator on next modulorails launch
|
29
|
+
copy_file(file, file)
|
30
|
+
|
31
|
+
say "Add #{file} to git"
|
32
|
+
%x(git add #{file})
|
33
|
+
end
|
34
|
+
end
|
@@ -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 -%>
|
@@ -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,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
class Modulorails::RubocopGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path('templates', __dir__)
|
7
|
+
desc 'This generator creates a configuration for Rubocop'
|
8
|
+
|
9
|
+
def create_config_files
|
10
|
+
rubocop_config_path = Rails.root.join('.rubocop.yml')
|
11
|
+
gitlab_config_path = Rails.root.join('.gitlab-ci.yml')
|
12
|
+
|
13
|
+
template "rubocop.yml", rubocop_config_path, force: true
|
14
|
+
|
15
|
+
unless File.read(gitlab_config_path).match?(/\s+extends:\s+.lint\s*$/)
|
16
|
+
append_file gitlab_config_path do
|
17
|
+
<<~YAML
|
18
|
+
rubocop:
|
19
|
+
extends: .lint
|
20
|
+
YAML
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|