stack_car 0.7.1 → 0.13.0

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.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +64 -1
  3. data/lib/stack_car.rb +1 -0
  4. data/lib/stack_car/cli.rb +131 -38
  5. data/lib/stack_car/dot_rc.rb +25 -0
  6. data/lib/stack_car/version.rb +1 -1
  7. data/stack_car.gemspec +1 -0
  8. data/templates/.dockerignore.erb +2 -2
  9. data/templates/.env.development.erb +2 -0
  10. data/templates/.env.erb +15 -16
  11. data/templates/.gitlab-ci.yml.erb +95 -62
  12. data/templates/Dockerfile.erb +26 -7
  13. data/templates/chart-fcrepo/fcrepo-deploy.yaml +63 -0
  14. data/templates/chart-fcrepo/fcrepo-env-cm.yaml +8 -0
  15. data/templates/chart-fcrepo/fcrepo-env-secret.yaml.tt +10 -0
  16. data/templates/chart-fcrepo/fcrepo-pvc.yaml +20 -0
  17. data/templates/chart-fcrepo/fcrepo-svc.yaml +19 -0
  18. data/templates/chart-sidekiq/sidekiq-deploy.yaml +80 -0
  19. data/templates/chart/.gitignore +3 -0
  20. data/templates/chart/.helmignore +23 -0
  21. data/templates/chart/Chart.yaml.tt +29 -0
  22. data/templates/chart/README.md +223 -0
  23. data/templates/chart/bin/check_sidekiq.rb +0 -0
  24. data/templates/chart/bin/decrypt +17 -0
  25. data/templates/chart/bin/deploy +14 -0
  26. data/templates/chart/bin/encrypt +15 -0
  27. data/templates/chart/bin/remove +15 -0
  28. data/templates/chart/sample-values.yaml.tt +138 -0
  29. data/templates/chart/templates/_helpers.tpl.tt +85 -0
  30. data/templates/chart/templates/rails-env-cm.yaml.tt +47 -0
  31. data/templates/chart/templates/rails-env-secret.yaml +10 -0
  32. data/templates/chart/templates/rails-pvc-shared.yml +20 -0
  33. data/templates/chart/templates/setup-job.yaml +73 -0
  34. data/templates/chart/templates/web-deploy.yaml +67 -0
  35. data/templates/chart/templates/web-ing-wildcard.yaml +20 -0
  36. data/templates/chart/templates/web-ing.yaml +20 -0
  37. data/templates/chart/templates/web-svc.yaml +20 -0
  38. data/templates/database.yml.erb +10 -10
  39. data/templates/docker-compose.yml.erb +49 -17
  40. data/templates/env.conf.erb +11 -9
  41. data/templates/nginx.sh.erb +17 -0
  42. metadata +47 -11
  43. data/templates/Dockerfile.base.erb +0 -48
  44. data/templates/docker-compose.ci.yml.erb +0 -87
  45. data/templates/docker-compose.production.yml.erb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dc0c3e1f27e698861c2c9bccffd68f6879ff9da5
4
- data.tar.gz: e666418ddb4ac4a73d01e0eed0ac40db91c6435a
2
+ SHA256:
3
+ metadata.gz: be5319f55289a7290898afd746925c52ca00abd632f8c8bb15bc9fd9ef42b91b
4
+ data.tar.gz: 5fc7e21e1ff7bb056ddcdfe2fd35da741f5d0d27e9f7491ce7dee44483a2e50f
5
5
  SHA512:
6
- metadata.gz: e16e46c835e97f0807ead8f7b7166f83cf03b4cc3428bd8678c4523edba79c5e8a4907172753c136e682970efb1196e06f961b4910a43f4a6ffccad8652e87a1
7
- data.tar.gz: 6c444905ee7725c0258ac4f8a1aa5199276271363928c3ebf5566bf6e6a21ef6ea8b7f133f758d07b985c94ce406239f9516473422d2462a46d812b65a8d132d
6
+ metadata.gz: e911986bdbecd0848db4a0987eb631f52d0e76271c67f06761a0364332db693c25bf0f34911169dd9a2caeb907c74e095d98a6352d1fc9264cacf15dddef1cf2
7
+ data.tar.gz: 3a8790e739b56f07648edb147f9dd2dde7e77875c3b45ccadb342d243880ceee34a97f5e1da236d2204a65778409c26a196c74c08c87e906a7297bc81829aac6
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, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
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
@@ -1,5 +1,6 @@
1
1
  require "stack_car/version"
2
2
  require "stack_car/cli"
3
+ require "stack_car/dot_rc"
3
4
 
4
5
  module StackCar
