stack_car 0.6.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +64 -1
- data/lib/stack_car.rb +1 -0
- data/lib/stack_car/cli.rb +136 -38
- data/lib/stack_car/dot_rc.rb +25 -0
- data/lib/stack_car/version.rb +1 -1
- data/stack_car.gemspec +1 -0
- data/templates/.dockerignore.erb +2 -2
- data/templates/.env.development.erb +2 -0
- data/templates/.env.erb +15 -16
- data/templates/.gitlab-ci.yml.erb +94 -62
- data/templates/Dockerfile.base.erb +28 -19
- data/templates/Dockerfile.erb +26 -7
- data/templates/chart-fcrepo/fcrepo-deploy.yaml +63 -0
- data/templates/chart-fcrepo/fcrepo-env-cm.yaml +8 -0
- data/templates/chart-fcrepo/fcrepo-env-secret.yaml.tt +10 -0
- data/templates/chart-fcrepo/fcrepo-pvc.yaml +20 -0
- data/templates/chart-fcrepo/fcrepo-svc.yaml +19 -0
- data/templates/chart-sidekiq/sidekiq-deploy.yaml +80 -0
- data/templates/chart/.gitignore +3 -0
- data/templates/chart/.helmignore +23 -0
- data/templates/chart/Chart.yaml.tt +29 -0
- data/templates/chart/README.md +223 -0
- data/templates/chart/bin/check_sidekiq.rb +0 -0
- data/templates/chart/bin/decrypt +17 -0
- data/templates/chart/bin/deploy +14 -0
- data/templates/chart/bin/encrypt +15 -0
- data/templates/chart/bin/remove +15 -0
- data/templates/chart/sample-values.yaml.tt +138 -0
- data/templates/chart/templates/_helpers.tpl.tt +85 -0
- data/templates/chart/templates/rails-env-cm.yaml.tt +47 -0
- data/templates/chart/templates/rails-env-secret.yaml +10 -0
- data/templates/chart/templates/rails-pvc-shared.yml +20 -0
- data/templates/chart/templates/setup-job.yaml +73 -0
- data/templates/chart/templates/web-deploy.yaml +67 -0
- data/templates/chart/templates/web-ing-wildcard.yaml +20 -0
- data/templates/chart/templates/web-ing.yaml +20 -0
- data/templates/chart/templates/web-svc.yaml +20 -0
- data/templates/database.yml.erb +10 -10
- data/templates/docker-compose.yml.erb +53 -12
- data/templates/env.conf.erb +11 -9
- data/templates/nginx.sh.erb +17 -0
- metadata +47 -10
- data/templates/docker-compose.ci.yml.erb +0 -87
- data/templates/docker-compose.production.yml.erb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0e8df8e8dbd70e738de0a61cd09489c72e4cd822326b237269d21ebe4dacd258
|
4
|
+
data.tar.gz: 11214bdf66ad316ad4feec518f0ef0e39f9e146aea500c3b7e187a67ecaa33fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65b81508cd79dd4fdff903820133034b4dc894eeaff69a3033e2439b9cae81f5b34e48055a83485e56f3236ea7111cc9dc24d3c8a3a8cdb8341a5b64490e070a
|
7
|
+
data.tar.gz: 60223a2ce56c3173e4c62b8d08e05e1d8c6c5fcd2c64027864cef6aa76857c88e3b9a9ae2d6c88cd4a229f2c858f1f1359959b849faffe129119258500b97b2c
|
data/README.md
CHANGED
@@ -33,7 +33,70 @@ Commands:
|
|
33
33
|
|
34
34
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
35
35
|
|
36
|
-
To install this gem onto your local machine
|
36
|
+
**To install this gem onto your local machine**
|
37
|
+
- Run `bundle exec rake install`
|
38
|
+
|
39
|
+
### Workflow
|
40
|
+
|
41
|
+
**Create a dummy rails app**
|
42
|
+
|
43
|
+
Developing stack_car often requires a rails application for you to run updated commands and templates against. Generate one for this purpose:
|
44
|
+
- `rails new <dummy-app-name>`
|
45
|
+
|
46
|
+
**Make and test your changes**
|
47
|
+
- In stack_car, make your command / template changes
|
48
|
+
- Run `rake install` to update your local gem
|
49
|
+
- In your dummy application, test the updated command
|
50
|
+
- Commit your changes
|
51
|
+
|
52
|
+
### Releasing a new version
|
53
|
+
- Update the version number in `version.rb`
|
54
|
+
- Run `bundle exec rake release`
|
55
|
+
- This will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
56
|
+
|
57
|
+
## Generating a Helm Chart
|
58
|
+
|
59
|
+
stack_car's **dockerize** command can be used in conjunction with available flags to generate a **Helm chart** template for your application. You will need to create the *values* files with necessary configuration values from the *sample-values* provided by stack_car, but the command will effectively give you the baseline Notch8 template (scripts, template files, template helpers, sample values file) for a **Helm base Kubernetes deploy**
|
60
|
+
|
61
|
+
The following examples are to be run in the repo of the application you are creating the chart for.
|
62
|
+
|
63
|
+
**To generate a Helm chart template**
|
64
|
+
|
65
|
+
- `sc dockerize --helm`
|
66
|
+
- This command without additional flags will only generate Rails web related template files
|
67
|
+
|
68
|
+
In broad strokes adding additional flags signals stack_car to generate template files for other services. Note that any configuration that would normally be applied for these services in a non Helm context (without the `--helm` flag) still apply.
|
69
|
+
|
70
|
+
**For example**:
|
71
|
+
- `sc dockerize --helm --fcrepo --solr`
|
72
|
+
- This command will add templates for the **fcrepo** service and add a **solr chart dependency** in the `Chart.yaml` (You can think of `Chart.yaml` like the **Gemfile** or **package.json** of a Helm chart)
|
73
|
+
|
74
|
+
**Creating values files**
|
75
|
+
|
76
|
+
Values files allows you to configure your helm deploy from number of web instances to hostname for your ingress to environment variables required by your application.
|
77
|
+
|
78
|
+
When starting from a new helm chart, you'll want to copy the sample values file to one named after the environment you're creating a deployment for.
|
79
|
+
|
80
|
+
For example:
|
81
|
+
`cp sample-values.yaml staging-values.yaml`
|
82
|
+
|
83
|
+
*Note: You will do this once for every environment you'd like to deploy*
|
84
|
+
|
85
|
+
**Handling values files**
|
86
|
+
|
87
|
+
Since values files are likely to contain sensitive information like API keys, they should never be committed to your repository. The scripts that stack_car includes in your chart simplifies encrypting and decrypting values for version control.
|
88
|
+
|
89
|
+
Example workflow (given values file is already created):
|
90
|
+
- Edit values file
|
91
|
+
- `chart/bin/encrypt staging <keybase-team-name>`
|
92
|
+
- This command will create `staging-values.yaml.enc`
|
93
|
+
- `git add staging-values.yaml.enc`
|
94
|
+
- Commit and push
|
95
|
+
|
96
|
+
When pulling down a repo or branch, you will need to start by decrypting.
|
97
|
+
|
98
|
+
Example:
|
99
|
+
- `chart/bin/decrypt staging`
|
37
100
|
|
38
101
|
## Contributing
|
39
102
|
|
data/lib/stack_car.rb
CHANGED
data/lib/stack_car/cli.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'erb'
|
3
3
|
require 'dotenv/load'
|
4
|
-
|
4
|
+
require 'json'
|
5
|
+
require 'byebug'
|
5
6
|
module StackCar
|
6
7
|
class HammerOfTheGods < Thor
|
7
8
|
include Thor::Actions
|
@@ -19,111 +20,135 @@ module StackCar
|
|
19
20
|
method_option :logs, default: true, type: :boolean
|
20
21
|
desc "up", "starts docker-compose with rebuild and orphan removal, defaults to web"
|
21
22
|
def up
|
23
|
+
setup
|
24
|
+
ensure_development_env
|
22
25
|
args = ['--remove-orphans']
|
23
26
|
args << '--build' if options[:build]
|
24
27
|
if options[:build]
|
25
|
-
run("docker-compose pull #{options[:service]}")
|
28
|
+
run("#{dotenv} docker-compose pull #{options[:service]}")
|
26
29
|
end
|
27
30
|
|
28
|
-
|
31
|
+
run_with_exit("#{dotenv} docker-compose up #{args.join(' ')} #{options[:service]}")
|
29
32
|
end
|
30
33
|
|
31
34
|
method_option :service, default: '', type: :string, aliases: '-s'
|
32
35
|
desc "stop", "stops the specified running service, defaults to all"
|
33
36
|
def stop
|
34
|
-
|
35
|
-
|
37
|
+
setup
|
38
|
+
ensure_development_env
|
39
|
+
run("#{dotenv} docker-compose stop #{options[:service]}")
|
40
|
+
run_with_exit("rm -rf tmp/pids/*")
|
36
41
|
end
|
37
42
|
map down: :stop
|
38
43
|
|
39
44
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
40
45
|
desc "build", "builds specified service, defaults to web"
|
41
46
|
def build
|
42
|
-
|
47
|
+
setup
|
48
|
+
ensure_development_env
|
49
|
+
run_with_exit("#{dotenv} docker-compose build #{options[:service]}")
|
43
50
|
end
|
44
51
|
|
45
52
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
46
53
|
desc "push ARGS", "wraps docker-compose push web unless --service is used to specify"
|
47
54
|
def push(*args)
|
48
|
-
|
55
|
+
setup
|
56
|
+
run_with_exit("#{dotenv} docker-compose push #{options[:service]} #{args.join(' ')}")
|
49
57
|
end
|
50
58
|
|
51
59
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
52
60
|
desc "pull ARGS", "wraps docker-compose pull web unless --service is used to specify"
|
53
61
|
def pull(*args)
|
54
|
-
|
62
|
+
setup
|
63
|
+
run_with_exit("#{dotenv} docker-compose pull #{options[:service]} #{args.join(' ')}")
|
55
64
|
end
|
56
65
|
|
57
66
|
method_option :service, default: '', type: :string, aliases: '-s'
|
58
67
|
desc "ps ARGS", "wraps docker-compose pull web unless --service is used to specify"
|
59
68
|
def ps(*args)
|
60
|
-
|
69
|
+
setup
|
70
|
+
run_with_exit("#{dotenv} docker-compose ps #{options[:service]} #{args.join(' ')}")
|
61
71
|
end
|
62
72
|
map status: :ps
|
63
73
|
|
64
74
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
65
75
|
desc "bundle ARGS", "wraps docker-compose run web unless --service is used to specify"
|
66
76
|
def bundle(*args)
|
67
|
-
|
77
|
+
setup
|
78
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle")
|
68
79
|
end
|
69
80
|
|
70
81
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
71
82
|
desc "walk ARGS", "wraps docker-compose run web unless --service is used to specify"
|
72
83
|
def walk(*args)
|
73
|
-
|
84
|
+
setup
|
85
|
+
run_with_exit("#{dotenv} docker-compose run #{options[:service]} #{args.join(' ')}")
|
74
86
|
end
|
75
87
|
|
76
88
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
77
89
|
desc "exec ARGS", "wraps docker-compose exec web unless --service is used to specify"
|
78
90
|
def exec(*args)
|
79
|
-
|
91
|
+
setup
|
92
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} #{args.join(' ')}")
|
80
93
|
end
|
81
94
|
map ex: :exec
|
82
95
|
|
96
|
+
method_option :service, default: 'web', type: :string, aliases: '-s'
|
97
|
+
desc 'sh ARGS', "launch a shell using docker-compose exec, sets tty properly"
|
98
|
+
def sh(*args)
|
99
|
+
setup
|
100
|
+
run_with_exit("#{dotenv} docker-compose exec -e COLUMNS=\"\`tput cols\`\" -e LINES=\"\`tput lines\`\" #{options[:service]} bash #{args.join(' ')}")
|
101
|
+
end
|
102
|
+
|
83
103
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
84
104
|
desc "bundle_exec ARGS", "wraps docker-compose exec web bundle exec unless --service is used to specify"
|
85
105
|
def bundle_exec(*args)
|
86
|
-
|
106
|
+
setup
|
107
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle exec #{args.join(' ')}")
|
87
108
|
end
|
88
109
|
map be: :bundle_exec
|
89
110
|
|
90
111
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
91
112
|
desc "console ARGS", "shortcut to start rails console"
|
92
113
|
def console(*args)
|
93
|
-
|
114
|
+
setup
|
115
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle exec rails console #{args.join(' ')}")
|
94
116
|
end
|
95
117
|
map rc: :console
|
96
118
|
|
97
119
|
desc "release ENVIRONTMENT", "tag and push and image to the registry"
|
98
120
|
def release(environment)
|
121
|
+
setup
|
99
122
|
timestamp = Time.now.strftime("%Y%m%d%I%M%S")
|
100
|
-
sha = `git rev-parse HEAD`[0..
|
123
|
+
sha = `git rev-parse HEAD`[0..8]
|
101
124
|
registry = "#{ENV['REGISTRY_HOST']}#{ENV['REGISTRY_URI']}"
|
102
125
|
tag = ENV["TAG"] || 'latest'
|
103
126
|
unless File.exists?("#{ENV['HOME']}/.docker/config.json") && File.readlines("#{ENV['HOME']}/.docker/config.json").grep(/#{ENV['REGISTRY_HOST']}/).size > 0
|
104
|
-
|
127
|
+
run_with_exit("#{dotenv(environment)} docker login #{ENV['REGISTRY_HOST']}")
|
105
128
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
129
|
+
run_with_exit("#{dotenv(environment)} docker tag #{registry}:#{tag} #{registry}:#{environment}-#{timestamp}")
|
130
|
+
run_with_exit("#{dotenv(environment)} docker push #{registry}:#{environment}-#{timestamp}")
|
131
|
+
run_with_exit("#{dotenv(environment)} docker tag #{registry}:#{tag} #{registry}:#{sha}")
|
132
|
+
run_with_exit("#{dotenv(environment)} docker push #{registry}:#{sha}")
|
133
|
+
run_with_exit("#{dotenv(environment)} docker tag #{registry}:#{tag} #{registry}:#{environment}-latest")
|
134
|
+
run_with_exit("#{dotenv(environment)} docker push #{registry}:#{environment}-latest")
|
135
|
+
run_with_exit("#{dotenv(environment)} docker tag #{registry}:#{tag} #{registry}:latest")
|
136
|
+
run_with_exit("#{dotenv(environment)} docker push #{registry}:latest")
|
114
137
|
end
|
115
138
|
|
116
139
|
desc "provision ENVIRONMENT", "configure the servers for docker and then deploy an image"
|
117
140
|
def provision(environment)
|
141
|
+
setup
|
118
142
|
# TODO make dotenv load a specific environment?
|
119
|
-
|
143
|
+
run_with_exit("DEPLOY_ENV=#{environment} #{dotenv(environment)} ansible-playbook -i ops/hosts -l #{environment}:localhost ops/provision.yml")
|
120
144
|
end
|
121
145
|
|
122
146
|
desc "ssh ENVIRONMENT", "log in to a running instance - requires PRODUCTION_SSH to be set"
|
123
147
|
def ssh(environment)
|
148
|
+
setup
|
124
149
|
target = ENV["#{environment.upcase}_SSH"]
|
125
150
|
if target
|
126
|
-
|
151
|
+
run_with_exit(target)
|
127
152
|
else
|
128
153
|
say "Please set #{environment.upcase}_SSH"
|
129
154
|
end
|
@@ -131,22 +156,27 @@ module StackCar
|
|
131
156
|
|
132
157
|
desc "deploy ENVIRONMENT", "deploy an image from the registry"
|
133
158
|
def deploy(environment)
|
134
|
-
|
159
|
+
setup
|
160
|
+
run_with_exit("DEPLOY_HOOK=$DEPLOY_HOOK_#{environment.upcase} #{dotenv(environment)} ansible-playbook -i ops/hosts -l #{environment}:localhost ops/deploy.yml")
|
135
161
|
end
|
136
162
|
|
137
|
-
method_option :elasticsearch, default: false, type: :boolean, aliases: '-e'
|
138
|
-
method_option :solr, default: false, type: :boolean, aliases: '-s'
|
139
|
-
method_option :postgres, default: false, type: :boolean, aliases: '-p'
|
140
|
-
method_option :mysql, default: false, type: :boolean, aliases: '-m'
|
141
|
-
method_option :redis, default: false, type: :boolean, aliases: '-r'
|
142
163
|
method_option :delayed_job, default: false, type: :boolean, aliases: '-j'
|
143
|
-
method_option :fcrepo, default: false, type: :boolean, aliases: '-f'
|
144
164
|
method_option :deploy, default: false, type: :boolean, aliases: '-d'
|
165
|
+
method_option :elasticsearch, default: false, type: :boolean, aliases: '-e'
|
166
|
+
method_option :fcrepo, default: false, type: :boolean, aliases: '-f'
|
167
|
+
method_option :helm, default: false, type: :boolean, aliases: '-h'
|
168
|
+
method_option :git, default: true, type: :boolean, aliases: '-g'
|
145
169
|
method_option :heroku, default: false, type: :boolean, aliases: '-h'
|
170
|
+
method_option :hyku, default: false, type: :boolean, aliases: '-u'
|
171
|
+
method_option :imagemagick, default: false, type: :boolean, aliases: '-i'
|
172
|
+
method_option :memcached, default: false, type: :boolean, aliases: '-mc'
|
173
|
+
method_option :mongodb, default: false, type: :boolean, aliases: '-mg'
|
174
|
+
method_option :mysql, default: false, type: :boolean, aliases: '-m'
|
175
|
+
method_option :postgres, default: false, type: :boolean, aliases: '-p'
|
146
176
|
method_option :rancher, default: false, type: :boolean, aliases: '-dr'
|
177
|
+
method_option :redis, default: false, type: :boolean, aliases: '-r'
|
147
178
|
method_option :sidekiq, default: false, type: :boolean, aliases: '-sq' # TODO
|
148
|
-
method_option :
|
149
|
-
method_option :memcached, default: false, type: :boolean, aliases: '-mc'
|
179
|
+
method_option :solr, default: false, type: :boolean, aliases: '-s'
|
150
180
|
method_option :yarn, default: false, type: :boolean, aliases: '-y'
|
151
181
|
desc 'dockerize DIR', 'Will copy the docker tempates in to your project, see options for supported dependencies'
|
152
182
|
long_desc <<-DOCKERIZE
|
@@ -157,9 +187,14 @@ module StackCar
|
|
157
187
|
DOCKERIZE
|
158
188
|
def dockerize(dir=".")
|
159
189
|
Dir.chdir(dir)
|
190
|
+
self.destination_root = dir
|
191
|
+
setup
|
192
|
+
# Commandline overrides config files
|
193
|
+
# options = file_config.merge(options)
|
160
194
|
@project_name = File.basename(File.expand_path(dir))
|
161
195
|
apt_packages << "libpq-dev postgresql-client" if options[:postgres]
|
162
196
|
apt_packages << "mysql-client" if options[:mysql]
|
197
|
+
apt_packages << "imagemagick" if options[:imagemagick]
|
163
198
|
pre_apt << "echo 'Downloading Packages'"
|
164
199
|
post_apt << "echo 'Packages Downloaded'"
|
165
200
|
|
@@ -179,7 +214,7 @@ module StackCar
|
|
179
214
|
post_apt << "cd /opt && unzip fits-1.0.5.zip && chmod +X fits-1.0.5/fits.sh"
|
180
215
|
end
|
181
216
|
|
182
|
-
['.dockerignore', 'Dockerfile', 'Dockerfile.base', 'docker-compose.yml', '
|
217
|
+
['.dockerignore', 'Dockerfile', 'Dockerfile.base', 'docker-compose.yml', '.gitlab-ci.yml', '.env'].each do |template_file|
|
183
218
|
puts template_file
|
184
219
|
template("#{template_file}.erb", template_file)
|
185
220
|
end
|
@@ -196,14 +231,33 @@ module StackCar
|
|
196
231
|
File.read("#{self.class.source_root}/README.md")
|
197
232
|
end
|
198
233
|
end
|
199
|
-
|
234
|
+
|
235
|
+
if File.exist?('Gemfile')
|
236
|
+
append_to_file('Gemfile', "gem 'activerecord-nulldb-adapter'")
|
237
|
+
else
|
238
|
+
append_to_file('../Gemfile', "gem 'activerecord-nulldb-adapter'", { verbose: false })
|
239
|
+
# TODO: remove '../' from message after other status messages are prepended with 'stack_car/'
|
240
|
+
append_to_file("../Gemfile", "gem 'pronto', groups: [:development, :test]")
|
241
|
+
append_to_file("../Gemfile", "gem 'pronto-rubocop', groups: [:development, :test]")
|
242
|
+
say_status(:append, '../Gemfile')
|
243
|
+
end
|
244
|
+
|
200
245
|
if options[:deploy] || options[:rancher]
|
201
246
|
directory('ops')
|
202
247
|
['hosts', 'deploy.yml', 'provision.yml'].each do |template_file|
|
203
248
|
template("#{template_file}.erb", "ops/#{template_file}")
|
204
249
|
end
|
250
|
+
|
205
251
|
say 'Please update ops/hosts with the correct server addresses'
|
206
|
-
|
252
|
+
elsif options[:helm]
|
253
|
+
directory('chart')
|
254
|
+
if options[:fcrepo]
|
255
|
+
directory('chart-fcrepo', 'chart/templates')
|
256
|
+
end
|
257
|
+
if options[:sidekiq]
|
258
|
+
directory('chart-sidekiq', 'chart/templates')
|
259
|
+
end
|
260
|
+
else
|
207
261
|
empty_directory('ops')
|
208
262
|
end
|
209
263
|
|
@@ -251,5 +305,49 @@ module StackCar
|
|
251
305
|
post_apt.join(" && \\\n")
|
252
306
|
end
|
253
307
|
|
308
|
+
def run_with_exit(*args)
|
309
|
+
result = run(*args)
|
310
|
+
if !result
|
311
|
+
exit(1)
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
def file_config
|
316
|
+
path = find_config(Dir.pwd)
|
317
|
+
if path
|
318
|
+
JSON.parse(File.read(path))
|
319
|
+
else
|
320
|
+
{}
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
def find_config(dir)
|
325
|
+
path = File.join(dir, '.stackcar_rc')
|
326
|
+
if File.exists?(path)
|
327
|
+
return path
|
328
|
+
elsif dir == "/"
|
329
|
+
return nil
|
330
|
+
else
|
331
|
+
return find_config(File.dirname(dir))
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
def ensure_development_env
|
336
|
+
if !File.exists?('.env.development')
|
337
|
+
template(".env.development.erb", ".env.development")
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def dotenv(environment='development')
|
342
|
+
"dotenv -f .env.#{environment},.env"
|
343
|
+
end
|
344
|
+
|
345
|
+
def setup
|
346
|
+
if File.exists?('stack_car')
|
347
|
+
Dir.chdir('stack_car')
|
348
|
+
self.destination_root += "/stack_car"
|
349
|
+
end
|
350
|
+
DotRc.new
|
351
|
+
end
|
254
352
|
end
|
255
353
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'pathname'
|
3
|
+
module StackCar
|
4
|
+
class DotRc
|
5
|
+
include Thor::Shell
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@file = find_file
|
9
|
+
say_status :load, 'not found', :red && return unless @file
|
10
|
+
say_status :load, @file
|
11
|
+
load(@file)
|
12
|
+
end
|
13
|
+
|
14
|
+
def find_file
|
15
|
+
path = nil
|
16
|
+
Pathname(Dir.pwd).ascend do |p|
|
17
|
+
if File.directory?(p) && File.exist?(File.join(p, '.stack_car_rc'))
|
18
|
+
path = File.join(p, '.stack_car_rc')
|
19
|
+
break
|
20
|
+
end
|
21
|
+
end
|
22
|
+
path
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/stack_car/version.rb
CHANGED
data/stack_car.gemspec
CHANGED
@@ -26,5 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "yard-thor"
|
27
27
|
spec.add_development_dependency "pry"
|
28
28
|
spec.add_runtime_dependency "dotenv", "~> 2.2"
|
29
|
+
spec.add_runtime_dependency "json", "~> 2.3"
|
29
30
|
spec.add_runtime_dependency "thor", "~> 0.19"
|
30
31
|
end
|