stack_car 0.9.0 → 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 +112 -36
- 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 -11
- 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,21 +20,23 @@ 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
|
22
24
|
ensure_development_env
|
23
25
|
args = ['--remove-orphans']
|
24
26
|
args << '--build' if options[:build]
|
25
27
|
if options[:build]
|
26
|
-
run("docker-compose pull #{options[:service]}")
|
28
|
+
run("#{dotenv} docker-compose pull #{options[:service]}")
|
27
29
|
end
|
28
30
|
|
29
|
-
run_with_exit("docker-compose up #{args.join(' ')} #{options[:service]}")
|
31
|
+
run_with_exit("#{dotenv} docker-compose up #{args.join(' ')} #{options[:service]}")
|
30
32
|
end
|
31
33
|
|
32
34
|
method_option :service, default: '', type: :string, aliases: '-s'
|
33
35
|
desc "stop", "stops the specified running service, defaults to all"
|
34
36
|
def stop
|
37
|
+
setup
|
35
38
|
ensure_development_env
|
36
|
-
run("docker-compose stop #{options[:service]}")
|
39
|
+
run("#{dotenv} docker-compose stop #{options[:service]}")
|
37
40
|
run_with_exit("rm -rf tmp/pids/*")
|
38
41
|
end
|
39
42
|
map down: :stop
|
@@ -41,95 +44,108 @@ module StackCar
|
|
41
44
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
42
45
|
desc "build", "builds specified service, defaults to web"
|
43
46
|
def build
|
47
|
+
setup
|
44
48
|
ensure_development_env
|
45
|
-
run_with_exit("docker-compose build #{options[:service]}")
|
49
|
+
run_with_exit("#{dotenv} docker-compose build #{options[:service]}")
|
46
50
|
end
|
47
51
|
|
48
52
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
49
53
|
desc "push ARGS", "wraps docker-compose push web unless --service is used to specify"
|
50
54
|
def push(*args)
|
51
|
-
|
55
|
+
setup
|
56
|
+
run_with_exit("#{dotenv} docker-compose push #{options[:service]} #{args.join(' ')}")
|
52
57
|
end
|
53
58
|
|
54
59
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
55
60
|
desc "pull ARGS", "wraps docker-compose pull web unless --service is used to specify"
|
56
61
|
def pull(*args)
|
57
|
-
|
62
|
+
setup
|
63
|
+
run_with_exit("#{dotenv} docker-compose pull #{options[:service]} #{args.join(' ')}")
|
58
64
|
end
|
59
65
|
|
60
66
|
method_option :service, default: '', type: :string, aliases: '-s'
|
61
67
|
desc "ps ARGS", "wraps docker-compose pull web unless --service is used to specify"
|
62
68
|
def ps(*args)
|
63
|
-
|
69
|
+
setup
|
70
|
+
run_with_exit("#{dotenv} docker-compose ps #{options[:service]} #{args.join(' ')}")
|
64
71
|
end
|
65
72
|
map status: :ps
|
66
73
|
|
67
74
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
68
75
|
desc "bundle ARGS", "wraps docker-compose run web unless --service is used to specify"
|
69
76
|
def bundle(*args)
|
70
|
-
|
77
|
+
setup
|
78
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle")
|
71
79
|
end
|
72
80
|
|
73
81
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
74
82
|
desc "walk ARGS", "wraps docker-compose run web unless --service is used to specify"
|
75
83
|
def walk(*args)
|
76
|
-
|
84
|
+
setup
|
85
|
+
run_with_exit("#{dotenv} docker-compose run #{options[:service]} #{args.join(' ')}")
|
77
86
|
end
|
78
87
|
|
79
88
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
80
89
|
desc "exec ARGS", "wraps docker-compose exec web unless --service is used to specify"
|
81
90
|
def exec(*args)
|
82
|
-
|
91
|
+
setup
|
92
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} #{args.join(' ')}")
|
83
93
|
end
|
84
94
|
map ex: :exec
|
85
95
|
|
86
96
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
87
97
|
desc 'sh ARGS', "launch a shell using docker-compose exec, sets tty properly"
|
88
98
|
def sh(*args)
|
89
|
-
|
99
|
+
setup
|
100
|
+
run_with_exit("#{dotenv} docker-compose exec -e COLUMNS=\"\`tput cols\`\" -e LINES=\"\`tput lines\`\" #{options[:service]} bash #{args.join(' ')}")
|
90
101
|
end
|
91
102
|
|
92
103
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
93
104
|
desc "bundle_exec ARGS", "wraps docker-compose exec web bundle exec unless --service is used to specify"
|
94
105
|
def bundle_exec(*args)
|
95
|
-
|
106
|
+
setup
|
107
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle exec #{args.join(' ')}")
|
96
108
|
end
|
97
109
|
map be: :bundle_exec
|
98
110
|
|
99
111
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
100
112
|
desc "console ARGS", "shortcut to start rails console"
|
101
113
|
def console(*args)
|
102
|
-
|
114
|
+
setup
|
115
|
+
run_with_exit("#{dotenv} docker-compose exec #{options[:service]} bundle exec rails console #{args.join(' ')}")
|
103
116
|
end
|
104
117
|
map rc: :console
|
105
118
|
|
106
119
|
desc "release ENVIRONTMENT", "tag and push and image to the registry"
|
107
120
|
def release(environment)
|
121
|
+
setup
|
108
122
|
timestamp = Time.now.strftime("%Y%m%d%I%M%S")
|
109
123
|
sha = `git rev-parse HEAD`[0..8]
|
110
124
|
registry = "#{ENV['REGISTRY_HOST']}#{ENV['REGISTRY_URI']}"
|
111
125
|
tag = ENV["TAG"] || 'latest'
|
112
126
|
unless File.exists?("#{ENV['HOME']}/.docker/config.json") && File.readlines("#{ENV['HOME']}/.docker/config.json").grep(/#{ENV['REGISTRY_HOST']}/).size > 0
|
113
|
-
run_with_exit("docker login #{ENV['REGISTRY_HOST']}")
|
127
|
+
run_with_exit("#{dotenv(environment)} docker login #{ENV['REGISTRY_HOST']}")
|
114
128
|
end
|
115
|
-
run_with_exit("docker tag #{registry}:#{tag} #{registry}:#{environment}-#{timestamp}")
|
116
|
-
run_with_exit("docker push #{registry}:#{environment}-#{timestamp}")
|
117
|
-
run_with_exit("docker tag #{registry}:#{tag} #{registry}:#{sha}")
|
118
|
-
run_with_exit("docker push #{registry}:#{sha}")
|
119
|
-
run_with_exit("docker tag #{registry}:#{tag} #{registry}:#{environment}-latest")
|
120
|
-
run_with_exit("docker push #{registry}:#{environment}-latest")
|
121
|
-
run_with_exit("docker tag #{registry}:#{tag} #{registry}:latest")
|
122
|
-
run_with_exit("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")
|
123
137
|
end
|
124
138
|
|
125
139
|
desc "provision ENVIRONMENT", "configure the servers for docker and then deploy an image"
|
126
140
|
def provision(environment)
|
141
|
+
setup
|
127
142
|
# TODO make dotenv load a specific environment?
|
128
|
-
run_with_exit("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")
|
129
144
|
end
|
130
145
|
|
131
146
|
desc "ssh ENVIRONMENT", "log in to a running instance - requires PRODUCTION_SSH to be set"
|
132
147
|
def ssh(environment)
|
148
|
+
setup
|
133
149
|
target = ENV["#{environment.upcase}_SSH"]
|
134
150
|
if target
|
135
151
|
run_with_exit(target)
|
@@ -140,22 +156,27 @@ module StackCar
|
|
140
156
|
|
141
157
|
desc "deploy ENVIRONMENT", "deploy an image from the registry"
|
142
158
|
def deploy(environment)
|
143
|
-
|
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")
|
144
161
|
end
|
145
162
|
|
146
|
-
method_option :elasticsearch, default: false, type: :boolean, aliases: '-e'
|
147
|
-
method_option :solr, default: false, type: :boolean, aliases: '-s'
|
148
|
-
method_option :postgres, default: false, type: :boolean, aliases: '-p'
|
149
|
-
method_option :mysql, default: false, type: :boolean, aliases: '-m'
|
150
|
-
method_option :redis, default: false, type: :boolean, aliases: '-r'
|
151
163
|
method_option :delayed_job, default: false, type: :boolean, aliases: '-j'
|
152
|
-
method_option :fcrepo, default: false, type: :boolean, aliases: '-f'
|
153
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'
|
154
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'
|
155
176
|
method_option :rancher, default: false, type: :boolean, aliases: '-dr'
|
177
|
+
method_option :redis, default: false, type: :boolean, aliases: '-r'
|
156
178
|
method_option :sidekiq, default: false, type: :boolean, aliases: '-sq' # TODO
|
157
|
-
method_option :
|
158
|
-
method_option :memcached, default: false, type: :boolean, aliases: '-mc'
|
179
|
+
method_option :solr, default: false, type: :boolean, aliases: '-s'
|
159
180
|
method_option :yarn, default: false, type: :boolean, aliases: '-y'
|
160
181
|
desc 'dockerize DIR', 'Will copy the docker tempates in to your project, see options for supported dependencies'
|
161
182
|
long_desc <<-DOCKERIZE
|
@@ -166,9 +187,14 @@ module StackCar
|
|
166
187
|
DOCKERIZE
|
167
188
|
def dockerize(dir=".")
|
168
189
|
Dir.chdir(dir)
|
190
|
+
self.destination_root = dir
|
191
|
+
setup
|
192
|
+
# Commandline overrides config files
|
193
|
+
# options = file_config.merge(options)
|
169
194
|
@project_name = File.basename(File.expand_path(dir))
|
170
195
|
apt_packages << "libpq-dev postgresql-client" if options[:postgres]
|
171
196
|
apt_packages << "mysql-client" if options[:mysql]
|
197
|
+
apt_packages << "imagemagick" if options[:imagemagick]
|
172
198
|
pre_apt << "echo 'Downloading Packages'"
|
173
199
|
post_apt << "echo 'Packages Downloaded'"
|
174
200
|
|
@@ -188,7 +214,7 @@ module StackCar
|
|
188
214
|
post_apt << "cd /opt && unzip fits-1.0.5.zip && chmod +X fits-1.0.5/fits.sh"
|
189
215
|
end
|
190
216
|
|
191
|
-
['.dockerignore', 'Dockerfile', 'Dockerfile.base', 'docker-compose.yml', '
|
217
|
+
['.dockerignore', 'Dockerfile', 'Dockerfile.base', 'docker-compose.yml', '.gitlab-ci.yml', '.env'].each do |template_file|
|
192
218
|
puts template_file
|
193
219
|
template("#{template_file}.erb", template_file)
|
194
220
|
end
|
@@ -205,14 +231,33 @@ module StackCar
|
|
205
231
|
File.read("#{self.class.source_root}/README.md")
|
206
232
|
end
|
207
233
|
end
|
208
|
-
|
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
|
+
|
209
245
|
if options[:deploy] || options[:rancher]
|
210
246
|
directory('ops')
|
211
247
|
['hosts', 'deploy.yml', 'provision.yml'].each do |template_file|
|
212
248
|
template("#{template_file}.erb", "ops/#{template_file}")
|
213
249
|
end
|
250
|
+
|
214
251
|
say 'Please update ops/hosts with the correct server addresses'
|
215
|
-
|
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
|
216
261
|
empty_directory('ops')
|
217
262
|
end
|
218
263
|
|
@@ -267,11 +312,42 @@ module StackCar
|
|
267
312
|
end
|
268
313
|
end
|
269
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
|
+
|
270
335
|
def ensure_development_env
|
271
336
|
if !File.exists?('.env.development')
|
272
337
|
template(".env.development.erb", ".env.development")
|
273
338
|
end
|
274
339
|
end
|
275
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
|
276
352
|
end
|
277
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
|