5
6
  # Your code goes here...
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,117 +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
- run("docker-compose up #{args.join(' ')} #{options[:service]}")
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
- run("docker-compose stop #{options[:service]}")
35
- run("rm -rf tmp/pids/*")
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
- run("docker-compose build #{options[:service]}")
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
- run("docker-compose push #{options[:service]} #{args.join(' ')}")
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
- run("docker-compose pull #{options[:service]} #{args.join(' ')}")
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
- run("docker-compose ps #{options[:service]} #{args.join(' ')}")
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
- run("docker-compose exec #{options[:service]} bundle")
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
- run("docker-compose run #{options[:service]} #{args.join(' ')}")
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
- run("docker-compose exec #{options[:service]} #{args.join(' ')}")
91
+ setup
92
+ run_with_exit("#{dotenv} docker-compose exec #{options[:service]} #{args.join(' ')}")
80
93
  end
81
94
  map ex: :exec
82
95
 
83
96
  method_option :service, default: 'web', type: :string, aliases: '-s'
84
97
  desc 'sh ARGS', "launch a shell using docker-compose exec, sets tty properly"
85
98
  def sh(*args)
86
- run("docker-compose exec -e COLUMNS=\"\`tput cols\`\" -e LINES=\"\`tput lines\`\" #{options[:service]} bash #{args.join(' ')}")
99
+ setup
100
+ run_with_exit("#{dotenv} docker-compose exec -e COLUMNS=\"\`tput cols\`\" -e LINES=\"\`tput lines\`\" #{options[:service]} bash #{args.join(' ')}")
87
101
  end
88
102
 
89
103
  method_option :service, default: 'web', type: :string, aliases: '-s'
90
104
  desc "bundle_exec ARGS", "wraps docker-compose exec web bundle exec unless --service is used to specify"
91
105
  def bundle_exec(*args)
92
- run("docker-compose exec #{options[:service]} bundle exec #{args.join(' ')}")
106
+ setup
107
+ run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle exec #{args.join(' ')}")
93
108
  end
94
109
  map be: :bundle_exec
95
110
 
96
111
  method_option :service, default: 'web', type: :string, aliases: '-s'
97
112
  desc "console ARGS", "shortcut to start rails console"
98
113
  def console(*args)
99
- run("docker-compose exec #{options[:service]} bundle exec rails console #{args.join(' ')}")
114
+ setup
115
+ run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle exec rails console #{args.join(' ')}")
100
116
  end
101
117
  map rc: :console
102
118
 
103
119
  desc "release ENVIRONTMENT", "tag and push and image to the registry"
104
120
  def release(environment)
121
+ setup
105
122
  timestamp = Time.now.strftime("%Y%m%d%I%M%S")
106
123
  sha = `git rev-parse HEAD`[0..8]
107
124
  registry = "#{ENV['REGISTRY_HOST']}#{ENV['REGISTRY_URI']}"
108
125
  tag = ENV["TAG"] || 'latest'
