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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +99 -0
- data/.circleci/setup-gem-credentials.sh +3 -0
- data/.gitignore +7 -1
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile.lock +24 -10
- data/Guardfile +46 -0
- data/bin/roro +5 -0
- data/docker/env_files/.keep +0 -0
- data/docker/env_files/circleci.env.enc +2 -0
- data/docker/keys/.keep +0 -0
- data/lib/roro.rb +2 -0
- data/lib/roro/cli.rb +18 -0
- data/lib/roro/cli/base.rb +124 -0
- data/lib/roro/cli/dockerize.rb +30 -0
- data/lib/roro/cli/expose.rb +13 -0
- data/lib/roro/cli/generate_keys.rb +79 -0
- data/lib/roro/cli/greenfield.rb +37 -0
- data/lib/roro/cli/obfuscate.rb +20 -0
- data/lib/roro/cli/rollon.rb +21 -0
- data/lib/roro/cli/templates/Gemfile.lock +0 -0
- data/lib/roro/cli/templates/Guardfile +81 -0
- data/lib/roro/cli/templates/circleci/Rakefile +4 -0
- data/lib/roro/cli/templates/circleci/config.job-example.yml +33 -0
- data/lib/roro/cli/templates/circleci/config.yml +69 -0
- data/lib/roro/cli/templates/circleci/config.yml.workflow-example +62 -0
- data/lib/roro/cli/templates/circleci/deploy.rake +127 -0
- data/lib/roro/cli/templates/config.yml +71 -0
- data/lib/roro/cli/templates/config/database.yml +20 -0
- data/lib/roro/cli/templates/docker-compose.yml +51 -0
- data/lib/roro/cli/templates/docker/containers/app/Dockerfile.tt +12 -0
- data/lib/roro/cli/templates/docker/containers/database/.keep +0 -0
- data/lib/roro/cli/templates/docker/containers/web/Dockerfile.tt +18 -0
- data/lib/roro/cli/templates/docker/containers/web/app.conf.tt +23 -0
- data/lib/roro/cli/templates/docker/env_files/.keep +0 -0
- data/lib/roro/cli/templates/docker/keys/.keep +0 -0
- data/lib/roro/cli/templates/docker/overrides/circleci.yml.tt +19 -0
- data/lib/roro/cli/templates/docker/overrides/production.yml.tt +26 -0
- data/lib/roro/cli/templates/docker/web/Dockerfile +20 -0
- data/lib/roro/cli/templates/docker/web/app.conf +23 -0
- data/lib/roro/cli/templates/gitignore +27 -0
- data/lib/roro/cli/templates/greenfield/Dockerfile +8 -0
- data/lib/roro/cli/templates/greenfield/Gemfile +2 -0
- data/lib/roro/cli/templates/greenfield/Gemfile.lock +0 -0
- data/lib/roro/cli/templates/greenfield/config/database.yml.example +16 -0
- data/lib/roro/cli/templates/greenfield/docker-compose.yml +15 -0
- data/lib/roro/cli/templates/lib/tasks/deploy.rake +126 -0
- data/lib/roro/version.rb +1 -1
- data/lib/tasks/deploy.rake +126 -0
- data/roro.gemspec +9 -2
- data/test_apps/dummy/.gitignore +27 -0
- data/test_apps/dummy/Gemfile +61 -0
- data/test_apps/dummy/README.md +24 -0
- data/test_apps/dummy/Rakefile +6 -0
- data/test_apps/dummy/app/assets/config/manifest.js +3 -0
- data/test_apps/dummy/app/assets/images/.keep +0 -0
- data/test_apps/dummy/app/assets/javascripts/application.js +16 -0
- data/test_apps/dummy/app/assets/javascripts/cable.js +13 -0
- data/test_apps/dummy/app/assets/javascripts/channels/.keep +0 -0
- data/test_apps/dummy/app/assets/stylesheets/application.css +15 -0
- data/test_apps/dummy/app/channels/application_cable/channel.rb +4 -0
- data/test_apps/dummy/app/channels/application_cable/connection.rb +4 -0
- data/test_apps/dummy/app/controllers/application_controller.rb +2 -0
- data/test_apps/dummy/app/controllers/concerns/.keep +0 -0
- data/test_apps/dummy/app/helpers/application_helper.rb +2 -0
- data/test_apps/dummy/app/jobs/application_job.rb +2 -0
- data/test_apps/dummy/app/mailers/application_mailer.rb +4 -0
- data/test_apps/dummy/app/models/application_record.rb +3 -0
- data/test_apps/dummy/app/models/concerns/.keep +0 -0
- data/test_apps/dummy/app/views/layouts/application.html.erb +15 -0
- data/test_apps/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test_apps/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test_apps/dummy/bin/bundle +3 -0
- data/test_apps/dummy/bin/rails +4 -0
- data/test_apps/dummy/bin/rake +4 -0
- data/test_apps/dummy/bin/setup +36 -0
- data/test_apps/dummy/bin/update +31 -0
- data/test_apps/dummy/bin/yarn +11 -0
- data/test_apps/dummy/config.ru +5 -0
- data/test_apps/dummy/config/application.rb +19 -0
- data/test_apps/dummy/config/boot.rb +4 -0
- data/test_apps/dummy/config/cable.yml +10 -0
- data/test_apps/dummy/config/credentials.yml.enc +1 -0
- data/test_apps/dummy/config/database.yml +85 -0
- data/test_apps/dummy/config/environment.rb +5 -0
- data/test_apps/dummy/config/environments/development.rb +61 -0
- data/test_apps/dummy/config/environments/production.rb +94 -0
- data/test_apps/dummy/config/environments/test.rb +46 -0
- data/test_apps/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/test_apps/dummy/config/initializers/assets.rb +14 -0
- data/test_apps/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test_apps/dummy/config/initializers/content_security_policy.rb +25 -0
- data/test_apps/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test_apps/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test_apps/dummy/config/initializers/inflections.rb +16 -0
- data/test_apps/dummy/config/initializers/mime_types.rb +4 -0
- data/test_apps/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test_apps/dummy/config/locales/en.yml +33 -0
- data/test_apps/dummy/config/puma.rb +34 -0
- data/test_apps/dummy/config/routes.rb +3 -0
- data/test_apps/dummy/config/spring.rb +6 -0
- data/test_apps/dummy/config/storage.yml +34 -0
- data/test_apps/dummy/db/seeds.rb +7 -0
- data/test_apps/dummy/lib/assets/.keep +0 -0
- data/test_apps/dummy/lib/tasks/.keep +0 -0
- data/test_apps/dummy/log/.keep +0 -0
- data/test_apps/dummy/package.json +5 -0
- data/test_apps/dummy/public/404.html +67 -0
- data/test_apps/dummy/public/422.html +67 -0
- data/test_apps/dummy/public/500.html +66 -0
- data/test_apps/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/test_apps/dummy/public/apple-touch-icon.png +0 -0
- data/test_apps/dummy/public/favicon.ico +0 -0
- data/test_apps/dummy/public/robots.txt +1 -0
- data/test_apps/dummy/storage/.keep +0 -0
- data/test_apps/dummy/test/application_system_test_case.rb +5 -0
- data/test_apps/dummy/test/controllers/.keep +0 -0
- data/test_apps/dummy/test/fixtures/.keep +0 -0
- data/test_apps/dummy/test/fixtures/files/.keep +0 -0
- data/test_apps/dummy/test/helpers/.keep +0 -0
- data/test_apps/dummy/test/integration/.keep +0 -0
- data/test_apps/dummy/test/mailers/.keep +0 -0
- data/test_apps/dummy/test/models/.keep +0 -0
- data/test_apps/dummy/test/system/.keep +0 -0
- data/test_apps/dummy/test/test_helper.rb +10 -0
- data/test_apps/dummy/vendor/.keep +0 -0
- data/test_apps/dummy_roro/.circleci/Rakefile +4 -0
- data/test_apps/dummy_roro/.circleci/config.job-example.yml +33 -0
- data/test_apps/dummy_roro/.circleci/config.yml +69 -0
- data/test_apps/dummy_roro/.circleci/config.yml.workflow-example +62 -0
- data/test_apps/dummy_roro/.circleci/deploy.rake +127 -0
- data/test_apps/dummy_roro/.gitignore +27 -0
- data/test_apps/dummy_roro/Gemfile +64 -0
- data/test_apps/dummy_roro/README.md +24 -0
- data/test_apps/dummy_roro/Rakefile +6 -0
- data/test_apps/dummy_roro/app/assets/config/manifest.js +3 -0
- data/test_apps/dummy_roro/app/assets/images/.keep +0 -0
- data/test_apps/dummy_roro/app/assets/javascripts/application.js +16 -0
- data/test_apps/dummy_roro/app/assets/javascripts/cable.js +13 -0
- data/test_apps/dummy_roro/app/assets/javascripts/channels/.keep +0 -0
- data/test_apps/dummy_roro/app/assets/stylesheets/application.css +15 -0
- data/test_apps/dummy_roro/app/channels/application_cable/channel.rb +4 -0
- data/test_apps/dummy_roro/app/channels/application_cable/connection.rb +4 -0
- data/test_apps/dummy_roro/app/controllers/application_controller.rb +2 -0
- data/test_apps/dummy_roro/app/controllers/concerns/.keep +0 -0
- data/test_apps/dummy_roro/app/helpers/application_helper.rb +2 -0
- data/test_apps/dummy_roro/app/jobs/application_job.rb +2 -0
- data/test_apps/dummy_roro/app/mailers/application_mailer.rb +4 -0
- data/test_apps/dummy_roro/app/models/application_record.rb +3 -0
- data/test_apps/dummy_roro/app/models/concerns/.keep +0 -0
- data/test_apps/dummy_roro/app/views/layouts/application.html.erb +15 -0
- data/test_apps/dummy_roro/app/views/layouts/mailer.html.erb +13 -0
- data/test_apps/dummy_roro/app/views/layouts/mailer.text.erb +1 -0
- data/test_apps/dummy_roro/bin/bundle +3 -0
- data/test_apps/dummy_roro/bin/rails +4 -0
- data/test_apps/dummy_roro/bin/rake +4 -0
- data/test_apps/dummy_roro/bin/setup +36 -0
- data/test_apps/dummy_roro/bin/update +31 -0
- data/test_apps/dummy_roro/bin/yarn +11 -0
- data/test_apps/dummy_roro/config.ru +5 -0
- data/test_apps/dummy_roro/config/application.rb +19 -0
- data/test_apps/dummy_roro/config/boot.rb +4 -0
- data/test_apps/dummy_roro/config/cable.yml +10 -0
- data/test_apps/dummy_roro/config/credentials.yml.enc +1 -0
- data/test_apps/dummy_roro/config/database.yml +20 -0
- data/test_apps/dummy_roro/config/environment.rb +5 -0
- data/test_apps/dummy_roro/config/environments/development.rb +61 -0
- data/test_apps/dummy_roro/config/environments/production.rb +94 -0
- data/test_apps/dummy_roro/config/environments/test.rb +46 -0
- data/test_apps/dummy_roro/config/initializers/application_controller_renderer.rb +8 -0
- data/test_apps/dummy_roro/config/initializers/assets.rb +14 -0
- data/test_apps/dummy_roro/config/initializers/backtrace_silencers.rb +7 -0
- data/test_apps/dummy_roro/config/initializers/content_security_policy.rb +25 -0
- data/test_apps/dummy_roro/config/initializers/cookies_serializer.rb +5 -0
- data/test_apps/dummy_roro/config/initializers/filter_parameter_logging.rb +4 -0
- data/test_apps/dummy_roro/config/initializers/inflections.rb +16 -0
- data/test_apps/dummy_roro/config/initializers/mime_types.rb +4 -0
- data/test_apps/dummy_roro/config/initializers/wrap_parameters.rb +14 -0
- data/test_apps/dummy_roro/config/locales/en.yml +33 -0
- data/test_apps/dummy_roro/config/puma.rb +34 -0
- data/test_apps/dummy_roro/config/routes.rb +3 -0
- data/test_apps/dummy_roro/config/spring.rb +6 -0
- data/test_apps/dummy_roro/config/storage.yml +34 -0
- data/test_apps/dummy_roro/db/seeds.rb +7 -0
- data/test_apps/dummy_roro/docker-compose.yml +51 -0
- data/test_apps/dummy_roro/docker/containers/app/Dockerfile +12 -0
- data/test_apps/dummy_roro/docker/containers/app/circleci.env +2 -0
- data/test_apps/dummy_roro/docker/containers/app/development.env +2 -0
- data/test_apps/dummy_roro/docker/containers/app/production.env +2 -0
- data/test_apps/dummy_roro/docker/containers/app/staging.env +2 -0
- data/test_apps/dummy_roro/docker/containers/database/.keep +0 -0
- data/test_apps/dummy_roro/docker/containers/database/circleci.env +3 -0
- data/test_apps/dummy_roro/docker/containers/database/development.env +3 -0
- data/test_apps/dummy_roro/docker/containers/database/production.env +3 -0
- data/test_apps/dummy_roro/docker/containers/database/staging.env +3 -0
- data/test_apps/dummy_roro/docker/containers/web/Dockerfile +18 -0
- data/test_apps/dummy_roro/docker/containers/web/app.conf +23 -0
- data/test_apps/dummy_roro/docker/containers/web/circleci.env +1 -0
- data/test_apps/dummy_roro/docker/containers/web/development.env +1 -0
- data/test_apps/dummy_roro/docker/containers/web/production.env +1 -0
- data/test_apps/dummy_roro/docker/containers/web/staging.env +1 -0
- data/test_apps/dummy_roro/docker/env_files/circleci.env +12 -0
- data/test_apps/dummy_roro/docker/env_files/circleci.env.enc +14 -0
- data/test_apps/dummy_roro/docker/env_files/production.env +2 -0
- data/test_apps/dummy_roro/docker/env_files/production.env.enc +2 -0
- data/test_apps/dummy_roro/docker/keys/.keep +0 -0
- data/test_apps/dummy_roro/docker/overrides/circleci.yml +19 -0
- data/test_apps/dummy_roro/docker/overrides/production.yml +26 -0
- data/test_apps/dummy_roro/lib/assets/.keep +0 -0
- data/test_apps/dummy_roro/lib/tasks/.keep +0 -0
- data/test_apps/dummy_roro/lib/tasks/deploy.rake +126 -0
- data/test_apps/dummy_roro/log/.keep +0 -0
- data/test_apps/dummy_roro/package.json +5 -0
- data/test_apps/dummy_roro/public/404.html +67 -0
- data/test_apps/dummy_roro/public/422.html +67 -0
- data/test_apps/dummy_roro/public/500.html +66 -0
- data/test_apps/dummy_roro/public/apple-touch-icon-precomposed.png +0 -0
- data/test_apps/dummy_roro/public/apple-touch-icon.png +0 -0
- data/test_apps/dummy_roro/public/favicon.ico +0 -0
- data/test_apps/dummy_roro/public/robots.txt +1 -0
- data/test_apps/dummy_roro/storage/.keep +0 -0
- data/test_apps/dummy_roro/test/application_system_test_case.rb +5 -0
- data/test_apps/dummy_roro/test/controllers/.keep +0 -0
- data/test_apps/dummy_roro/test/fixtures/.keep +0 -0
- data/test_apps/dummy_roro/test/fixtures/files/.keep +0 -0
- data/test_apps/dummy_roro/test/helpers/.keep +0 -0
- data/test_apps/dummy_roro/test/integration/.keep +0 -0
- data/test_apps/dummy_roro/test/mailers/.keep +0 -0
- data/test_apps/dummy_roro/test/models/.keep +0 -0
- data/test_apps/dummy_roro/test/system/.keep +0 -0
- data/test_apps/dummy_roro/test/test_helper.rb +10 -0
- data/test_apps/dummy_roro/vendor/.keep +0 -0
- data/test_apps/greenfield/.keep +0 -0
- 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,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
|