stack_car 0.12.0 → 0.15.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.
- 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 -->
|