roro 0.3.18 → 0.3.21
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 +12 -6
- data/lib/roro.rb +1 -0
- data/lib/roro/cli/generate/exposed.rb +1 -1
- data/lib/roro/cli/generate/keys.rb +2 -2
- data/lib/roro/cli/generate/obfuscated.rb +4 -4
- data/lib/roro/cli/rollon.rb +1 -1
- data/lib/roro/crypto.rb +73 -0
- data/lib/roro/version.rb +1 -1
- data/roro.gemspec +2 -11
- data/roro/containers/app/Dockerfile +51 -0
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 43e30bd9aa551984852307e9c258049546a167e89aaab22e3f8b7256cec22a23
|
4
|
+
data.tar.gz: 790ad729852cf34c8bbdfa6499ab325f399334d1df2c385d20e7ae5757dcd707
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4de76d1807c627790a721e968e458bcff335d9a972b8b496d5a1dfc494c8b750332eae75411dc689482bb3e60fab44319fa46cc95c63547cedfa5c849e527ce5
|
7
|
+
data.tar.gz: b7f2647884d116fc849431070829e2806f244771580a532f57e65cabbf17d856bf209d76e425eee28e370eee90ef6d10f0ab8de10998503bc058da846387bb78
|
data/.circleci/config.yml
CHANGED
@@ -14,8 +14,14 @@ defaults: &defaults
|
|
14
14
|
major_only: &major_only
|
15
15
|
filters:
|
16
16
|
branches:
|
17
|
-
only: master
|
18
|
-
|
17
|
+
only: master
|
18
|
+
|
19
|
+
release: &release
|
20
|
+
filters:
|
21
|
+
branches:
|
22
|
+
only: release
|
23
|
+
|
24
|
+
|
19
25
|
version: 2.1
|
20
26
|
|
21
27
|
executors:
|
@@ -79,7 +85,9 @@ workflows:
|
|
79
85
|
|
80
86
|
build-cli:
|
81
87
|
jobs:
|
82
|
-
- build
|
88
|
+
- build:
|
89
|
+
<<: *major_only
|
90
|
+
<<: *release
|
83
91
|
- test-rollon-rails:
|
84
92
|
<<: *major_only
|
85
93
|
- test:
|
@@ -88,6 +96,4 @@ workflows:
|
|
88
96
|
- release:
|
89
97
|
requires:
|
90
98
|
- build
|
91
|
-
|
92
|
-
branches:
|
93
|
-
only: release
|
99
|
+
<<: *release
|
data/lib/roro.rb
CHANGED
@@ -45,7 +45,7 @@ module Roro
|
|
45
45
|
def gather_environments
|
46
46
|
environments = []
|
47
47
|
['.env', '.env.enc'].each do |extension|
|
48
|
-
|
48
|
+
Roro::Crypto.source_files('roro', extension).each do |env_file|
|
49
49
|
environments << env_file.split('/').last.split(extension).last
|
50
50
|
end
|
51
51
|
end
|
@@ -54,7 +54,7 @@ module Roro
|
|
54
54
|
|
55
55
|
def confirm_files_decrypted?(environment)
|
56
56
|
orphan_encrypted = []
|
57
|
-
|
57
|
+
Roro::Crypto.source_files('.', '.env.enc').each do |file|
|
58
58
|
unless File.exist? file.split('.enc').first
|
59
59
|
orphan_encrypted << file
|
60
60
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'roro/crypto'
|
2
2
|
|
3
3
|
module Roro
|
4
4
|
|
@@ -6,11 +6,11 @@ module Roro
|
|
6
6
|
|
7
7
|
desc "generate::obfuscated", "obfuscates any files matching the pattern ./roro/**/*.env"
|
8
8
|
map "generate::obfuscated" => "generate_obfuscated"
|
9
|
-
|
10
|
-
def generate_obfuscated(*args)
|
9
|
+
|
10
|
+
def generate_obfuscated(*args)
|
11
11
|
environments = args.first ? [args.first] : gather_environments
|
12
12
|
environments.each do |environment|
|
13
|
-
|
13
|
+
Roro::Crypto.obfuscate(environment, 'roro')
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/roro/cli/rollon.rb
CHANGED
@@ -4,7 +4,7 @@ module Roro
|
|
4
4
|
class << self
|
5
5
|
private
|
6
6
|
def shared_options!
|
7
|
-
method_option :omakase,
|
7
|
+
method_option :omakase, desc: "Use the Roro setup with some configuring. 'Omakase' translates as 'I'll leave it up to you.'", aliases: ['-d', '--default']
|
8
8
|
method_option :fatsutofodo, desc: 'Use the Roro setup without having to think.', aliases: ['-f', '--fast']
|
9
9
|
method_option :okonomi, desc: "Use Roro how you like. 'Okonomi' has the opposite meaning of omakase.", aliases: ['-i', '--interactive']
|
10
10
|
end
|
data/lib/roro/crypto.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require "openssl"
|
2
|
+
require "base64"
|
3
|
+
module Roro::Crypto
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def generate_key
|
8
|
+
@cipher = OpenSSL::Cipher.new 'AES-128-CBC'
|
9
|
+
@salt = '8 octets'
|
10
|
+
@new_key = @cipher.random_key
|
11
|
+
Base64.encode64(@new_key)
|
12
|
+
end
|
13
|
+
|
14
|
+
def write_to_file(data, filename)
|
15
|
+
File.open(filename, "w") { |io| io.write data }
|
16
|
+
end
|
17
|
+
|
18
|
+
def generate_key_file(directory, environment)
|
19
|
+
write_to_file(generate_key, directory + "/" + environment + ".key")
|
20
|
+
end
|
21
|
+
|
22
|
+
def source_files(directory=nil, extension=nil)
|
23
|
+
Dir.glob(directory + "/**/*#{extension}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_cipher(environment)
|
27
|
+
@cipher = OpenSSL::Cipher.new 'AES-128-CBC'
|
28
|
+
@salt = '8 octets'
|
29
|
+
@pass_phrase = get_key(environment)
|
30
|
+
@cipher.encrypt.pkcs5_keyivgen @pass_phrase, @salt
|
31
|
+
end
|
32
|
+
|
33
|
+
def encrypt(file, environment=nil)
|
34
|
+
environment ||= file.split('.')[-2].split('/').last
|
35
|
+
build_cipher(environment)
|
36
|
+
encrypted = @cipher.update(File.read file) + @cipher.final
|
37
|
+
write_to_file(Base64.encode64(encrypted), file + '.enc')
|
38
|
+
end
|
39
|
+
|
40
|
+
def decrypt(file, environment=nil)
|
41
|
+
environment ||= file.split('.')[-3].split('/').last
|
42
|
+
build_cipher(environment)
|
43
|
+
encrypted = Base64.decode64 File.read(file)
|
44
|
+
@cipher.decrypt.pkcs5_keyivgen @pass_phrase, @salt
|
45
|
+
decrypted = @cipher.update(encrypted) + @cipher.final
|
46
|
+
decrypted_file = file.split('.enc').first
|
47
|
+
write_to_file decrypted, decrypted_file
|
48
|
+
end
|
49
|
+
|
50
|
+
def obfuscate(env=nil, dir=nil, ext=nil)
|
51
|
+
ext = ext || "#{env}.env"
|
52
|
+
source_files(dir, ext).each { |file| encrypt(file, env) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def expose(env=nil, dir=nil, ext=nil)
|
56
|
+
ext = ext || "#{env}.env.enc"
|
57
|
+
source_files(dir, ext).each { |file| decrypt(file, env) }
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_key(environment, directory=nil)
|
61
|
+
env_key = environment.upcase + '_KEY'
|
62
|
+
key_file = source_files('./.', "#{directory}/#{environment}.key").first
|
63
|
+
case
|
64
|
+
when ENV[env_key].nil? && key_file.nil?
|
65
|
+
raise DeployKeyError, "No #{env_key} set."
|
66
|
+
when ENV[env_key]
|
67
|
+
ENV[env_key]
|
68
|
+
when File.exist?(key_file)
|
69
|
+
File.read(key_file).strip
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/roro/version.rb
CHANGED
data/roro.gemspec
CHANGED
@@ -14,37 +14,28 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.homepage = "https://github.com/schadenfred/roro"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
17
|
if spec.respond_to?(:metadata)
|
20
|
-
|
21
18
|
spec.metadata["homepage_uri"] = spec.homepage
|
22
19
|
spec.metadata["source_code_uri"] = "https://github.com/schadenfred/roro"
|
23
|
-
|
24
20
|
else
|
25
21
|
raise "RubyGems 2.0 or newer is required to protect against " \
|
26
22
|
"public gem pushes."
|
27
23
|
end
|
28
24
|
|
29
|
-
# Specify which files should be added to the gem when it is released.
|
30
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
31
25
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
32
26
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
33
27
|
end
|
34
|
-
|
28
|
+
|
35
29
|
spec.executables << 'roro'
|
36
|
-
# spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
|
-
# spec.bindir = "exe"
|
38
|
-
# spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
39
30
|
spec.require_paths = ['lib']
|
40
31
|
spec.add_dependency 'gem-release', '~> 2.1'
|
41
|
-
spec.add_dependency 'handsome_fencer-crypto', '~> 0.1.9'
|
42
32
|
spec.add_dependency 'rake', '~> 13.0', '>= 13.0.1'
|
43
33
|
spec.add_dependency 'sshkit', '~> 1.21'
|
44
34
|
spec.add_dependency 'thor', '~> 1.0', '>= 1.0.1'
|
45
35
|
spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
|
46
36
|
spec.add_development_dependency 'byebug', '~> 11.1', '>= 11.1.3'
|
47
37
|
spec.add_development_dependency 'handsome_fencer-test', '~> 0.2.2'
|
38
|
+
spec.add_development_dependency 'readline'
|
48
39
|
spec.add_development_dependency 'mocha', '~> 1.11', '>= 1.11.2'
|
49
40
|
|
50
41
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
FROM ruby:2.7.0-alpine AS builder
|
2
|
+
|
3
|
+
LABEL maintainer="your-docker-registry-email using RoRo"
|
4
|
+
|
5
|
+
# Add basic packages
|
6
|
+
RUN apk add --no-cache \
|
7
|
+
build-base \
|
8
|
+
postgresql-dev \
|
9
|
+
git \
|
10
|
+
nodejs \
|
11
|
+
yarn \
|
12
|
+
tzdata \
|
13
|
+
file
|
14
|
+
|
15
|
+
## Set APP_HOME and BUNDLE_PATH as using ENV instructions:
|
16
|
+
ENV APP_HOME /usr/src/app/
|
17
|
+
ENV BUNDLE_PATH /gems
|
18
|
+
|
19
|
+
## Create both as directories to make sure they exist:
|
20
|
+
RUN mkdir -p ${APP_HOME}
|
21
|
+
RUN mkdir ${BUNDLE_PATH}
|
22
|
+
|
23
|
+
## Tell Docker to create volumes for our workspace and gems
|
24
|
+
## so other containers can access them.
|
25
|
+
|
26
|
+
RUN gem install bundler:2.1.4
|
27
|
+
|
28
|
+
WORKDIR ${APP_HOME}
|
29
|
+
|
30
|
+
## Create a Gemfile with just the Rails gem inside:
|
31
|
+
RUN echo -e "source 'https://rubygems.org'\ngem 'rails'" > Gemfile
|
32
|
+
|
33
|
+
## Bundle to install rails:
|
34
|
+
RUN bundle install
|
35
|
+
|
36
|
+
## Use Rails to generate a new app. We'll configure it later.
|
37
|
+
RUN bundle exec rails new . \
|
38
|
+
--database=postgresql \
|
39
|
+
--skip-bundle \
|
40
|
+
--skip-webpack-install
|
41
|
+
RUN bundle --jobs 4
|
42
|
+
RUN bundle exec rails webpacker:install
|
43
|
+
RUN bundle exec rails yarn:install
|
44
|
+
## Tell docker not to create a layer:
|
45
|
+
FROM scratch AS export-stage
|
46
|
+
|
47
|
+
## Copy the generated files onto the host. Note that because we are in a
|
48
|
+
## new container, we don't have access to the previous ${APP_HOME}
|
49
|
+
## variable and so we must hard code it as our source:
|
50
|
+
COPY --from=builder /usr/src/app/ .
|
51
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- schadenfred
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem-release
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.1'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: handsome_fencer-crypto
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.1.9
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1.9
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +132,20 @@ dependencies:
|
|
146
132
|
- - "~>"
|
147
133
|
- !ruby/object:Gem::Version
|
148
134
|
version: 0.2.2
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: readline
|
137
|
+
requirement: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
type: :development
|
143
|
+
prerelease: false
|
144
|
+
version_requirements: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '0'
|
149
149
|
- !ruby/object:Gem::Dependency
|
150
150
|
name: mocha
|
151
151
|
requirement: !ruby/object:Gem::Requirement
|
@@ -214,6 +214,7 @@ files:
|
|
214
214
|
- lib/roro/configurator/eligibility.rb
|
215
215
|
- lib/roro/configurator/okonomi.rb
|
216
216
|
- lib/roro/configurator/omakase.rb
|
217
|
+
- lib/roro/crypto.rb
|
217
218
|
- lib/roro/stories/greenfield.yml
|
218
219
|
- lib/roro/stories/greenfield/rails.yml
|
219
220
|
- lib/roro/stories/rollon.yml
|
@@ -308,6 +309,7 @@ files:
|
|
308
309
|
- lib/roro/version.rb
|
309
310
|
- roro.gemspec
|
310
311
|
- roro/containers/.keep
|
312
|
+
- roro/containers/app/Dockerfile
|
311
313
|
- roro/containers/ruby_image/Dockerfile
|
312
314
|
- roro/containers/ruby_image/ci.env.enc
|
313
315
|
- roro/keys/.keep
|
@@ -335,8 +337,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
337
|
- !ruby/object:Gem::Version
|
336
338
|
version: '0'
|
337
339
|
requirements: []
|
338
|
-
|
339
|
-
rubygems_version: 2.6.13
|
340
|
+
rubygems_version: 3.1.2
|
340
341
|
signing_key:
|
341
342
|
specification_version: 4
|
342
343
|
summary: Containerization framwork for Ruby on Rails applications.
|