stack_car 0.12.0 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +17 -12
- data/README.md +84 -10
- data/lib/stack_car/cli.rb +166 -33
- data/lib/stack_car/version.rb +3 -1
- data/stack_car.gemspec +1 -0
- data/templates/.env.erb +23 -0
- data/templates/.gitlab/issue_templates/Bug.md +46 -0
- data/templates/.gitlab/issue_templates/Feature.md +41 -0
- data/templates/.gitlab/issue_templates/Question.md +18 -0
- data/templates/.gitlab/issue_templates/enable_pipeline_check_before_merge.md +8 -0
- data/templates/.gitlab/merge_request_templates/Bug.md +36 -0
- data/templates/.gitlab/merge_request_templates/Feature.md +36 -0
- data/templates/.gitlab-ci.yml.erb +4 -3
- data/templates/.sops.yaml.erb +3 -0
- data/templates/Dockerfile.erb +6 -6
- data/templates/README.md +84 -7
- data/templates/chart/Chart.yaml.tt +15 -14
- data/templates/chart/bin/deploy +1 -1
- data/templates/chart/bin/remove +1 -1
- data/templates/chart/sample-values.yaml.tt +16 -1
- data/templates/chart/templates/_helpers.tpl.tt +1 -1
- data/templates/chart/templates/web-ing-wildcard.yaml +1 -1
- data/templates/chart/templates/web-ing.yaml +1 -1
- data/templates/database.yml.erb +0 -1
- data/templates/decrypt-secrets +22 -0
- data/templates/deploy.yml.erb +2 -2
- data/templates/development.rb.erb +90 -0
- data/templates/docker-compose.yml.erb +14 -21
- data/templates/encrypt-secrets +19 -0
- data/templates/production.rb.erb +117 -0
- data/templates/solrcloud-assign-configset.sh +35 -0
- data/templates/solrcloud-upload-configset.sh +42 -0
- metadata +34 -9
- data/templates/Dockerfile.base.erb +0 -57
- data/templates/Dockerfile.builder.erb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6cc442f70a939d0c26964b5b37fab7c115ce5de2c1c7ad2decf317854028b4b
|
4
|
+
data.tar.gz: a245e1232281276530a1b16be06a2baedf938eb39db836d39786f99cd52a2264
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7108eaf37d7a5f0ae241eb6365a93d731329c04cbe13571002894ae4c80192893512dc29a1a32f95dfd15d3309682290682a2efa381b93dcce894c1e551072ae
|
7
|
+
data.tar.gz: d23c829079977213a1877733c8f814041df4afb258269861311184e5044ded8b5dcda760b31c3ec4a9e6e5ea8f8a23d43f23ad65f385e329271db2b2d50f985b
|
data/.gitlab-ci.yml
CHANGED
@@ -1,17 +1,22 @@
|
|
1
|
-
|
1
|
+
stages:
|
2
|
+
- rspec
|
2
3
|
|
3
4
|
before_script:
|
4
|
-
bundle
|
5
|
+
- bundle
|
5
6
|
|
6
|
-
pages:
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
# pages:
|
8
|
+
# script:
|
9
|
+
# - bundle exec yardoc --plugin yard-thor -o public - templates/.* templates/*
|
10
|
+
# artifacts:
|
11
|
+
# paths:
|
12
|
+
# - public
|
13
|
+
# only:
|
14
|
+
# - master
|
14
15
|
|
15
|
-
|
16
|
+
rspec:
|
17
|
+
stage: rspec
|
18
|
+
image: ruby:2.3
|
16
19
|
script:
|
17
|
-
bundle exec
|
20
|
+
- bundle exec rspec
|
21
|
+
tags:
|
22
|
+
- docker
|
data/README.md
CHANGED
@@ -4,6 +4,13 @@
|
|
4
4
|
|
5
5
|
Stack Car is an opinionated set of tools around Docker and Rails. It provides convenent methods to start and stop docker-compose, to deploy with rancher and a set of templates to get a new Rails app in to docker as quickly as possible.
|
6
6
|
|
7
|
+
## Table of Contents
|
8
|
+
|
9
|
+
- [Installation](#installation)
|
10
|
+
- [Usage](#usage)
|
11
|
+
- [Development](#development)
|
12
|
+
- [Dockerizing an Application](#dockerizing-an-application)
|
13
|
+
- [Generating a Helm Chart](#generating-a-helm-chart)
|
7
14
|
|
8
15
|
## Installation
|
9
16
|
|
@@ -19,14 +26,14 @@ Commands are accesible via the "sc" short cut. Note: this will need to be in you
|
|
19
26
|
|
20
27
|
```ruby
|
21
28
|
Commands:
|
22
|
-
stack_car bundle_exec ARGS # wraps docker
|
29
|
+
stack_car bundle_exec ARGS # wraps docker compose exec web bundle exec unless --service is used to specify (sc be ARGS)
|
23
30
|
stack_car console ARGS # shortcut to start rails console
|
24
31
|
stack_car dockerize DIR # Will copy the docker tempates in to your project, see options for supported dependencies
|
25
|
-
stack_car exec ARGS # wraps docker
|
32
|
+
stack_car exec ARGS # wraps docker compose exec web unless --service is used to specify
|
26
33
|
stack_car help [COMMAND] # Describe available commands or one specific command
|
27
|
-
stack_car stop # starts docker
|
28
|
-
stack_car up # starts docker
|
29
|
-
stack_car walk ARGS # wraps docker
|
34
|
+
stack_car stop # starts docker compose with rebuild and orphan removal, defaults to all
|
35
|
+
stack_car up # starts docker compose with rebuild and orphan removal, defaults to web
|
36
|
+
stack_car walk ARGS # wraps docker compose run web unless --service is used to specify
|
30
37
|
```
|
31
38
|
|
32
39
|
## Development
|
@@ -50,10 +57,78 @@ Developing stack_car often requires a rails application for you to run updated c
|
|
50
57
|
- Commit your changes
|
51
58
|
|
52
59
|
### Releasing a new version
|
53
|
-
|
60
|
+
**NOTE:** You will need an account for [rubygems.org](https://rubygems.org) and be made an owner of the [stack_car gem](https://rubygems.org/gems/stack_car) in order to release a new version.
|
61
|
+
|
62
|
+
- Update the version number in `version.rb`. Please follow [Semantic Versioning](https://semver.org/) guidelines.
|
63
|
+
- Commit `version.rb` and create an MR. Once the MR is approved and merged, checkout the `main` branch and do a `git pull`.
|
54
64
|
- Run `bundle exec rake release`
|
55
65
|
- 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
66
|
|
67
|
+
## Dockerizing an application
|
68
|
+
|
69
|
+
Dockerizing your application with stack_car can be thought of in 2 steps:
|
70
|
+
- **Generate the file templates**
|
71
|
+
- **Customize provided templates to the requirements of the application**
|
72
|
+
|
73
|
+
**Set MERGE tool**
|
74
|
+
When using stack_car to dockerize an app, it might be necessary to merge templates as opposed to completely overwriting them. To set a tool run:
|
75
|
+
```bash
|
76
|
+
export THOR_MERGE=<editor>
|
77
|
+
```
|
78
|
+
Alternatively, set it in your shell's `rc` file (`~/.bashrc`, `~/.zshrc`, etc.)
|
79
|
+
|
80
|
+
With `THOR_MERGE` set, you can enter `m` at the command prompt when there is a conflict between app and `sc` template files.
|
81
|
+
|
82
|
+
*Note*: For best experience, set `THOR_MERGE` to **GUI text editor** (ie. `code` or `atom`).
|
83
|
+
|
84
|
+
Initiating a merge pulls 2 versions of the file to the editor. One is what is proposed by stack_car, the other is the original. **Add what you need from the template version to the original file and save the changes**.
|
85
|
+
|
86
|
+
### Generate templates (`sc dockerize`)
|
87
|
+
You can generate requisite files for running your application for local development in Docker with the **dockerize** command.
|
88
|
+
|
89
|
+
To **dockerize** your application:
|
90
|
+
- `cd` into your project dir
|
91
|
+
- Run `sc dockerize` to generate files, appending **service flags** to scaffold any other services your application requires
|
92
|
+
- **For example**:
|
93
|
+
- For rails/postgres: `sc dockerize --postgres`
|
94
|
+
- For rails/mysql/redis: `sc dockerize --mysql --redis`
|
95
|
+
|
96
|
+
This command will provide:
|
97
|
+
- `Dockerfile`
|
98
|
+
- `docker-compose.yml`
|
99
|
+
- `.env*` files
|
100
|
+
- **ops** files to get you set up for running your application with **nginx**.
|
101
|
+
|
102
|
+
### Customize templates
|
103
|
+
|
104
|
+
stack_car will have provided sensible defaults for your services but customization will be required per needs of each project (ie api tokens and email configuration where applicable).
|
105
|
+
|
106
|
+
**Customization workflow**
|
107
|
+
- Do a text search to find and replace any instances `CHANGEME` in the generated files
|
108
|
+
- Add any **general environment variables** to `.env`
|
109
|
+
- This sets defaults for all docker compose environments
|
110
|
+
- Add any **development environment variables** to `.env.development`
|
111
|
+
- These set up any new values or overrides specific to your development env
|
112
|
+
- Run `sc build` to build your image
|
113
|
+
- On failed build, browse the terminal output to track down and squash any misconfigurations. Rebuild
|
114
|
+
- Upon successful build, run `sc up` to spin up project
|
115
|
+
- If you get errors, browse the terminal output to track down and squash any misconfigurations (refer to the Docker dashboard to see separate logs for each service)
|
116
|
+
- Visit site at `localhost:3000`
|
117
|
+
- Alternatively, visit it at the host you have specified to work with **Dory**
|
118
|
+
- **Note**: *Depending on the DB required by your application, you will need to create the DB. You need to do that within from the container:*
|
119
|
+
- Using the `bundle-exec` command: `sc bundle-exec db:create`
|
120
|
+
- Shelling in and running in the container shell:
|
121
|
+
```bash
|
122
|
+
sc exec bash
|
123
|
+
bundle exec rails db:create
|
124
|
+
```
|
125
|
+
|
126
|
+
Once all services are running and speaking to each other you are good to go.
|
127
|
+
|
128
|
+
**Tips**:
|
129
|
+
- Any changes to `Dockerfile` will require `sc build` for the changes to manifest
|
130
|
+
- Changes to `docker-compose.yml` **do not require rebuild unless you have changed the image**
|
131
|
+
|
57
132
|
## Generating a Helm Chart
|
58
133
|
|
59
134
|
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**
|
@@ -88,15 +163,14 @@ Since values files are likely to contain sensitive information like API keys, th
|
|
88
163
|
|
89
164
|
Example workflow (given values file is already created):
|
90
165
|
- Edit values file
|
91
|
-
- `
|
92
|
-
- This command will create `staging-values.yaml.enc`
|
93
|
-
- `git add staging-values.yaml.enc`
|
166
|
+
- `bin/encrypt-secrets`
|
167
|
+
- This command will create/update `staging-values.yaml.enc`
|
94
168
|
- Commit and push
|
95
169
|
|
96
170
|
When pulling down a repo or branch, you will need to start by decrypting.
|
97
171
|
|
98
172
|
Example:
|
99
|
-
- `
|
173
|
+
- `bin/decrypt-secrets`
|
100
174
|
|
101
175
|
## Contributing
|
102
176
|
|
data/lib/stack_car/cli.rb
CHANGED
@@ -18,17 +18,17 @@ module StackCar
|
|
18
18
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
19
19
|
method_option :build, default: false, type: :boolean, aliases: '-b'
|
20
20
|
method_option :logs, default: true, type: :boolean
|
21
|
-
desc "up", "starts docker
|
21
|
+
desc "up", "starts docker compose with rebuild and orphan removal, defaults to web"
|
22
22
|
def up
|
23
23
|
setup
|
24
24
|
ensure_development_env
|
25
25
|
args = ['--remove-orphans']
|
26
26
|
args << '--build' if options[:build]
|
27
27
|
if options[:build]
|
28
|
-
run("#{dotenv} docker
|
28
|
+
run("#{dotenv} docker compose pull #{options[:service]}")
|
29
29
|
end
|
30
30
|
|
31
|
-
run_with_exit("#{dotenv} docker
|
31
|
+
run_with_exit("#{dotenv} docker compose up #{args.join(' ')} #{options[:service]}")
|
32
32
|
end
|
33
33
|
|
34
34
|
method_option :service, default: '', type: :string, aliases: '-s'
|
@@ -36,75 +36,123 @@ module StackCar
|
|
36
36
|
def stop
|
37
37
|
setup
|
38
38
|
ensure_development_env
|
39
|
-
run("#{dotenv} docker
|
39
|
+
run("#{dotenv} docker compose stop #{options[:service]}")
|
40
40
|
run_with_exit("rm -rf tmp/pids/*")
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
|
+
method_option :volumes, aliases: '-v'
|
44
|
+
method_option :rmi
|
45
|
+
method_option :'remove-orphans'
|
46
|
+
method_option :service, aliases: '-s'
|
47
|
+
method_option :timeout, aliases: '-t'
|
48
|
+
method_option :all, aliases: '-a'
|
49
|
+
method_option :help, aliases: '-h'
|
50
|
+
desc 'down', 'stops and removes containers and networks specific to this project by default, run with -h for more options'
|
51
|
+
def down
|
52
|
+
setup
|
53
|
+
ensure_development_env
|
54
|
+
|
55
|
+
if options[:help]
|
56
|
+
run('docker compose down --help')
|
57
|
+
say 'Additional stack_car options:'
|
58
|
+
say ' -a, --all Removes all containers, networks, volumes, and'
|
59
|
+
say ' images created by `up`.'
|
60
|
+
say ' -s, --service Specify a service defined in the Compose file'
|
61
|
+
say ' whose containers and volumes should be removed.'
|
62
|
+
exit(0)
|
63
|
+
end
|
64
|
+
|
65
|
+
if options[:service]
|
66
|
+
rm_vol = true if options[:volumes]
|
67
|
+
|
68
|
+
remove_container(options[:service], rm_vol)
|
69
|
+
exit(0)
|
70
|
+
end
|
71
|
+
|
72
|
+
run_conf = 'Running down will stop and remove all of the Docker containers and networks ' \
|
73
|
+
'defined in the docker-compose.yml file. Continue?'
|
74
|
+
prompt_run_confirmation(run_conf)
|
75
|
+
|
76
|
+
args = []
|
77
|
+
if options[:all]
|
78
|
+
prompt_run_confirmation('--all will remove all containers, volumes, networks, local images, and orphaned containers. Continue?')
|
79
|
+
|
80
|
+
args = %w[--volumes --rmi=local --remove-orphans]
|
81
|
+
else
|
82
|
+
args << '--volumes' if options[:volumes]
|
83
|
+
args << '--rmi=local' if options[:rmi]
|
84
|
+
args << '--remove-orphans' if options[:'remove-orphans']
|
85
|
+
args << '--timeout' if options[:timeout]
|
86
|
+
end
|
87
|
+
|
88
|
+
run("#{dotenv} docker compose down #{args.join(' ')}")
|
89
|
+
run_with_exit('rm -rf tmp/pids/*')
|
90
|
+
end
|
43
91
|
|
44
92
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
45
93
|
desc "build", "builds specified service, defaults to web"
|
46
94
|
def build
|
47
95
|
setup
|
48
96
|
ensure_development_env
|
49
|
-
run_with_exit("#{dotenv} docker
|
97
|
+
run_with_exit("#{dotenv} docker compose build #{options[:service]}")
|
50
98
|
end
|
51
99
|
|
52
100
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
53
|
-
desc "push ARGS", "wraps docker
|
101
|
+
desc "push ARGS", "wraps docker compose push web unless --service is used to specify"
|
54
102
|
def push(*args)
|
55
103
|
setup
|
56
|
-
run_with_exit("#{dotenv} docker
|
104
|
+
run_with_exit("#{dotenv} docker compose push #{options[:service]} #{args.join(' ')}")
|
57
105
|
end
|
58
106
|
|
59
107
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
60
|
-
desc "pull ARGS", "wraps docker
|
108
|
+
desc "pull ARGS", "wraps docker compose pull web unless --service is used to specify"
|
61
109
|
def pull(*args)
|
62
110
|
setup
|
63
|
-
run_with_exit("#{dotenv} docker
|
111
|
+
run_with_exit("#{dotenv} docker compose pull #{options[:service]} #{args.join(' ')}")
|
64
112
|
end
|
65
113
|
|
66
114
|
method_option :service, default: '', type: :string, aliases: '-s'
|
67
|
-
desc "ps ARGS", "wraps docker
|
115
|
+
desc "ps ARGS", "wraps docker compose pull web unless --service is used to specify"
|
68
116
|
def ps(*args)
|
69
117
|
setup
|
70
|
-
run_with_exit("#{dotenv} docker
|
118
|
+
run_with_exit("#{dotenv} docker compose ps #{options[:service]} #{args.join(' ')}")
|
71
119
|
end
|
72
120
|
map status: :ps
|
73
121
|
|
74
122
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
75
|
-
desc "bundle ARGS", "wraps docker
|
123
|
+
desc "bundle ARGS", "wraps docker compose run web unless --service is used to specify"
|
76
124
|
def bundle(*args)
|
77
125
|
setup
|
78
|
-
run_with_exit("#{dotenv} docker
|
126
|
+
run_with_exit("#{dotenv} docker compose exec #{options[:service]} bundle")
|
79
127
|
end
|
80
128
|
|
81
129
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
82
|
-
desc "walk ARGS", "wraps docker
|
130
|
+
desc "walk ARGS", "wraps docker compose run web unless --service is used to specify"
|
83
131
|
def walk(*args)
|
84
132
|
setup
|
85
|
-
run_with_exit("#{dotenv} docker
|
133
|
+
run_with_exit("#{dotenv} docker compose run #{options[:service]} #{args.join(' ')}")
|
86
134
|
end
|
87
135
|
|
88
136
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
89
|
-
desc "exec ARGS", "wraps docker
|
137
|
+
desc "exec ARGS", "wraps docker compose exec web unless --service is used to specify"
|
90
138
|
def exec(*args)
|
91
139
|
setup
|
92
|
-
run_with_exit("#{dotenv} docker
|
140
|
+
run_with_exit("#{dotenv} docker compose exec #{options[:service]} #{args.join(' ')}")
|
93
141
|
end
|
94
142
|
map ex: :exec
|
95
143
|
|
96
144
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
97
|
-
desc 'sh ARGS', "launch a shell using docker
|
145
|
+
desc 'sh ARGS', "launch a shell using docker compose exec, sets tty properly"
|
98
146
|
def sh(*args)
|
99
147
|
setup
|
100
|
-
run_with_exit("#{dotenv} docker
|
148
|
+
run_with_exit("#{dotenv} docker compose exec -e COLUMNS=\"\`tput cols\`\" -e LINES=\"\`tput lines\`\" #{options[:service]} bash #{args.join(' ')}")
|
101
149
|
end
|
102
150
|
|
103
151
|
method_option :service, default: 'web', type: :string, aliases: '-s'
|
104
|
-
desc "bundle_exec ARGS", "wraps docker
|
152
|
+
desc "bundle_exec ARGS", "wraps docker compose exec web bundle exec unless --service is used to specify"
|
105
153
|
def bundle_exec(*args)
|
106
154
|
setup
|
107
|
-
run_with_exit("#{dotenv} docker
|
155
|
+
run_with_exit("#{dotenv} docker compose exec #{options[:service]} bundle exec #{args.join(' ')}")
|
108
156
|
end
|
109
157
|
map be: :bundle_exec
|
110
158
|
|
@@ -112,7 +160,7 @@ module StackCar
|
|
112
160
|
desc "console ARGS", "shortcut to start rails console"
|
113
161
|
def console(*args)
|
114
162
|
setup
|
115
|
-
run_with_exit("#{dotenv} docker
|
163
|
+
run_with_exit("#{dotenv} docker compose exec #{options[:service]} bundle exec rails console #{args.join(' ')}")
|
116
164
|
end
|
117
165
|
map rc: :console
|
118
166
|
|
@@ -165,17 +213,17 @@ module StackCar
|
|
165
213
|
method_option :elasticsearch, default: false, type: :boolean, aliases: '-e'
|
166
214
|
method_option :fcrepo, default: false, type: :boolean, aliases: '-f'
|
167
215
|
method_option :helm, default: false, type: :boolean, aliases: '-h'
|
168
|
-
method_option :git, default:
|
216
|
+
method_option :git, default: false, type: :boolean, aliases: '-g'
|
169
217
|
method_option :heroku, default: false, type: :boolean, aliases: '-h'
|
170
|
-
method_option :hyku, default: false, type: :boolean, aliases:
|
218
|
+
method_option :hyku, default: false, type: :boolean, aliases: "\--hu"
|
171
219
|
method_option :imagemagick, default: false, type: :boolean, aliases: '-i'
|
172
|
-
method_option :memcached, default: false, type: :boolean, aliases:
|
173
|
-
method_option :mongodb, default: false, type: :boolean, aliases:
|
220
|
+
method_option :memcached, default: false, type: :boolean, aliases: "\--mc"
|
221
|
+
method_option :mongodb, default: false, type: :boolean, aliases: "\--mg"
|
174
222
|
method_option :mysql, default: false, type: :boolean, aliases: '-m'
|
175
223
|
method_option :postgres, default: false, type: :boolean, aliases: '-p'
|
176
|
-
method_option :rancher, default: false, type: :boolean, aliases:
|
224
|
+
method_option :rancher, default: false, type: :boolean, aliases: "\--dr"
|
177
225
|
method_option :redis, default: false, type: :boolean, aliases: '-r'
|
178
|
-
method_option :sidekiq, default: false, type: :boolean, aliases:
|
226
|
+
method_option :sidekiq, default: false, type: :boolean, aliases: "\--sk"
|
179
227
|
method_option :solr, default: false, type: :boolean, aliases: '-s'
|
180
228
|
method_option :yarn, default: false, type: :boolean, aliases: '-y'
|
181
229
|
desc 'dockerize DIR', 'Will copy the docker tempates in to your project, see options for supported dependencies'
|
@@ -191,7 +239,8 @@ module StackCar
|
|
191
239
|
setup
|
192
240
|
# Commandline overrides config files
|
193
241
|
# options = file_config.merge(options)
|
194
|
-
|
242
|
+
# Sets project name to parent directory name if working with stack_car dir
|
243
|
+
@project_name = @sc_dir ? File.basename(File.expand_path('..')) : File.basename(File.expand_path(dir))
|
195
244
|
apt_packages << "libpq-dev postgresql-client" if options[:postgres]
|
196
245
|
apt_packages << "mysql-client" if options[:mysql]
|
197
246
|
apt_packages << "imagemagick" if options[:imagemagick]
|
@@ -214,14 +263,25 @@ module StackCar
|
|
214
263
|
post_apt << "cd /opt && unzip fits-1.0.5.zip && chmod +X fits-1.0.5/fits.sh"
|
215
264
|
end
|
216
265
|
|
217
|
-
['.dockerignore', 'Dockerfile', '
|
266
|
+
['.dockerignore', 'Dockerfile', 'docker-compose.yml', '.gitlab-ci.yml', '.env'].each do |template_file|
|
218
267
|
puts template_file
|
219
268
|
template("#{template_file}.erb", template_file)
|
220
269
|
end
|
221
|
-
|
270
|
+
directory('.gitlab', '.gitlab')
|
222
271
|
template(".env.development.erb", ".env.development")
|
223
272
|
template(".env.erb", ".env.production")
|
273
|
+
template(".sops.yaml.erb", ".sops.yaml")
|
274
|
+
template("decrypt-secrets", "bin/decrypt-secrets")
|
275
|
+
template("encrypt-secrets", "bin/encrypt-secrets")
|
276
|
+
template("database.yml.erb", "config/database.yml")
|
277
|
+
template("development.rb.erb", "config/environments/development.rb")
|
278
|
+
template("production.rb.erb", "config/environments/production.rb")
|
224
279
|
|
280
|
+
if options[:solr]
|
281
|
+
template("solrcloud-upload-configset.sh", "bin/solrcloud-upload-configset.sh")
|
282
|
+
template("solrcloud-assign-configset.sh", "bin/solrcloud-assign-configset.sh")
|
283
|
+
end
|
284
|
+
|
225
285
|
if File.exists?('README.md')
|
226
286
|
prepend_to_file "README.md" do
|
227
287
|
File.read("#{self.class.source_root}/README.md")
|
@@ -272,7 +332,7 @@ module StackCar
|
|
272
332
|
protected
|
273
333
|
def compose_depends(*excludes)
|
274
334
|
@compose_depends = []
|
275
|
-
services = [:postgres, :mysql, :elasticsearch, :solr, :redis, :mongodb, :memcached] - excludes
|
335
|
+
services = [:fcrepo, :postgres, :mysql, :elasticsearch, :sidekiq, :solr, :redis, :mongodb, :memcached] - excludes
|
276
336
|
services.each do |service|
|
277
337
|
if options[service]
|
278
338
|
@compose_depends << " - #{service}"
|
@@ -344,10 +404,83 @@ module StackCar
|
|
344
404
|
|
345
405
|
def setup
|
346
406
|
if File.exists?('stack_car')
|
407
|
+
@sc_dir = true
|
347
408
|
Dir.chdir('stack_car')
|
348
409
|
self.destination_root += "/stack_car"
|
349
410
|
end
|
350
411
|
DotRc.new
|
351
412
|
end
|
413
|
+
|
414
|
+
def remove_container(service_name, remove_volumes)
|
415
|
+
container = find_container_by_service(service_name)
|
416
|
+
|
417
|
+
container.map do |id, name|
|
418
|
+
prompt_run_confirmation("Remove #{name} container?")
|
419
|
+
|
420
|
+
if `docker container ls --format "{{.Names}}"`.include?(name)
|
421
|
+
say 'Stopping container...'
|
422
|
+
`docker stop #{id}`
|
423
|
+
end
|
424
|
+
|
425
|
+
say 'Removing container...'
|
426
|
+
`docker container rm #{id}`
|
427
|
+
|
428
|
+
# Ensure container was removed
|
429
|
+
if `docker ps -aqf id=#{id}`.empty?
|
430
|
+
say " Container #{name} was removed"
|
431
|
+
else
|
432
|
+
say ">>> There was an issue removing container #{name} (#{id})"
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
remove_volumes_mounted_to_container(@container_volume_names) if remove_volumes
|
437
|
+
end
|
438
|
+
|
439
|
+
def find_container_by_service(service_name)
|
440
|
+
container_id = `docker compose ps -aq #{service_name}`.strip
|
441
|
+
|
442
|
+
if container_id.empty?
|
443
|
+
say "Unable to locate a container for the service '#{service_name}'"
|
444
|
+
say "Try running `docker compose ps #{service_name}` to make sure the container exists"
|
445
|
+
exit(1)
|
446
|
+
end
|
447
|
+
|
448
|
+
get_volume_names_for_container(container_id)
|
449
|
+
container_name = `docker ps -af id=#{container_id} --format "{{.Names}}"`.strip
|
450
|
+
|
451
|
+
{ container_id => container_name }
|
452
|
+
end
|
453
|
+
|
454
|
+
def remove_volumes_mounted_to_container(volumes)
|
455
|
+
return if volumes.empty?
|
456
|
+
|
457
|
+
prompt_run_confirmation("\n#{volumes.join("\n")}\nRemove these volume(s)?")
|
458
|
+
volumes.each do |v|
|
459
|
+
say 'Removing volume...'
|
460
|
+
`docker volume rm #{v}`
|
461
|
+
|
462
|
+
if `docker volume ls -q`.include?(v)
|
463
|
+
say ">>> There was an issue removing volume #{v}"
|
464
|
+
else
|
465
|
+
say " Volume #{v} was removed"
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
def get_volume_names_for_container(container_id)
|
471
|
+
@container_volume_names ||= []
|
472
|
+
return @container_volume_names unless @container_volume_names.empty?
|
473
|
+
|
474
|
+
JSON.parse(`docker inspect --format="{{json .Mounts}}" #{container_id}`).map do |mount_info|
|
475
|
+
@container_volume_names << mount_info['Name'] if mount_info['Type'] == 'volume'
|
476
|
+
end
|
477
|
+
|
478
|
+
@container_volume_names
|
479
|
+
end
|
480
|
+
|
481
|
+
def prompt_run_confirmation(question)
|
482
|
+
response = ask(question, limited_to: %w[y n])
|
483
|
+
exit(1) unless response == 'y'
|
484
|
+
end
|
352
485
|
end
|
353
486
|
end
|
data/lib/stack_car/version.rb
CHANGED
data/stack_car.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.13"
|
23
|
+
spec.add_development_dependency "byebug"
|
23
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
25
|
spec.add_development_dependency "rspec", "~> 3.0"
|
25
26
|
spec.add_development_dependency "yard"
|
data/templates/.env.erb
CHANGED
@@ -2,6 +2,20 @@ APP_NAME=<%= @project_name %>
|
|
2
2
|
PASSENGER_APP_ENV=development
|
3
3
|
REGISTRY_HOST=registry.gitlab.com
|
4
4
|
REGISTRY_URI=/CHANGEME/<%= @project_name %>
|
5
|
+
|
6
|
+
# SMTP Mailer variables
|
7
|
+
# To enable mailer:
|
8
|
+
# - Uncomment and edit SMTP vars
|
9
|
+
# - Uncomment SMTP Mailer section in respective config/environments file
|
10
|
+
# SMTP_USER_NAME=CHANGEME
|
11
|
+
# SMTP_PASSWORD=CHANGEME
|
12
|
+
# SMTP_ADDRESS=CHANGEME
|
13
|
+
# SMTP_DOMAIN=CHANGEME
|
14
|
+
# SMTP_PORT=CHANGEME
|
15
|
+
# SMTP_TYPE=CHANGEME
|
16
|
+
<% if options[:hyku] %>
|
17
|
+
# SETTINGS__MULTITENANCY__ADMIN_HOST=CHANGEME
|
18
|
+
<% end %>
|
5
19
|
TAG=dev
|
6
20
|
<% if options[:postgres] -%>
|
7
21
|
DATABASE_NAME=<%= @project_name %>
|
@@ -27,3 +41,12 @@ ES_URL=http://elasticsearch:9200
|
|
27
41
|
SITE_URI=https://CHANGEME.com
|
28
42
|
DEPLOY_HOOK=CHANGEME
|
29
43
|
<% end -%>
|
44
|
+
<% if options[:solr] -%>
|
45
|
+
SOLR_URL=http://admin:admin@solr:8983/solr/<%= @project_name %>-development
|
46
|
+
SOLR_ADMIN_PASSWORD=admin
|
47
|
+
SOLR_ADMIN_USER=admin
|
48
|
+
SOLR_COLLECTION_NAME=<%= @project_name %>-development
|
49
|
+
SOLR_CONFIGSET_NAME=<%= @project_name %>
|
50
|
+
SOLR_HOST=solr
|
51
|
+
SOLR_PORT=8983
|
52
|
+
<% end -%>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Summary
|
2
|
+
|
3
|
+
A short description of the bug. Use # to link to the parent issue or merge request
|
4
|
+
|
5
|
+
# Observed Behavior
|
6
|
+
|
7
|
+
The current, bugged behavior.
|
8
|
+
|
9
|
+
# Expected Behavior
|
10
|
+
|
11
|
+
How it should behave once it's fixed. What "done" looks like.
|
12
|
+
|
13
|
+
# Screenshots or Video
|
14
|
+
|
15
|
+
Include screenshots or videos that demonstrate the bug
|
16
|
+
|
17
|
+
# Other Information
|
18
|
+
|
19
|
+
Any other logs, related issues, merge requests, wireframes, documentation, slack conversations or anything else that would help the developer try to find and fix this issue, or provide context.
|
20
|
+
|
21
|
+
# Acceptance Criteria
|
22
|
+
|
23
|
+
This is what done looks like. A higher level checklist of the goals and functionality after this bug is fixed
|
24
|
+
|
25
|
+
* [ ] I see these views
|
26
|
+
* [ ] When a user does this, that happens
|
27
|
+
|
28
|
+
# Steps to Reproduce / Testing Instructions
|
29
|
+
|
30
|
+
How did you trigger this bug? Include links to the page where the error occured, if applicable.
|
31
|
+
|
32
|
+
* [ ] As a (logged in/admin/etc) User
|
33
|
+
* [ ] With these other conditions
|
34
|
+
* [ ] I did these things
|
35
|
+
* [ ] And observed this behavior
|
36
|
+
|
37
|
+
## Further information
|
38
|
+
|
39
|
+
Edit in any later issues or merge requests that are conencted to this issue, for future reference
|
40
|
+
|
41
|
+
### Implementation suggestions
|
42
|
+
|
43
|
+
Are nice, but should probably go in a comment. e.g. gems, unrelated issues that dealt with similar problems, stack overflow links.
|
44
|
+
|
45
|
+
/label ~"Needs Rework", ~"Ready for Development"
|
46
|
+
<!-- By default, should bugs go to Ready for development, to be on the development board, or be like normal issues and go to the planning board> -->
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Summary
|
2
|
+
|
3
|
+
A short description of the feature
|
4
|
+
|
5
|
+
# User Stories
|
6
|
+
|
7
|
+
What problem is this feature going to solve?
|
8
|
+
|
9
|
+
# Screenshots or Video
|
10
|
+
|
11
|
+
Include any relevant media such as wireframes, screenshots, or videos
|
12
|
+
|
13
|
+
# Relationships
|
14
|
+
|
15
|
+
Are there any other issues or merge requests that are related to this feature (use # to generate a quick link). In particular, is this part of a larger epic, or does it depend on any other tickets being resolved first? Do you need anything else or are you making any other assumptions for this feature?
|
16
|
+
|
17
|
+
# Acceptance Criteria
|
18
|
+
|
19
|
+
This is what done looks like. A higher level checklist of the goals and functionality of this feature
|
20
|
+
|
21
|
+
* [ ] I see these views
|
22
|
+
* [ ] When a user does this, that happens
|
23
|
+
|
24
|
+
# Testing Instructions
|
25
|
+
|
26
|
+
Steps to demonstrate this feature is properly working. Include a video, if possible. The How to the Acceptance Criteria's What
|
27
|
+
|
28
|
+
* [ ] As a (user/admin)
|
29
|
+
* [ ] Go here and do these things
|
30
|
+
* [ ] To see this happen
|
31
|
+
|
32
|
+
|
33
|
+
## Further information
|
34
|
+
|
35
|
+
Edit in any later issues or merge requests that are conencted to this issue, for future reference
|
36
|
+
|
37
|
+
### Implimentation Suggestions
|
38
|
+
|
39
|
+
Any development details that would be helpful when working on this feature e.g. gems, unrelated issues that dealt with similar problems, stack overflow links.
|
40
|
+
|
41
|
+
/label ~Icebox
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Summary
|
2
|
+
A short description of the question.
|
3
|
+
|
4
|
+
## Who has this information
|
5
|
+
Consider using @ to tag them, if they're in this repository
|
6
|
+
|
7
|
+
# Additional information
|
8
|
+
More details about what needs to be answered
|
9
|
+
* [ ] Checkboxes are helpful
|
10
|
+
* [ ] To make sure all answers are enumerated
|
11
|
+
|
12
|
+
# Other links
|
13
|
+
Pictures, videos, links to issues, or anything else that might be helpful to provide context for the question
|
14
|
+
|
15
|
+
/label ~"Planning in Progress"
|
16
|
+
|
17
|
+
/assign me
|
18
|
+
<!-- this might cause inboxes to explode, but presumably the one creating a question ticket would be the one who was taking ownership for it, and would be the one responsible for cleaning it up once the question was answered -->
|