cpflow 3.0.1 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rspec-shared.yml +12 -9
- data/.github/workflows/rspec-specific.yml +18 -0
- data/.github/workflows/rspec.yml +6 -6
- data/.overcommit.yml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +41 -17
- data/CONTRIBUTING.md +1 -1
- data/Gemfile.lock +1 -1
- data/lib/command/apply_template.rb +1 -1
- data/lib/command/base.rb +41 -22
- data/lib/command/build_image.rb +5 -1
- data/lib/command/cleanup_stale_apps.rb +1 -1
- data/lib/command/deploy_image.rb +10 -1
- data/lib/command/doctor.rb +1 -1
- data/lib/command/generate.rb +1 -0
- data/lib/command/maintenance.rb +6 -18
- data/lib/command/maintenance_off.rb +6 -40
- data/lib/command/maintenance_on.rb +6 -40
- data/lib/command/no_command.rb +2 -2
- data/lib/command/promote_app_from_upstream.rb +2 -2
- data/lib/command/run.rb +4 -4
- data/lib/command/setup_app.rb +1 -1
- data/lib/command/test.rb +2 -2
- data/lib/core/controlplane.rb +3 -4
- data/lib/core/doctor_service.rb +6 -8
- data/lib/core/maintenance_mode.rb +111 -0
- data/lib/core/template_parser.rb +7 -7
- data/lib/cpflow/version.rb +2 -2
- data/lib/cpflow.rb +6 -21
- data/lib/patches/thor.rb +26 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48de117fc2fbc2458b8469bfb3d93663c2950777803f84079dfdfa7cdbcda9e9
|
4
|
+
data.tar.gz: e3a8347bd330f6df7d2d5e98a3692144fa04d3c935241fbacf7ab06c8f039e79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '06907b1c67896b14b71376bc88253fcd74a675fb088aab8f6c7bf051ebfaf3f463c3ab96bf33bf64abe6da5bf1dff22529503508176a6d1fc5c35517021c9dc4'
|
7
|
+
data.tar.gz: ae76127106fa6dc3544669163e94571d68ec149f22b8ed68d1cf0332c3f333b65e1a1d2f6f6b2cb75039d45bcf1f8418f1cb4d5ceba750cf11cc930ac5d38ac4
|
@@ -3,19 +3,22 @@ name: RSpec Shared
|
|
3
3
|
on:
|
4
4
|
workflow_call:
|
5
5
|
inputs:
|
6
|
-
|
6
|
+
os_version:
|
7
7
|
required: true
|
8
8
|
type: string
|
9
|
-
|
9
|
+
ruby_version:
|
10
10
|
required: true
|
11
11
|
type: string
|
12
|
-
|
13
|
-
required:
|
12
|
+
test_tag:
|
13
|
+
required: false
|
14
|
+
type: string
|
15
|
+
spec_paths:
|
16
|
+
required: false
|
14
17
|
type: string
|
15
18
|
|
16
19
|
jobs:
|
17
20
|
rspec:
|
18
|
-
runs-on: ${{ inputs.
|
21
|
+
runs-on: ${{ inputs.os_version }}
|
19
22
|
env:
|
20
23
|
RAILS_ENV: test
|
21
24
|
# We have to add "_CI" to the end, otherwise it messes with tests where we switch profiles,
|
@@ -28,7 +31,7 @@ jobs:
|
|
28
31
|
- name: Set up Ruby
|
29
32
|
uses: ruby/setup-ruby@v1
|
30
33
|
with:
|
31
|
-
ruby-version: ${{ inputs.
|
34
|
+
ruby-version: ${{ inputs.ruby_version }}
|
32
35
|
bundler-cache: true
|
33
36
|
- name: Install dependencies
|
34
37
|
run: bundle install
|
@@ -41,16 +44,16 @@ jobs:
|
|
41
44
|
cpln profile create default --token $CPLN_TOKEN_CI --org $CPLN_ORG
|
42
45
|
cpln image docker-login
|
43
46
|
- name: Run tests
|
44
|
-
run: bundle exec rspec --format documentation --tag ${{ inputs.
|
47
|
+
run: bundle exec rspec --format documentation ${{ inputs.test_tag && format('--tag {0}', inputs.test_tag) }} ${{ inputs.spec_paths }}
|
45
48
|
- name: Upload spec log
|
46
49
|
uses: actions/upload-artifact@master
|
47
50
|
if: always()
|
48
51
|
with:
|
49
|
-
name: spec-${{ inputs.
|
52
|
+
name: spec-${{ inputs.test_tag }}-${{ github.run_id }}-${{ inputs.os_version }}-${{ inputs.ruby_version }}.log
|
50
53
|
path: spec.log
|
51
54
|
- name: Upload coverage results
|
52
55
|
uses: actions/upload-artifact@master
|
53
56
|
if: always()
|
54
57
|
with:
|
55
|
-
name: coverage-report-${{ inputs.
|
58
|
+
name: coverage-report-${{ inputs.test_tag }}-${{ github.run_id }}-${{ inputs.os_version }}-${{ inputs.ruby_version }}
|
56
59
|
path: coverage
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: RSpec Specific
|
2
|
+
|
3
|
+
on:
|
4
|
+
workflow_dispatch:
|
5
|
+
inputs:
|
6
|
+
spec_paths:
|
7
|
+
description: "Test files or directories that should be run"
|
8
|
+
required: true
|
9
|
+
|
10
|
+
jobs:
|
11
|
+
rspec-specific:
|
12
|
+
name: RSpec (Specific)
|
13
|
+
uses: ./.github/workflows/rspec-shared.yml
|
14
|
+
with:
|
15
|
+
os_version: ubuntu-latest
|
16
|
+
ruby_version: "3.2"
|
17
|
+
spec_paths: ${{ inputs.spec_paths }}
|
18
|
+
secrets: inherit
|
data/.github/workflows/rspec.yml
CHANGED
@@ -12,9 +12,9 @@ jobs:
|
|
12
12
|
name: RSpec (Fast)
|
13
13
|
uses: ./.github/workflows/rspec-shared.yml
|
14
14
|
with:
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
os_version: ubuntu-latest
|
16
|
+
ruby_version: "3.2"
|
17
|
+
test_tag: ~slow
|
18
18
|
secrets: inherit
|
19
19
|
|
20
20
|
rspec-slow:
|
@@ -22,7 +22,7 @@ jobs:
|
|
22
22
|
uses: ./.github/workflows/rspec-shared.yml
|
23
23
|
if: github.event_name == 'workflow_dispatch'
|
24
24
|
with:
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
os_version: ubuntu-latest
|
26
|
+
ruby_version: "3.2"
|
27
|
+
test_tag: slow
|
28
28
|
secrets: inherit
|
data/.overcommit.yml
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -14,12 +14,34 @@ Changes since the last non-beta release.
|
|
14
14
|
|
15
15
|
_Please add entries here for your pull requests that have not yet been released._
|
16
16
|
|
17
|
+
### Fixed
|
18
|
+
|
19
|
+
- Fixed issue where `run` command fails when runner workload has ENV but original workload does not. [PR 227](https://github.com/shakacode/control-plane-flow/pull/227) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
20
|
+
|
21
|
+
- Fixed potential infinite loop that could occur for a command if one of the execution steps fails and gets stuck. [PR 217](https://github.com/shakacode/control-plane-flow/pull/217) by [Zakir Dzhamaliddinov](https://github.com/zzaakiirr).
|
22
|
+
|
23
|
+
## [4.0.0] - 2024-08-21
|
24
|
+
|
25
|
+
### Fixed
|
26
|
+
|
27
|
+
- Fixed issue where common options are not forwarded to other commands. [PR 207](https://github.com/shakacode/control-plane-flow/pull/207) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
28
|
+
- Fixed BYOK endpoint. [PR 209](https://github.com/shakacode/control-plane-flow/pull/209) by [Sergey Tarasov](https://github.com/dzirtusss).
|
29
|
+
- Fixed issue where `generate` command fails if no project config exists. [PR 219](https://github.com/shakacode/control-plane-flow/pull/219) by [Zakir Dzhamaliddinov](https://github.com/zzaakiirr).
|
30
|
+
- Bumped min `cpln` version to `3.1.0` and fixed `cpln workload exec` calls. [PR 226](https://github.com/shakacode/control-plane-flow/pull/226) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
31
|
+
|
32
|
+
## [3.0.1] - 2024-06-26
|
33
|
+
|
34
|
+
### Fixed
|
35
|
+
|
36
|
+
- Moved development dependencies to Gemfile and updated many of them. [PR 208](https://github.com/shakacode/control-plane-flow/pull/208) by [Justin Gordon](https://github.com/justin808).
|
37
|
+
|
38
|
+
## [3.0.0] - 2024-06-21
|
17
39
|
|
18
|
-
## [3.0.0] - 2024-06-20
|
19
40
|
First release of `cpflow`.
|
20
41
|
|
21
|
-
## [2.2.4] - 2024-06-
|
22
|
-
|
42
|
+
## [2.2.4] - 2024-06-21
|
43
|
+
|
44
|
+
Deprecated `cpl` gem. New gem is `cpflow`.
|
23
45
|
|
24
46
|
## [2.2.1] - 2024-06-17
|
25
47
|
|
@@ -64,17 +86,17 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
64
86
|
- Specific validations are now run before commands, and the command will exit with a non-zero code if any validation fails. Can be disabled by setting `DISABLE_VALIDATIONS` env var to `true`. [PR 185](https://github.com/shakacode/control-plane-flow/pull/185) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
65
87
|
- Deprecated the `--skip-secret-access-binding` option in favor of `--skip-secrets-setup`. This can also now be configured through `skip_secrets_setup` in `controlplane.yml` [PR 190](https://github.com/shakacode/control-plane-flow/pull/190) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
66
88
|
|
67
|
-
## [2.0.2] - 2024-05-
|
89
|
+
## [2.0.2] - 2024-05-18
|
68
90
|
|
69
91
|
- Fixed issue with improper handling of job statuses. Fixed issue with interactive magic string showing and exit code. [PR 177](https://github.com/shakacode/control-plane-flow/pull/177) by [Sergey Tarasov](https://github.com/dzirtusss).
|
70
92
|
|
71
|
-
## [2.0.1] - 2024-05-
|
93
|
+
## [2.0.1] - 2024-05-16
|
72
94
|
|
73
95
|
### Fixed
|
74
96
|
|
75
97
|
- Fixed issue where `cleanup-stale-apps` command fails to delete apps with volumesets. [PR 175](https://github.com/shakacode/control-plane-flow/pull/175) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
76
98
|
|
77
|
-
## [2.0.0] - 2024-05-
|
99
|
+
## [2.0.0] - 2024-05-15
|
78
100
|
|
79
101
|
### BREAKING CHANGES
|
80
102
|
|
@@ -104,7 +126,7 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
104
126
|
- `deploy-image` command now raises an error if image does not exist. [PR 153](https://github.com/shakacode/control-plane-flow/pull/153) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
105
127
|
- `delete` command now unbinds identity from policy (if bound) when deleting app. [PR 170](https://github.com/shakacode/control-plane-flow/pull/170) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
106
128
|
|
107
|
-
## [1.4.0] - 2024-03-
|
129
|
+
## [1.4.0] - 2024-03-21
|
108
130
|
|
109
131
|
### Added
|
110
132
|
|
@@ -141,12 +163,12 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
141
163
|
- `info` command now lists workloads in the same order as `controlplane.yml`. [PR 139](https://github.com/shakacode/control-plane-flow/pull/139) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
142
164
|
- Improved domain workload matching for `maintenance`, `maintenance:on` and `maintenance:off` commands (instead of matching only by workload, it now matches by org + app + workload, which is more accurate). [PR 140](https://github.com/shakacode/control-plane-flow/pull/140) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
143
165
|
|
144
|
-
## [1.2.0] - 2024-01-
|
166
|
+
## [1.2.0] - 2024-01-04
|
145
167
|
|
146
168
|
### Fixed
|
147
169
|
|
148
170
|
- Fixed issue where `info` command does not respect `CPLN_ORG` env var. [PR 88](https://github.com/shakacode/control-plane-flow/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
149
|
-
- Fixed issues with running `cpflow --version` and `cpflow --help` where no configuration file exists. [PR
|
171
|
+
- Fixed issues with running `cpflow --version` and `cpflow --help` where no configuration file exists. [PR 109](https://github.com/shakacode/control-plane-flow/pull/109) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
150
172
|
- Fixed issue where `delete` command fails to delete apps with volumesets. [PR 123](https://github.com/shakacode/control-plane-flow/pull/123) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
151
173
|
|
152
174
|
### Added
|
@@ -157,19 +179,19 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
157
179
|
- Added option to only use `CPLN_ORG` and `CPLN_APP` env vars if `allow_org_override_by_env` and `allow_app_override_by_env` configs are set to `true` in `controlplane.yml`. [PR 109](https://github.com/shakacode/control-plane-flow/pull/109) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
158
180
|
- Added `CPLN_LOCATION` env variable and `--location` option for `apply-template`, `ps`, `run`, `run:detached`. [PR 105](https://github.com/shakacode/control-plane-flow/pull/105) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
159
181
|
- Added `generate` command for creating basic Control Plane configuration directory. [PR 116](https://github.com/shakacode/control-plane-flow/pull/116) by [Mostafa Ahangarhga](https://github.com/ahangarha).
|
160
|
-
- Added `--trace` option to all commands for more detailed logs. [PR 124](https://github.com/shakacode/control-plane-flow/pull/124) by [
|
161
|
-
- Added better error message to check the org name in case of a 403 error. [PR 124](https://github.com/
|
182
|
+
- Added `--trace` option to all commands for more detailed logs. [PR 124](https://github.com/shakacode/control-plane-flow/pull/124) by [Justin Gordon](https://github.com/justin808).
|
183
|
+
- Added better error message to check the org name in case of a 403 error. [PR 124](https://github.com/shakacode/control-plane-flow/pull/124) by [Justin Gordon](https://github.com/justin808).
|
162
184
|
|
163
185
|
### Changed
|
164
186
|
|
165
187
|
- `--org` option now takes precedence over `CPLN_ORG` env var, which takes precedence over `cpln_org` from `controlplane.yml`. [PR 88](https://github.com/shakacode/control-plane-flow/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
166
188
|
- Renamed `setup` config into `setup_app_templates`. [PR 112](https://github.com/shakacode/control-plane-flow/pull/112) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
167
189
|
|
168
|
-
## [1.1.2] - 2023-10-
|
190
|
+
## [1.1.2] - 2023-10-25
|
169
191
|
|
170
192
|
### Fixed
|
171
193
|
|
172
|
-
- Fixed failed build on MacOS by adding platform flag and fixed multiple files in yaml document for template. [PR 81](https://github.com/shakacode/control-plane-flow/pull/81) by [
|
194
|
+
- Fixed failed build on MacOS by adding platform flag and fixed multiple files in yaml document for template. [PR 81](https://github.com/shakacode/control-plane-flow/pull/81) by [Justin Gordon](https://github.com/justin808).
|
173
195
|
|
174
196
|
### Added
|
175
197
|
|
@@ -181,7 +203,7 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
181
203
|
|
182
204
|
- Calling `cpflow` with no command now shows the help menu. [PR 83](https://github.com/shakacode/control-plane-flow/pull/83) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
183
205
|
|
184
|
-
## [1.1.1] - 2023-09-
|
206
|
+
## [1.1.1] - 2023-09-21
|
185
207
|
|
186
208
|
### Fixed
|
187
209
|
|
@@ -205,7 +227,7 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
205
227
|
- Renamed `cleanup-old-images` command to `cleanup-images`. [PR 72](https://github.com/shakacode/control-plane-flow/pull/72) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
206
228
|
- Renamed `old_image_retention_days` config to `image_retention_days`. [PR 72](https://github.com/shakacode/control-plane-flow/pull/72) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
207
229
|
|
208
|
-
## [1.0.4] - 2023-07-
|
230
|
+
## [1.0.4] - 2023-07-24
|
209
231
|
|
210
232
|
### Fixed
|
211
233
|
|
@@ -244,9 +266,11 @@ Deprecate `cpl` CLI. New gem is `cpflow`
|
|
244
266
|
|
245
267
|
## [1.0.0] - 2023-05-29
|
246
268
|
|
247
|
-
|
269
|
+
First release.
|
248
270
|
|
249
|
-
[Unreleased]: https://github.com/shakacode/control-plane-flow/compare/
|
271
|
+
[Unreleased]: https://github.com/shakacode/control-plane-flow/compare/v4.0.0...HEAD
|
272
|
+
[4.0.0]: https://github.com/shakacode/control-plane-flow/compare/v3.0.1...v4.0.0
|
273
|
+
[3.0.1]: https://github.com/shakacode/control-plane-flow/compare/v3.0.0...v3.0.1
|
250
274
|
[3.0.0]: https://github.com/shakacode/control-plane-flow/compare/v2.2.4...v3.0.0
|
251
275
|
[2.2.4]: https://github.com/shakacode/control-plane-flow/compare/v2.2.1...v2.2.4
|
252
276
|
[2.2.1]: https://github.com/shakacode/control-plane-flow/compare/v2.2.0...v2.2.1
|
data/CONTRIBUTING.md
CHANGED
@@ -64,7 +64,7 @@ CPLN_ORG=your-org-for-tests bundle exec rspec --tag slow
|
|
64
64
|
2. Use the `--trace` option to see full logging of HTTP requests. Warning, this will display keys to your logs or console.
|
65
65
|
1. Add a breakpoint (`debugger`) to any line of code you want to debug.
|
66
66
|
2. Modify the `lib/command/test.rb` file to trigger the code you want to test. To simulate a command, you can use
|
67
|
-
`
|
67
|
+
`run_cpflow_command` (e.g., `run_cpflow_command("deploy-image", "-a", "my-app-name")` would be the same as running
|
68
68
|
`cpflow deploy-image -a my-app-name`).
|
69
69
|
3. Run the `test` command in your test app with a `.controlplane` directory.
|
70
70
|
|
data/Gemfile.lock
CHANGED
@@ -43,7 +43,7 @@ module Command
|
|
43
43
|
VALIDATIONS = %w[config templates].freeze
|
44
44
|
|
45
45
|
def call # rubocop:disable Metrics/MethodLength
|
46
|
-
@template_parser = TemplateParser.new(
|
46
|
+
@template_parser = TemplateParser.new(self)
|
47
47
|
@names_to_filenames = config.args.to_h do |name|
|
48
48
|
[name, @template_parser.template_filename(name)]
|
49
49
|
end
|
data/lib/command/base.rb
CHANGED
@@ -465,45 +465,50 @@ module Command
|
|
465
465
|
$stderr
|
466
466
|
end
|
467
467
|
|
468
|
-
def
|
469
|
-
message = error.message
|
470
|
-
if abort_on_error
|
471
|
-
progress.puts(" #{Shell.color('failed!', :red)}\n\n")
|
472
|
-
Shell.abort(message)
|
473
|
-
else
|
474
|
-
Shell.write_to_tmp_stderr(message)
|
475
|
-
end
|
476
|
-
end
|
477
|
-
|
478
|
-
def step_finish(success)
|
468
|
+
def step_finish(success, abort_on_error: true)
|
479
469
|
if success
|
480
470
|
progress.puts(" #{Shell.color('done!', :green)}")
|
481
471
|
else
|
482
472
|
progress.puts(" #{Shell.color('failed!', :red)}\n\n#{Shell.read_from_tmp_stderr}\n\n")
|
473
|
+
exit(ExitCode::ERROR_DEFAULT) if abort_on_error
|
483
474
|
end
|
484
475
|
end
|
485
476
|
|
486
|
-
def step(message, abort_on_error: true, retry_on_failure: false) # rubocop:disable Metrics/MethodLength
|
477
|
+
def step(message, abort_on_error: true, retry_on_failure: false, max_retry_count: 1000, wait: 1, &block) # rubocop:disable Metrics/MethodLength
|
487
478
|
progress.print("#{message}...")
|
488
479
|
|
489
480
|
Shell.use_tmp_stderr do
|
490
481
|
success = false
|
491
482
|
|
492
483
|
begin
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
484
|
+
success =
|
485
|
+
if retry_on_failure
|
486
|
+
with_retry(max_retry_count: max_retry_count, wait: wait, &block)
|
487
|
+
else
|
488
|
+
yield
|
497
489
|
end
|
498
|
-
else
|
499
|
-
success = yield
|
500
|
-
end
|
501
490
|
rescue RuntimeError => e
|
502
|
-
|
491
|
+
Shell.write_to_tmp_stderr(e.message)
|
503
492
|
end
|
504
493
|
|
505
|
-
step_finish(success)
|
494
|
+
step_finish(success, abort_on_error: abort_on_error)
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
def with_retry(max_retry_count:, wait:)
|
499
|
+
retry_count = 0
|
500
|
+
success = false
|
501
|
+
|
502
|
+
while !success && retry_count <= max_retry_count
|
503
|
+
success = yield
|
504
|
+
break if success
|
505
|
+
|
506
|
+
progress.print(".")
|
507
|
+
Kernel.sleep(wait)
|
508
|
+
retry_count += 1
|
506
509
|
end
|
510
|
+
|
511
|
+
success
|
507
512
|
end
|
508
513
|
|
509
514
|
def cp
|
@@ -527,7 +532,7 @@ module Command
|
|
527
532
|
progress.puts("Running #{title}...\n\n")
|
528
533
|
|
529
534
|
begin
|
530
|
-
|
535
|
+
run_cpflow_command("run", "-a", config.app, "--image", "latest", "--", command)
|
531
536
|
rescue SystemExit => e
|
532
537
|
progress.puts
|
533
538
|
|
@@ -536,5 +541,19 @@ module Command
|
|
536
541
|
progress.puts("Finished running #{title}.\n\n")
|
537
542
|
end
|
538
543
|
end
|
544
|
+
|
545
|
+
def run_cpflow_command(command, *args)
|
546
|
+
common_args = []
|
547
|
+
|
548
|
+
self.class.common_options.each do |option|
|
549
|
+
value = config.options[option[:name]]
|
550
|
+
next if value.nil?
|
551
|
+
|
552
|
+
name = "--#{option[:name].to_s.tr('_', '-')}"
|
553
|
+
common_args.push(name, value)
|
554
|
+
end
|
555
|
+
|
556
|
+
Cpflow::Cli.start([command, *common_args, *args])
|
557
|
+
end
|
539
558
|
end
|
540
559
|
end
|
data/lib/command/build_image.rb
CHANGED
@@ -38,7 +38,11 @@ module Command
|
|
38
38
|
docker_args: config.args,
|
39
39
|
build_args: build_args)
|
40
40
|
|
41
|
-
|
41
|
+
push_path = "/org/#{config.org}/image/#{image_name}"
|
42
|
+
|
43
|
+
progress.puts("\nPushing image to '#{push_path}'...\n\n")
|
44
|
+
cp.image_push(image_url)
|
45
|
+
progress.puts("\nPushed image to '#{push_path}'.\n\n")
|
42
46
|
|
43
47
|
step("Waiting for image to be available", retry_on_failure: true) do
|
44
48
|
images = cp.query_images["items"]
|
data/lib/command/deploy_image.rb
CHANGED
@@ -35,7 +35,7 @@ module Command
|
|
35
35
|
container_name = container["name"]
|
36
36
|
step("Deploying image '#{image}' for workload '#{container_name}'") do
|
37
37
|
cp.workload_set_image_ref(workload, container: container_name, image: image)
|
38
|
-
deployed_endpoints[container_name] = workload_data
|
38
|
+
deployed_endpoints[container_name] = endpoint_for_workload(workload_data)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -48,6 +48,15 @@ module Command
|
|
48
48
|
|
49
49
|
private
|
50
50
|
|
51
|
+
def endpoint_for_workload(workload_data)
|
52
|
+
endpoint = workload_data.dig("status", "endpoint")
|
53
|
+
Resolv.getaddress(endpoint.split("/").last)
|
54
|
+
endpoint
|
55
|
+
rescue Resolv::ResolvError
|
56
|
+
deployments = cp.fetch_workload_deployments(workload_data["name"])
|
57
|
+
deployments.dig("items", 0, "status", "endpoint")
|
58
|
+
end
|
59
|
+
|
51
60
|
def run_release_script
|
52
61
|
release_script = config[:release_script]
|
53
62
|
run_command_in_latest_image(release_script, title: "release script")
|
data/lib/command/doctor.rb
CHANGED
@@ -29,7 +29,7 @@ module Command
|
|
29
29
|
validations = config.options[:validations].split(",")
|
30
30
|
ensure_required_options!(validations)
|
31
31
|
|
32
|
-
doctor_service = DoctorService.new(
|
32
|
+
doctor_service = DoctorService.new(self)
|
33
33
|
doctor_service.run_validations(validations)
|
34
34
|
end
|
35
35
|
|
data/lib/command/generate.rb
CHANGED
data/lib/command/maintenance.rb
CHANGED
@@ -17,26 +17,14 @@ module Command
|
|
17
17
|
DESC
|
18
18
|
WITH_INFO_HEADER = false
|
19
19
|
|
20
|
-
def call
|
21
|
-
|
22
|
-
|
20
|
+
def call
|
21
|
+
puts maintenance_mode.enabled? ? "on" : "off"
|
22
|
+
end
|
23
23
|
|
24
|
-
|
25
|
-
cp.fetch_domain(config.domain)
|
26
|
-
else
|
27
|
-
cp.find_domain_for([one_off_workload, maintenance_workload])
|
28
|
-
end
|
29
|
-
unless domain_data
|
30
|
-
raise "Can't find domain. " \
|
31
|
-
"Maintenance mode is only supported for domains that use path based routing mode " \
|
32
|
-
"and have a route configured for the prefix '/' on either port 80 or 443."
|
33
|
-
end
|
24
|
+
private
|
34
25
|
|
35
|
-
|
36
|
-
|
37
|
-
else
|
38
|
-
puts "off"
|
39
|
-
end
|
26
|
+
def maintenance_mode
|
27
|
+
@maintenance_mode ||= MaintenanceMode.new(self)
|
40
28
|
end
|
41
29
|
end
|
42
30
|
end
|
@@ -15,48 +15,14 @@ module Command
|
|
15
15
|
- Maintenance mode is only supported for domains that use path based routing mode and have a route configured for the prefix '/' on either port 80 or 443
|
16
16
|
DESC
|
17
17
|
|
18
|
-
def call
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
domain_data = if config.domain
|
23
|
-
cp.fetch_domain(config.domain)
|
24
|
-
else
|
25
|
-
cp.find_domain_for([one_off_workload, maintenance_workload])
|
26
|
-
end
|
27
|
-
unless domain_data
|
28
|
-
raise "Can't find domain. " \
|
29
|
-
"Maintenance mode is only supported for domains that use path based routing mode " \
|
30
|
-
"and have a route configured for the prefix '/' on either port 80 or 443."
|
31
|
-
end
|
32
|
-
|
33
|
-
domain = domain_data["name"]
|
34
|
-
if cp.domain_workload_matches?(domain_data, one_off_workload)
|
35
|
-
progress.puts("Maintenance mode is already disabled for app '#{config.app}'.")
|
36
|
-
return
|
37
|
-
end
|
38
|
-
|
39
|
-
cp.fetch_workload!(maintenance_workload)
|
40
|
-
|
41
|
-
# Start all other workloads
|
42
|
-
Cpflow::Cli.start(["ps:start", "-a", config.app, "--wait"])
|
43
|
-
|
44
|
-
progress.puts
|
45
|
-
|
46
|
-
# Switch domain workload
|
47
|
-
step("Switching workload for domain '#{domain}' to '#{one_off_workload}'") do
|
48
|
-
cp.set_domain_workload(domain_data, one_off_workload)
|
49
|
-
|
50
|
-
# Give it a bit of time for the domain to update
|
51
|
-
Kernel.sleep(30)
|
52
|
-
end
|
53
|
-
|
54
|
-
progress.puts
|
18
|
+
def call
|
19
|
+
maintenance_mode.disable!
|
20
|
+
end
|
55
21
|
|
56
|
-
|
57
|
-
Cpflow::Cli.start(["ps:stop", "-a", config.app, "-w", maintenance_workload, "--wait"])
|
22
|
+
private
|
58
23
|
|
59
|
-
|
24
|
+
def maintenance_mode
|
25
|
+
@maintenance_mode ||= MaintenanceMode.new(self)
|
60
26
|
end
|
61
27
|
end
|
62
28
|
end
|
@@ -15,48 +15,14 @@ module Command
|
|
15
15
|
- Maintenance mode is only supported for domains that use path based routing mode and have a route configured for the prefix '/' on either port 80 or 443
|
16
16
|
DESC
|
17
17
|
|
18
|
-
def call
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
domain_data = if config.domain
|
23
|
-
cp.fetch_domain(config.domain)
|
24
|
-
else
|
25
|
-
cp.find_domain_for([one_off_workload, maintenance_workload])
|
26
|
-
end
|
27
|
-
unless domain_data
|
28
|
-
raise "Can't find domain. " \
|
29
|
-
"Maintenance mode is only supported for domains that use path based routing mode " \
|
30
|
-
"and have a route configured for the prefix '/' on either port 80 or 443."
|
31
|
-
end
|
32
|
-
|
33
|
-
domain = domain_data["name"]
|
34
|
-
if cp.domain_workload_matches?(domain_data, maintenance_workload)
|
35
|
-
progress.puts("Maintenance mode is already enabled for app '#{config.app}'.")
|
36
|
-
return
|
37
|
-
end
|
38
|
-
|
39
|
-
cp.fetch_workload!(maintenance_workload)
|
40
|
-
|
41
|
-
# Start maintenance workload
|
42
|
-
Cpflow::Cli.start(["ps:start", "-a", config.app, "-w", maintenance_workload, "--wait"])
|
43
|
-
|
44
|
-
progress.puts
|
45
|
-
|
46
|
-
# Switch domain workload
|
47
|
-
step("Switching workload for domain '#{domain}' to '#{maintenance_workload}'") do
|
48
|
-
cp.set_domain_workload(domain_data, maintenance_workload)
|
49
|
-
|
50
|
-
# Give it a bit of time for the domain to update
|
51
|
-
Kernel.sleep(30)
|
52
|
-
end
|
53
|
-
|
54
|
-
progress.puts
|
18
|
+
def call
|
19
|
+
maintenance_mode.enable!
|
20
|
+
end
|
55
21
|
|
56
|
-
|
57
|
-
Cpflow::Cli.start(["ps:stop", "-a", config.app, "--wait"])
|
22
|
+
private
|
58
23
|
|
59
|
-
|
24
|
+
def maintenance_mode
|
25
|
+
@maintenance_mode ||= MaintenanceMode.new(self)
|
60
26
|
end
|
61
27
|
end
|
62
28
|
end
|
data/lib/command/no_command.rb
CHANGED
@@ -25,14 +25,14 @@ module Command
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def copy_image_from_upstream
|
28
|
-
|
28
|
+
run_cpflow_command("copy-image-from-upstream", "-a", config.app, "-t", config.options[:upstream_token])
|
29
29
|
progress.puts
|
30
30
|
end
|
31
31
|
|
32
32
|
def deploy_image
|
33
33
|
args = []
|
34
34
|
args.push("--run-release-phase") if config.current[:release_script]
|
35
|
-
|
35
|
+
run_cpflow_command("deploy-image", "-a", config.app, *args)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
data/lib/command/run.rb
CHANGED
@@ -207,7 +207,7 @@ module Command
|
|
207
207
|
original_env_str = original_container_spec["env"]&.sort_by { |env| env["name"] }.to_s
|
208
208
|
env_str = container_spec["env"]&.sort_by { |env| env["name"] }.to_s
|
209
209
|
if original_env_str != env_str
|
210
|
-
container_spec["env"] = original_container_spec["env"]
|
210
|
+
container_spec["env"] = original_container_spec["env"] || []
|
211
211
|
should_update = true
|
212
212
|
end
|
213
213
|
|
@@ -243,7 +243,7 @@ module Command
|
|
243
243
|
|
244
244
|
step("Updating runner workload '#{runner_workload}'") do
|
245
245
|
# Update runner workload
|
246
|
-
@expected_deployed_version = cp.cron_workload_deployed_version(runner_workload) + 1
|
246
|
+
@expected_deployed_version = (cp.cron_workload_deployed_version(runner_workload) || 0) + 1
|
247
247
|
cp.apply_hash("kind" => "workload", "name" => runner_workload, "spec" => spec)
|
248
248
|
end
|
249
249
|
end
|
@@ -256,7 +256,7 @@ module Command
|
|
256
256
|
|
257
257
|
def wait_for_runner_workload_update
|
258
258
|
step("Waiting for runner workload '#{runner_workload}' to be updated", retry_on_failure: true) do
|
259
|
-
cp.cron_workload_deployed_version(runner_workload) >= expected_deployed_version
|
259
|
+
(cp.cron_workload_deployed_version(runner_workload) || 0) >= expected_deployed_version
|
260
260
|
end
|
261
261
|
end
|
262
262
|
|
@@ -306,7 +306,7 @@ module Command
|
|
306
306
|
exit(ExitCode::SUCCESS)
|
307
307
|
end
|
308
308
|
|
309
|
-
|
309
|
+
run_cpflow_command("logs", *app_workload_replica_args)
|
310
310
|
end
|
311
311
|
Process.detach(logs_pid)
|
312
312
|
|
data/lib/command/setup_app.rb
CHANGED
@@ -42,7 +42,7 @@ module Command
|
|
42
42
|
|
43
43
|
args = []
|
44
44
|
args.push("--add-app-identity") unless skip_secrets_setup
|
45
|
-
|
45
|
+
run_cpflow_command("apply-template", *templates, "-a", config.app, *args)
|
46
46
|
|
47
47
|
bind_identity_to_policy unless skip_secrets_setup
|
48
48
|
run_post_creation_hook unless config.options[:skip_post_creation_hook]
|
data/lib/command/test.rb
CHANGED
@@ -16,8 +16,8 @@ module Command
|
|
16
16
|
def call
|
17
17
|
# Modify this method to trigger the code you want to test.
|
18
18
|
# You can use `debugger` to debug.
|
19
|
-
# You can use `
|
20
|
-
# (e.g., `
|
19
|
+
# You can use `run_cpflow_command` to simulate a command
|
20
|
+
# (e.g., `run_cpflow_command("deploy-image", "-a", "my-app-name")`).
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
data/lib/core/controlplane.rb
CHANGED
@@ -90,7 +90,7 @@ class Controlplane # rubocop:disable Metrics/ClassLength
|
|
90
90
|
api.query_images(org: a_org, gvc: a_gvc, gvc_op_type: gvc_op)
|
91
91
|
end
|
92
92
|
|
93
|
-
def image_build(image, dockerfile:, docker_args: [], build_args: []
|
93
|
+
def image_build(image, dockerfile:, docker_args: [], build_args: [])
|
94
94
|
# https://docs.controlplane.com/guides/push-image#step-2
|
95
95
|
# Might need to use `docker buildx build` if compatiblitity issues arise
|
96
96
|
cmd = "docker build --platform=linux/amd64 -t #{image} -f #{dockerfile}"
|
@@ -99,9 +99,8 @@ class Controlplane # rubocop:disable Metrics/ClassLength
|
|
99
99
|
cmd += " #{docker_args.join(' ')}" if docker_args.any?
|
100
100
|
build_args.each { |build_arg| cmd += " --build-arg #{build_arg}" }
|
101
101
|
cmd += " #{config.app_dir}"
|
102
|
-
perform!(cmd)
|
103
102
|
|
104
|
-
|
103
|
+
perform!(cmd)
|
105
104
|
end
|
106
105
|
|
107
106
|
def fetch_image_details(image)
|
@@ -278,7 +277,7 @@ class Controlplane # rubocop:disable Metrics/ClassLength
|
|
278
277
|
end
|
279
278
|
|
280
279
|
def workload_exec(workload, replica, location:, container: nil, command: nil)
|
281
|
-
cmd = "cpln workload exec #{workload} #{gvc_org} --replica #{replica} --location #{location}"
|
280
|
+
cmd = "cpln workload exec #{workload} #{gvc_org} --replica #{replica} --location #{location} -it"
|
282
281
|
cmd += " --container #{container}" if container
|
283
282
|
cmd += " -- #{command}"
|
284
283
|
perform!(cmd, output_mode: :all)
|
data/lib/core/doctor_service.rb
CHANGED
@@ -3,10 +3,12 @@
|
|
3
3
|
class ValidationError < StandardError; end
|
4
4
|
|
5
5
|
class DoctorService
|
6
|
-
|
6
|
+
extend Forwardable
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
def_delegators :@command, :config, :progress
|
9
|
+
|
10
|
+
def initialize(command)
|
11
|
+
@command = command
|
10
12
|
end
|
11
13
|
|
12
14
|
def run_validations(validations, silent_if_passing: false) # rubocop:disable Metrics/MethodLength
|
@@ -37,7 +39,7 @@ class DoctorService
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def validate_templates
|
40
|
-
@template_parser = TemplateParser.new(
|
42
|
+
@template_parser = TemplateParser.new(@command)
|
41
43
|
filenames = Dir.glob("#{@template_parser.template_dir}/*.yml")
|
42
44
|
templates = @template_parser.parse(filenames)
|
43
45
|
|
@@ -97,8 +99,4 @@ class DoctorService
|
|
97
99
|
.join("\n")
|
98
100
|
progress.puts("\n#{Shell.color("DEPRECATED: #{message}", :yellow)}\n#{list}\n\n")
|
99
101
|
end
|
100
|
-
|
101
|
-
def progress
|
102
|
-
$stderr
|
103
|
-
end
|
104
102
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class MaintenanceMode
|
4
|
+
extend Forwardable
|
5
|
+
|
6
|
+
def_delegators :@command, :config, :progress, :cp, :step, :run_cpflow_command
|
7
|
+
|
8
|
+
def initialize(command)
|
9
|
+
@command = command
|
10
|
+
end
|
11
|
+
|
12
|
+
def enabled?
|
13
|
+
validate_domain_exists!
|
14
|
+
cp.domain_workload_matches?(domain_data, maintenance_workload)
|
15
|
+
end
|
16
|
+
|
17
|
+
def disabled?
|
18
|
+
validate_domain_exists!
|
19
|
+
cp.domain_workload_matches?(domain_data, one_off_workload)
|
20
|
+
end
|
21
|
+
|
22
|
+
def enable!
|
23
|
+
if enabled?
|
24
|
+
progress.puts("Maintenance mode is already enabled for app '#{config.app}'.")
|
25
|
+
else
|
26
|
+
enable_maintenance_mode
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def disable!
|
31
|
+
if disabled?
|
32
|
+
progress.puts("Maintenance mode is already disabled for app '#{config.app}'.")
|
33
|
+
else
|
34
|
+
disable_maintenance_mode
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def enable_maintenance_mode
|
41
|
+
validate_maintenance_workload_exists!
|
42
|
+
|
43
|
+
start_or_stop_maintenance_workload(:start)
|
44
|
+
switch_domain_workload(to: maintenance_workload)
|
45
|
+
start_or_stop_all_workloads(:stop)
|
46
|
+
|
47
|
+
progress.puts("\nMaintenance mode enabled for app '#{config.app}'.")
|
48
|
+
end
|
49
|
+
|
50
|
+
def disable_maintenance_mode
|
51
|
+
validate_maintenance_workload_exists!
|
52
|
+
|
53
|
+
start_or_stop_maintenance_workload(:start)
|
54
|
+
switch_domain_workload(to: one_off_workload)
|
55
|
+
start_or_stop_all_workloads(:stop)
|
56
|
+
|
57
|
+
progress.puts("\nMaintenance mode disabled for app '#{config.app}'.")
|
58
|
+
end
|
59
|
+
|
60
|
+
def validate_domain_exists!
|
61
|
+
return if domain_data
|
62
|
+
|
63
|
+
raise "Can't find domain. " \
|
64
|
+
"Maintenance mode is only supported for domains that use path based routing mode " \
|
65
|
+
"and have a route configured for the prefix '/' on either port 80 or 443."
|
66
|
+
end
|
67
|
+
|
68
|
+
def validate_maintenance_workload_exists!
|
69
|
+
cp.fetch_workload!(maintenance_workload)
|
70
|
+
end
|
71
|
+
|
72
|
+
def start_or_stop_all_workloads(action)
|
73
|
+
run_cpflow_command("ps:#{action}", "-a", config.app, "--wait")
|
74
|
+
|
75
|
+
progress.puts
|
76
|
+
end
|
77
|
+
|
78
|
+
def start_or_stop_maintenance_workload(action)
|
79
|
+
run_cpflow_command("ps:#{action}", "-a", config.app, "-w", maintenance_workload, "--wait")
|
80
|
+
|
81
|
+
progress.puts
|
82
|
+
end
|
83
|
+
|
84
|
+
def switch_domain_workload(to:)
|
85
|
+
step("Switching workload for domain '#{domain_data['name']}' to '#{to}'") do
|
86
|
+
cp.set_domain_workload(domain_data, to)
|
87
|
+
|
88
|
+
# Give it a bit of time for the domain to update
|
89
|
+
Kernel.sleep(30)
|
90
|
+
end
|
91
|
+
|
92
|
+
progress.puts
|
93
|
+
end
|
94
|
+
|
95
|
+
def domain_data
|
96
|
+
@domain_data ||=
|
97
|
+
if config.domain
|
98
|
+
cp.fetch_domain(config.domain)
|
99
|
+
else
|
100
|
+
cp.find_domain_for([one_off_workload, maintenance_workload])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def one_off_workload
|
105
|
+
@one_off_workload ||= config[:one_off_workload]
|
106
|
+
end
|
107
|
+
|
108
|
+
def maintenance_workload
|
109
|
+
@maintenance_workload ||= config.current[:maintenance_workload] || "maintenance"
|
110
|
+
end
|
111
|
+
end
|
data/lib/core/template_parser.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class TemplateParser
|
4
|
-
|
4
|
+
extend Forwardable
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
def_delegators :@command, :config, :cp
|
7
|
+
|
8
|
+
attr_reader :deprecated_variables
|
9
|
+
|
10
|
+
def initialize(command)
|
11
|
+
@command = command
|
8
12
|
end
|
9
13
|
|
10
14
|
def template_dir
|
@@ -69,8 +73,4 @@ class TemplateParser
|
|
69
73
|
"APP_IMAGE" => "{{APP_IMAGE}}"
|
70
74
|
}
|
71
75
|
end
|
72
|
-
|
73
|
-
def cp
|
74
|
-
@cp ||= Controlplane.new(config)
|
75
|
-
end
|
76
76
|
end
|
data/lib/cpflow/version.rb
CHANGED
data/lib/cpflow.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "date"
|
4
|
+
require "forwardable"
|
4
5
|
require "dotenv/load"
|
5
6
|
require "cgi"
|
6
7
|
require "json"
|
@@ -30,25 +31,7 @@ at_exit do
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
-
# Copied from https://github.com/rails/thor/issues/398#issuecomment-622988390
|
35
|
-
class Thor
|
36
|
-
module Shell
|
37
|
-
class Basic
|
38
|
-
def print_wrapped(message, options = {})
|
39
|
-
indent = (options[:indent] || 0).to_i
|
40
|
-
if indent.zero?
|
41
|
-
stdout.puts(message)
|
42
|
-
else
|
43
|
-
message.each_line do |message_line|
|
44
|
-
stdout.print(" " * indent)
|
45
|
-
stdout.puts(message_line.chomp)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
34
|
+
require_relative "patches/thor"
|
52
35
|
|
53
36
|
module Cpflow
|
54
37
|
class Error < StandardError; end
|
@@ -226,12 +209,14 @@ module Cpflow
|
|
226
209
|
|
227
210
|
Cpflow::Cli.show_info_header(config) if with_info_header
|
228
211
|
|
212
|
+
command = command_class.new(config)
|
213
|
+
|
229
214
|
if validations.any? && ENV.fetch("DISABLE_VALIDATIONS", nil) != "true"
|
230
|
-
doctor = DoctorService.new(
|
215
|
+
doctor = DoctorService.new(command)
|
231
216
|
doctor.run_validations(validations, silent_if_passing: true)
|
232
217
|
end
|
233
218
|
|
234
|
-
|
219
|
+
command.call
|
235
220
|
rescue RuntimeError => e
|
236
221
|
::Shell.abort(e.message)
|
237
222
|
end
|
data/lib/patches/thor.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Thor
|
4
|
+
# Fix for https://github.com/erikhuda/thor/issues/398
|
5
|
+
# Copied from https://github.com/rails/thor/issues/398#issuecomment-622988390
|
6
|
+
module Shell
|
7
|
+
class Basic
|
8
|
+
def print_wrapped(message, options = {})
|
9
|
+
indent = (options[:indent] || 0).to_i
|
10
|
+
if indent.zero?
|
11
|
+
stdout.puts(message)
|
12
|
+
else
|
13
|
+
message.each_line do |message_line|
|
14
|
+
stdout.print(" " * indent)
|
15
|
+
stdout.puts(message_line.chomp)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Fix for https://github.com/rails/thor/issues/742
|
23
|
+
def self.basename
|
24
|
+
@package_name || super
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cpflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Gordon
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: dotenv
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- ".github/workflows/check_cpln_links.yml"
|
80
80
|
- ".github/workflows/command_docs.yml"
|
81
81
|
- ".github/workflows/rspec-shared.yml"
|
82
|
+
- ".github/workflows/rspec-specific.yml"
|
82
83
|
- ".github/workflows/rspec.yml"
|
83
84
|
- ".github/workflows/rubocop.yml"
|
84
85
|
- ".gitignore"
|
@@ -148,6 +149,7 @@ files:
|
|
148
149
|
- lib/core/controlplane_api_direct.rb
|
149
150
|
- lib/core/doctor_service.rb
|
150
151
|
- lib/core/helpers.rb
|
152
|
+
- lib/core/maintenance_mode.rb
|
151
153
|
- lib/core/shell.rb
|
152
154
|
- lib/core/template_parser.rb
|
153
155
|
- lib/cpflow.rb
|
@@ -159,6 +161,7 @@ files:
|
|
159
161
|
- lib/generator_templates/templates/app.yml
|
160
162
|
- lib/generator_templates/templates/postgres.yml
|
161
163
|
- lib/generator_templates/templates/rails.yml
|
164
|
+
- lib/patches/thor.rb
|
162
165
|
- rakelib/create_release.rake
|
163
166
|
- script/add_command
|
164
167
|
- script/check_command_docs
|