109
126
  unless File.exists?("#{ENV['HOME']}/.docker/config.json") && File.readlines("#{ENV['HOME']}/.docker/config.json").grep(/#{ENV['REGISTRY_HOST']}/).size > 0
110
- run("docker login #{ENV['REGISTRY_HOST']}")
127
+ run_with_exit("#{dotenv(environment)} docker login #{ENV['REGISTRY_HOST']}")
111
128
  end
112
- run("docker tag #{registry}:#{tag} #{registry}:#{environment}-#{timestamp}")
113
- run("docker push #{registry}:#{environment}-#{timestamp}")
114
- run("docker tag #{registry}:#{tag} #{registry}:#{sha}")
115
- run("docker push #{registry}:#{sha}")
116
- run("docker tag #{registry}:#{tag} #{registry}:#{environment}-latest")
117
- run("docker push #{registry}:#{environment}-latest")
118
- run("docker tag #{registry}:#{tag} #{registry}:latest")
119
- run("docker push #{registry}:latest")
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")
120
137
  end
121
138
 
122
139
  desc "provision ENVIRONMENT", "configure the servers for docker and then deploy an image"
123
140
  def provision(environment)
141
+ setup
124
142
  # TODO make dotenv load a specific environment?
125
- run("DEPLOY_ENV=#{environment} dotenv ansible-playbook -i ops/hosts -l #{environment}:localhost ops/provision.yml")
143
+ run_with_exit("DEPLOY_ENV=#{environment} #{dotenv(environment)} ansible-playbook -i ops/hosts -l #{environment}:localhost ops/provision.yml")
126
144
  end
127
145
 
128
146
  desc "ssh ENVIRONMENT", "log in to a running instance - requires PRODUCTION_SSH to be set"
129
147
  def ssh(environment)
148
+ setup
130
149
  target = ENV["#{environment.upcase}_SSH"]
131
150
  if target
132
- run(target)
151
+ run_with_exit(target)
133
152
  else
134
153
  say "Please set #{environment.upcase}_SSH"
135
154
  end
@@ -137,22 +156,27 @@ module StackCar
137
156
 
138
157
  desc "deploy ENVIRONMENT", "deploy an image from the registry"
139
158
  def deploy(environment)
140
- run("DEPLOY_HOOK=$DEPLOY_HOOK_#{environment.upcase} dotenv ansible-playbook -i ops/hosts -l #{environment}:localhost ops/deploy.yml")
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")
141
161
  end
142
162
 
143
- method_option :elasticsearch, default: false, type: :boolean, aliases: '-e'
144
- method_option :solr, default: false, type: :boolean, aliases: '-s'
145
- method_option :postgres, default: false, type: :boolean, aliases: '-p'
146
- method_option :mysql, default: false, type: :boolean, aliases: '-m'
147
- method_option :redis, default: false, type: :boolean, aliases: '-r'
148
163
  method_option :delayed_job, default: false, type: :boolean, aliases: '-j'
149
- method_option :fcrepo, default: false, type: :boolean, aliases: '-f'
150
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: false, type: :boolean, aliases: '-g'
151
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'
152
176
  method_option :rancher, default: false, type: :boolean, aliases: '-dr'
177
+ method_option :redis, default: false, type: :boolean, aliases: '-r'
153
178
  method_option :sidekiq, default: false, type: :boolean, aliases: '-sq' # TODO
154
- method_option :mongodb, default: false, type: :boolean, aliases: '-mg'
155
- method_option :memcached, default: false, type: :boolean, aliases: '-mc'
179
+ method_option :solr, default: false, type: :boolean, aliases: '-s'
156
180
  method_option :yarn, default: false, type: :boolean, aliases: '-y'
157
181
  desc 'dockerize DIR', 'Will copy the docker tempates in to your project, see options for supported dependencies'
158
182
  long_desc <<-DOCKERIZE
@@ -163,9 +187,14 @@ module StackCar
163
187
  DOCKERIZE
164
188
  def dockerize(dir=".")
165
189
  Dir.chdir(dir)
190
+ self.destination_root = dir
191
+ setup
192
+ # Commandline overrides config files
193
+ # options = file_config.merge(options)
166
194
  @project_name = File.basename(File.expand_path(dir))
167
195
  apt_packages << "libpq-dev postgresql-client" if options[:postgres]
168
196
  apt_packages << "mysql-client" if options[:mysql]
197
+ apt_packages << "imagemagick" if options[:imagemagick]
169
198
  pre_apt << "echo 'Downloading Packages'"
170
199
  post_apt << "echo 'Packages Downloaded'"
171
200
 
@@ -185,7 +214,7 @@ module StackCar
185
214
  post_apt << "cd /opt && unzip fits-1.0.5.zip && chmod +X fits-1.0.5/fits.sh"
186
215
  end
187
216
 
188
- ['.dockerignore', 'Dockerfile', 'Dockerfile.base', 'docker-compose.yml', 'docker-compose.ci.yml', 'docker-compose.production.yml', '.gitlab-ci.yml', '.env'].each do |template_file|
217
+ ['.dockerignore', 'Dockerfile', 'docker-compose.yml', '.gitlab-ci.yml', '.env'].each do |template_file|
189
218
  puts template_file
190
219
  template("#{template_file}.erb", template_file)
191
220
  end
@@ -202,14 +231,33 @@ module StackCar
202
231
  File.read("#{self.class.source_root}/README.md")
203
232
  end
204
233
  end
205
- append_to_file("Gemfile", "gem 'activerecord-nulldb-adapter'")
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
+
206
245
  if options[:deploy] || options[:rancher]
207
246
  directory('ops')
208
247
  ['hosts', 'deploy.yml', 'provision.yml'].each do |template_file|
209
248
  template("#{template_file}.erb", "ops/#{template_file}")
210
249
  end
250
+
211
251
  say 'Please update ops/hosts with the correct server addresses'
212
- else
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
213
261
  empty_directory('ops')
214
262
  end
215
263
 
@@ -257,5 +305,50 @@ module StackCar
257
305
  post_apt.join(" && \\\n")
258
306
  end
259
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
+ @sc_dir = true
348
+ Dir.chdir('stack_car')
349
+ self.destination_root += "/stack_car"
350
+ end
351
+ DotRc.new
352
+ end
260
353
  end
261
354
  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
@@ -1,3 +1,3 @@
1
1
  module StackCar
2
- VERSION = "0.7.1"
2
+ VERSION = "0.13.0"
3
3
  end
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