cpl 1.2.0 → 1.4.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/.github/workflows/check_cpln_links.yml +19 -0
- data/.overcommit.yml +3 -0
- data/CHANGELOG.md +43 -1
- data/Gemfile.lock +9 -5
- data/README.md +43 -7
- data/cpl.gemspec +1 -0
- data/docs/commands.md +30 -23
- data/docs/dns.md +9 -0
- data/docs/tips.md +11 -1
- data/examples/controlplane.yml +22 -1
- data/lib/command/apply_template.rb +58 -10
- data/lib/command/base.rb +79 -2
- data/lib/command/build_image.rb +5 -1
- data/lib/command/cleanup_stale_apps.rb +0 -2
- data/lib/command/copy_image_from_upstream.rb +5 -4
- data/lib/command/deploy_image.rb +20 -2
- data/lib/command/info.rb +11 -26
- data/lib/command/maintenance.rb +8 -4
- data/lib/command/maintenance_off.rb +8 -4
- data/lib/command/maintenance_on.rb +8 -4
- data/lib/command/promote_app_from_upstream.rb +5 -25
- data/lib/command/run.rb +20 -22
- data/lib/command/run_detached.rb +38 -30
- data/lib/command/setup_app.rb +19 -2
- data/lib/core/config.rb +36 -14
- data/lib/core/controlplane.rb +34 -7
- data/lib/core/controlplane_api.rb +12 -0
- data/lib/core/controlplane_api_direct.rb +33 -5
- data/lib/core/helpers.rb +6 -0
- data/lib/cpl/version.rb +1 -1
- data/lib/cpl.rb +6 -1
- data/lib/generator_templates/controlplane.yml +5 -0
- data/lib/generator_templates/templates/gvc.yml +4 -4
- data/lib/generator_templates/templates/postgres.yml +1 -1
- data/lib/generator_templates/templates/rails.yml +1 -1
- data/script/check_cpln_links +45 -0
- data/templates/daily-task.yml +3 -2
- data/templates/gvc.yml +5 -5
- data/templates/identity.yml +2 -1
- data/templates/rails.yml +3 -2
- data/templates/secrets-policy.yml +4 -0
- data/templates/secrets.yml +3 -0
- data/templates/sidekiq.yml +3 -2
- metadata +21 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e67b960593def42983c0f333119e9edffe55434751769cb1ca25dd8333c1489
|
4
|
+
data.tar.gz: 3f201ff14fe51d451c5ab1fd8705e5e544d5e99c87b83e53c54464841a835a1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb075c69a7fa151bdd800186594ef481999075c8377eabf7dcb886c0b30e246fcb5e3ccd6396ff0e8487ac5a8b50c24d01b3dade658cd7c2b4ebfa82cb6546c9
|
7
|
+
data.tar.gz: 2a7c0782f57fd543f79fdeb985221dc72bfdba830bbfda81dc966e432007ad314ccd28ba299d0084d446993201f05cabaec40a133c0a2edf7b16af70f3e38348
|
@@ -0,0 +1,19 @@
|
|
1
|
+
name: Check Links
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- main
|
7
|
+
pull_request:
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
check_cpln_links:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
name: Check Links
|
13
|
+
steps:
|
14
|
+
- name: Checkout repository
|
15
|
+
uses: actions/checkout@v3
|
16
|
+
- name: Validate outgoing links to Control Plane
|
17
|
+
run: |
|
18
|
+
TERM=xterm-color ./script/check_cpln_links
|
19
|
+
shell: bash
|
data/.overcommit.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -14,6 +14,45 @@ Changes since the last non-beta release.
|
|
14
14
|
|
15
15
|
_Please add entries here for your pull requests that are not yet released._
|
16
16
|
|
17
|
+
## [1.4.0] - 2024-03-20
|
18
|
+
|
19
|
+
### Added
|
20
|
+
|
21
|
+
- Added new template substitution variables (used by `apply-template` and `setup-app` commands): `{{APP_LOCATION_LINK}}`, `{{APP_IMAGE_LINK}}`, `{{APP_IDENTITY}}`, `{{APP_IDENTITY_LINK}}`, `{{APP_SECRETS}}` and `{{APP_SECRETS_POLICY}}`. [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
22
|
+
- Added `--run-release-phase` option to `deploy-image` command to run release script before deploying (same step as in `promote-app-from-upstream` command). [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
23
|
+
|
24
|
+
### Changed
|
25
|
+
|
26
|
+
- Template substitution (used by `apply-template` and `setup-app` commands) now uses double braces (e.g., `APP_ORG` -> `{{APP_ORG}}`). This change is backwards compatible. [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
27
|
+
- Renamed template substitution variable `APP_GVC` to `{{APP_NAME}}` (used by `apply-template` and `setup-app` commands). This change is backwards compatible. [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
28
|
+
- `setup-app` command now automatically binds the app to the secrets policy, as long as both the identity and the policy exist. Added `--skip-secret-access-binding` option to prevent this behavior. [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
29
|
+
- Local API token is now refreshed when it is about to expire. [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
30
|
+
- `apply-template` command now exits with non-zero code if failed to apply any templates. [PR 146](https://github.com/shakacode/heroku-to-control-plane/pull/146) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
31
|
+
|
32
|
+
## [1.3.0] - 2024-03-19
|
33
|
+
|
34
|
+
### Fixed
|
35
|
+
|
36
|
+
- Fixed issue where cpln profile was not switched back to `default` if an error happened while running `copy-image-from-upstream` command. [PR 135](https://github.com/shakacode/heroku-to-control-plane/pull/135) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
37
|
+
- Fixed issue that didn't allow using upstream with `match_if_app_name_starts_with` set to `true` in `copy-image-from-upstream` command. [PR 136](https://github.com/shakacode/heroku-to-control-plane/pull/136) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
38
|
+
|
39
|
+
### Added
|
40
|
+
|
41
|
+
- Added `--no-clean-on-failure` option to `run:detached` command to skip deletion of failed workload run. [PR 133](https://github.com/shakacode/heroku-to-control-plane/pull/133) by [Justin Gordon](https://github.com/justin808) and [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
42
|
+
- Added `--domain` option to `maintenance`, `maintenance:on` and `maintenance:off` commands. [PR 131](https://github.com/shakacode/heroku-to-control-plane/pull/131) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
43
|
+
- Added `default_domain` config to specify domain for `maintenance`, `maintenance:on` and `maintenance:off` commands. [PR 131](https://github.com/shakacode/heroku-to-control-plane/pull/131) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
44
|
+
- Added option to specify upstream for `copy-image-from-upstream` command through `CPLN_UPSTREAM` env var. [PR 138](https://github.com/shakacode/heroku-to-control-plane/pull/138) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
45
|
+
|
46
|
+
### Changed
|
47
|
+
|
48
|
+
- `build-image` command now accepts extra options and passes them to `docker build`. [PR 126](https://github.com/shakacode/heroku-to-control-plane/pull/126) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
49
|
+
- `CPLN_ORG_UPSTREAM` env var now takes precedence over config from `controlplane.yml` in `copy-image-from-upstream` command. [PR 137](https://github.com/shakacode/heroku-to-control-plane/pull/137) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
50
|
+
- `info` command now works properly for apps with `match_if_app_name_starts_with` set to `true`.[PR 139](https://github.com/shakacode/heroku-to-control-plane/pull/139) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
51
|
+
- `info` command now lists workloads in the same order as `controlplane.yml`. [PR 139](https://github.com/shakacode/heroku-to-control-plane/pull/139) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
52
|
+
- 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/heroku-to-control-plane/pull/140) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
53
|
+
|
54
|
+
## [1.2.0] - 2024-01-03
|
55
|
+
|
17
56
|
### Fixed
|
18
57
|
|
19
58
|
- Fixed issue where `info` command does not respect `CPLN_ORG` env var. [PR 88](https://github.com/shakacode/heroku-to-control-plane/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
@@ -117,7 +156,10 @@ _Please add entries here for your pull requests that are not yet released._
|
|
117
156
|
|
118
157
|
- Initial release
|
119
158
|
|
120
|
-
[Unreleased]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.
|
159
|
+
[Unreleased]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.4.0...HEAD
|
160
|
+
[1.4.0]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.3.0...v1.4.0
|
161
|
+
[1.3.0]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.2.0...v1.3.0
|
162
|
+
[1.2.0]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.1.2...v1.2.0
|
121
163
|
[1.1.2]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.1.1...v1.1.2
|
122
164
|
[1.1.1]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.1.0...v1.1.1
|
123
165
|
[1.1.0]: https://github.com/shakacode/heroku-to-control-plane/compare/v1.0.4...v1.1.0
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cpl (1.
|
4
|
+
cpl (1.4.0)
|
5
5
|
debug (~> 1.7.1)
|
6
6
|
dotenv (~> 2.8.1)
|
7
|
+
jwt (~> 2.8.1)
|
7
8
|
psych (~> 5.1.0)
|
8
9
|
thor (~> 1.2.1)
|
9
10
|
|
@@ -13,6 +14,7 @@ GEM
|
|
13
14
|
addressable (2.8.4)
|
14
15
|
public_suffix (>= 2.0.2, < 6.0)
|
15
16
|
ast (2.4.2)
|
17
|
+
base64 (0.2.0)
|
16
18
|
childprocess (4.1.0)
|
17
19
|
crack (0.4.5)
|
18
20
|
rexml
|
@@ -24,11 +26,13 @@ GEM
|
|
24
26
|
dotenv (2.8.1)
|
25
27
|
hashdiff (1.0.1)
|
26
28
|
iniparse (1.5.0)
|
27
|
-
io-console (0.7.
|
28
|
-
irb (1.
|
29
|
+
io-console (0.7.2)
|
30
|
+
irb (1.12.0)
|
29
31
|
rdoc
|
30
|
-
reline (>= 0.
|
32
|
+
reline (>= 0.4.2)
|
31
33
|
json (2.6.3)
|
34
|
+
jwt (2.8.1)
|
35
|
+
base64
|
32
36
|
overcommit (0.60.0)
|
33
37
|
childprocess (>= 0.6.3, < 5)
|
34
38
|
iniparse (~> 1.4)
|
@@ -44,7 +48,7 @@ GEM
|
|
44
48
|
rdoc (6.6.2)
|
45
49
|
psych (>= 4.0.0)
|
46
50
|
regexp_parser (2.6.2)
|
47
|
-
reline (0.4.
|
51
|
+
reline (0.4.3)
|
48
52
|
io-console (~> 0.5)
|
49
53
|
rexml (3.2.5)
|
50
54
|
rspec (3.12.0)
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# The power of Kubernetes with the ease of Heroku!
|
2
2
|
|
3
3
|
<meta name="author" content="Justin Gordon and Sergey Tarasov">
|
4
4
|
<meta name="description" content="Instructions on how to migrate from Heroku to Control Plane and a CLI called cpl to make it easier.">
|
@@ -6,16 +6,24 @@
|
|
6
6
|
<meta name="keywords" content="Control Plane, Heroku, Kubernetes, K8, Infrastructure">
|
7
7
|
<meta name="google-site-verification" content="dIV4nMplcYl6YOKOaZMqgvdKXhLJ4cdYY6pS6e_YrPU" />
|
8
8
|
|
9
|
-
_A gem that provides **Heroku Flow** functionality on Control Plane, including docs for migrating from [Heroku](https://heroku.com) to [Control Plane](https://shakacode.controlplane.com/)._
|
10
|
-
|
11
9
|
[](https://github.com/shakacode/heroku-to-control-plane/actions/workflows/rspec.yml)
|
12
10
|
[](https://github.com/shakacode/heroku-to-control-plane/actions/workflows/rubocop.yml)
|
13
11
|
|
14
12
|
[](https://badge.fury.io/rb/cpl)
|
15
13
|
|
14
|
+
|
15
|
+
Here's a playbook for migrating from [Heroku Flow](https://www.heroku.com/flow) to [Control Plane](https://shakacode.controlplane.com) with our `cpl` gem source code.
|
16
|
+
|
17
|
+
----
|
18
|
+
|
19
|
+
_If you need a free demo account for Control Plane (no CC required), you can contact [Justin Gordon, CEO of ShakaCode](mailto:justin@shakacode.com)._
|
20
|
+
|
16
21
|
---
|
17
22
|
|
18
|
-
|
23
|
+
Be sure to see the [demo app](https://github.com/shakacode/react-webpack-rails-tutorial/tree/master/.controlplane)
|
24
|
+
If you would like to see the simple YAML configuration and setup,
|
25
|
+
Also, check [how the `cpl` gem (this project) is used in the Github actions](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/.github/actions/deploy-to-control-plane/action.yml).
|
26
|
+
Here is a brief [video overview](https://www.youtube.com/watch?v=llaQoAV_6Iw).
|
19
27
|
|
20
28
|
---
|
21
29
|
|
@@ -117,7 +125,7 @@ npm update -g @controlplane/cli
|
|
117
125
|
|
118
126
|
5. Run `cpln image docker-login --org <your-org>` to ensure that you have access to the Control Plane Docker registry.
|
119
127
|
|
120
|
-
6. Install Heroku to Control Plane `cpl` CLI as a [Ruby gem](https://rubygems.org/gems/cpl): `gem install cpl`. If you want to hack on the source code, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
128
|
+
6. Install Heroku to Control Plane `cpl` CLI as a [Ruby gem](https://rubygems.org/gems/cpl): `gem install cpl`. If you want to hack on the source code, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
121
129
|
|
122
130
|
7. You can use [this Dockerfile](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/.controlplane/Dockerfile) as an example for your project. Ensure that you have Docker running.
|
123
131
|
|
@@ -182,8 +190,20 @@ aliases:
|
|
182
190
|
|
183
191
|
# Allows running the command `cpl setup-app`
|
184
192
|
# instead of `cpl apply-template gvc redis postgres memcached rails sidekiq`.
|
193
|
+
#
|
194
|
+
# Note:
|
195
|
+
# 1. These names correspond to files in the `./controlplane/templates` directory.
|
196
|
+
# 2. Each file can contain many objects, such as in the case of templates that create a resource, like `postgres`.
|
197
|
+
# 3. While the naming often corresponds to a workload or other object name, the naming is arbitrary.
|
198
|
+
# Naming does not need to match anything other than the file name without the `.yml` extension.
|
185
199
|
setup_app_templates:
|
186
200
|
- gvc
|
201
|
+
|
202
|
+
# These templates are only required if using secrets.
|
203
|
+
- identity
|
204
|
+
- secrets
|
205
|
+
- secrets-policy
|
206
|
+
|
187
207
|
- redis
|
188
208
|
- postgres
|
189
209
|
- memcached
|
@@ -194,11 +214,16 @@ aliases:
|
|
194
214
|
one_off_workload: rails
|
195
215
|
|
196
216
|
# Workloads that are for the application itself and are using application Docker images.
|
217
|
+
# These are updated with the new image when running the `deploy-image` command,
|
218
|
+
# and are also used by the `info`, `ps:`, and `run:cleanup` commands in order to get all of the defined workloads.
|
219
|
+
# On the other hand, if you have a workload for Redis, that would NOT use the application Docker image
|
220
|
+
# and not be listed here.
|
197
221
|
app_workloads:
|
198
222
|
- rails
|
199
223
|
- sidekiq
|
200
224
|
|
201
225
|
# Additional "service type" workloads, using non-application Docker images.
|
226
|
+
# These are only used by the `info`, `ps:` and `run:cleanup` commands in order to get all of the defined workloads.
|
202
227
|
additional_workloads:
|
203
228
|
- redis
|
204
229
|
- postgres
|
@@ -258,6 +283,10 @@ apps:
|
|
258
283
|
# This is relative to the `.controlplane/` directory.
|
259
284
|
release_script: release_script
|
260
285
|
|
286
|
+
# default_domain is used for commands that require a domain
|
287
|
+
# including `maintenance`, `maintenance:on`, `maintenance:off`.
|
288
|
+
default_domain: domain.com
|
289
|
+
|
261
290
|
my-app-other:
|
262
291
|
<<: *common
|
263
292
|
|
@@ -475,6 +504,13 @@ cpl --help
|
|
475
504
|
|
476
505
|
## Examples
|
477
506
|
|
478
|
-
- See
|
507
|
+
- See this repository's `examples/` and `templates/` directories.
|
479
508
|
- See the `.controlplane/` directory of this live example:
|
480
|
-
[react-webpack-rails-tutorial](https://github.com/shakacode/react-webpack-rails-tutorial/tree/master/.controlplane)
|
509
|
+
[react-webpack-rails-tutorial](https://github.com/shakacode/react-webpack-rails-tutorial/tree/master/.controlplane).
|
510
|
+
- See [how the `cpl` gem is used in the Github actions](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/.github/actions/deploy-to-control-plane/action.yml).
|
511
|
+
- Here is a brief [video overview](https://www.youtube.com/watch?v=llaQoAV_6Iw).
|
512
|
+
|
513
|
+
## Resources
|
514
|
+
* If you need a free demo account for Control Plane (no CC required), you can contact [Justin Gordon, CEO of ShakaCode](mailto:justin@shakacode.com).
|
515
|
+
* [Control Plane Site](https://shakacode.controlplane.com)
|
516
|
+
* [Join our Slack to Discuss Heroku to Control Plane](https://reactrails.slack.com/join/shared_invite/enQtNjY3NTczMjczNzYxLTlmYjdiZmY3MTVlMzU2YWE0OWM0MzNiZDI0MzdkZGFiZTFkYTFkOGVjODBmOWEyYWQ3MzA2NGE1YWJjNmVlMGE)
|
data/cpl.gemspec
CHANGED
data/docs/commands.md
CHANGED
@@ -21,10 +21,14 @@ This `-a` option is used in most of the commands and will pick all other app con
|
|
21
21
|
**Preprocessed template variables:**
|
22
22
|
|
23
23
|
```
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
{{APP_ORG}} - organization name
|
25
|
+
{{APP_NAME}} - GVC/app name
|
26
|
+
{{APP_LOCATION}} - location, per YML file, ENV, or command line arg
|
27
|
+
{{APP_LOCATION_LINK}} - full link for location, ready to be used for the value of `staticPlacement.locationLinks` in the templates
|
28
|
+
{{APP_IMAGE}} - latest app image
|
29
|
+
{{APP_IMAGE_LINK}} - full link for latest app image, ready to be used for the value of `containers[].image` in the templates
|
30
|
+
{{APP_IDENTITY}} - default identity
|
31
|
+
{{APP_IDENTITY_LINK}} - full link for identity, ready to be used for the value of `identityLink` in the templates
|
28
32
|
```
|
29
33
|
|
30
34
|
```sh
|
@@ -41,6 +45,7 @@ cpl apply-template gvc postgres redis rails -a $APP_NAME
|
|
41
45
|
- Automatically assigns image numbers, e.g., `app:1`, `app:2`, etc.
|
42
46
|
- Uses `.controlplane/Dockerfile` or a different Dockerfile specified through `dockerfile` in the `.controlplane/controlplane.yml` file
|
43
47
|
- If a commit is provided through `--commit` or `-c`, it will be set as the runtime env var `GIT_COMMIT`
|
48
|
+
- Accepts extra options that are passed to `docker build`
|
44
49
|
|
45
50
|
```sh
|
46
51
|
cpl build-image -a $APP_NAME
|
@@ -86,7 +91,7 @@ cpl config -a $APP_NAME
|
|
86
91
|
### `copy-image-from-upstream`
|
87
92
|
|
88
93
|
- Copies an image (by default the latest) from a source org to the current org
|
89
|
-
- The source
|
94
|
+
- The source app must be specified either through the `CPLN_UPSTREAM` env var or `upstream` in the `.controlplane/controlplane.yml` file
|
90
95
|
- Additionally, the token for the source org must be provided through `--upstream-token` or `-t`
|
91
96
|
- A `cpln` profile will be temporarily created to pull the image from the source org
|
92
97
|
|
@@ -110,6 +115,8 @@ cpl delete -a $APP_NAME
|
|
110
115
|
### `deploy-image`
|
111
116
|
|
112
117
|
- Deploys the latest image to app workloads
|
118
|
+
- Optionally runs a release script before deploying if specified through `release_script` in the `.controlplane/controlplane.yml` file and `--run-release-phase` is provided
|
119
|
+
- The deploy will fail if the release script exits with a non-zero code or doesn't exist
|
113
120
|
|
114
121
|
```sh
|
115
122
|
cpl deploy-image -a $APP_NAME
|
@@ -250,8 +257,9 @@ cpl open-console -a $APP_NAME
|
|
250
257
|
- Copies the latest image from upstream, runs a release script (optional), and deploys the image
|
251
258
|
- It performs the following steps:
|
252
259
|
- Runs `cpl copy-image-from-upstream` to copy the latest image from upstream
|
253
|
-
- Runs a release script if specified through `release_script` in the `.controlplane/controlplane.yml` file
|
254
260
|
- Runs `cpl deploy-image` to deploy the image
|
261
|
+
- If `.controlplane/controlplane.yml` includes the `release_script`, `cpl deploy-image` will use the `--run-release-phase` option
|
262
|
+
- The deploy will fail if the release script exits with a non-zero code
|
255
263
|
|
256
264
|
```sh
|
257
265
|
cpl promote-app-from-upstream -a $APP_NAME -t $UPSTREAM_TOKEN
|
@@ -331,28 +339,25 @@ cpl ps:swait -a $APP_NAME -w $WORKLOAD_NAME
|
|
331
339
|
cpl run -a $APP_NAME
|
332
340
|
|
333
341
|
# Need to quote COMMAND if setting ENV value or passing args.
|
334
|
-
cpl run 'LOG_LEVEL=warn rails db:migrate' -a $APP_NAME
|
335
|
-
|
336
|
-
# COMMAND may also be passed at the end.
|
337
342
|
cpl run -a $APP_NAME -- 'LOG_LEVEL=warn rails db:migrate'
|
338
343
|
|
339
344
|
# Runs command, displays output, and exits shell.
|
340
|
-
cpl run
|
341
|
-
cpl run rails db:migrate:status
|
345
|
+
cpl run -a $APP_NAME -- ls /
|
346
|
+
cpl run -a $APP_NAME -- rails db:migrate:status
|
342
347
|
|
343
348
|
# Runs command and keeps shell open.
|
344
|
-
cpl run
|
349
|
+
cpl run -a $APP_NAME -- rails c
|
345
350
|
|
346
351
|
# Uses a different image (which may not be promoted yet).
|
347
|
-
cpl run
|
348
|
-
cpl run
|
352
|
+
cpl run -a $APP_NAME --image appimage:123 -- rails db:migrate # Exact image name
|
353
|
+
cpl run -a $APP_NAME --image latest -- rails db:migrate # Latest sequential image
|
349
354
|
|
350
355
|
# Uses a different workload than `one_off_workload` from `.controlplane/controlplane.yml`.
|
351
|
-
cpl run
|
356
|
+
cpl run -a $APP_NAME -w other-workload -- bash
|
352
357
|
|
353
358
|
# Overrides remote CPLN_TOKEN env variable with local token.
|
354
359
|
# Useful when superuser rights are needed in remote container.
|
355
|
-
cpl run
|
360
|
+
cpl run -a $APP_NAME --use-local-token -- bash
|
356
361
|
```
|
357
362
|
|
358
363
|
### `run:cleanup`
|
@@ -374,26 +379,26 @@ cpl run:cleanup -a $APP_NAME
|
|
374
379
|
- Implemented with only async execution methods, more suitable for production tasks
|
375
380
|
- Has alternative log fetch implementation with only JSON-polling and no WebSockets
|
376
381
|
- Less responsive but more stable, useful for CI tasks
|
382
|
+
- Deletes the workload whenever finished with success
|
383
|
+
- Deletes the workload whenever finished with failure by default
|
384
|
+
- Use `--no-clean-on-failure` to disable cleanup to help with debugging failed runs
|
377
385
|
|
378
386
|
```sh
|
379
387
|
cpl run:detached rails db:prepare -a $APP_NAME
|
380
388
|
|
381
389
|
# Need to quote COMMAND if setting ENV value or passing args.
|
382
|
-
cpl run:detached 'LOG_LEVEL=warn rails db:migrate' -a $APP_NAME
|
383
|
-
|
384
|
-
# COMMAND may also be passed at the end.
|
385
390
|
cpl run:detached -a $APP_NAME -- 'LOG_LEVEL=warn rails db:migrate'
|
386
391
|
|
387
392
|
# Uses a different image (which may not be promoted yet).
|
388
|
-
cpl run:detached
|
389
|
-
cpl run:detached
|
393
|
+
cpl run:detached -a $APP_NAME --image appimage:123 -- rails db:migrate # Exact image name
|
394
|
+
cpl run:detached -a $APP_NAME --image latest -- rails db:migrate # Latest sequential image
|
390
395
|
|
391
396
|
# Uses a different workload than `one_off_workload` from `.controlplane/controlplane.yml`.
|
392
|
-
cpl run:detached
|
397
|
+
cpl run:detached -a $APP_NAME -w other-workload -- rails db:migrate:status
|
393
398
|
|
394
399
|
# Overrides remote CPLN_TOKEN env variable with local token.
|
395
400
|
# Useful when superuser rights are needed in remote container.
|
396
|
-
cpl run:detached
|
401
|
+
cpl run:detached -a $APP_NAME --use-local-token -- rails db:migrate:status
|
397
402
|
```
|
398
403
|
|
399
404
|
### `setup-app`
|
@@ -401,6 +406,8 @@ cpl run:detached rails db:migrate:status -a $APP_NAME --use-local-token
|
|
401
406
|
- Creates an app and all its workloads
|
402
407
|
- Specify the templates for the app and workloads through `setup_app_templates` in the `.controlplane/controlplane.yml` file
|
403
408
|
- This should only be used for temporary apps like review apps, never for persistent apps like production (to update workloads for those, use 'cpl apply-template' instead)
|
409
|
+
- Automatically binds the app to the secrets policy, as long as both the identity and the policy exist
|
410
|
+
- Use `--skip-secret-access-binding` to prevent the automatic bind
|
404
411
|
|
405
412
|
```sh
|
406
413
|
cpl setup-app -a $APP_NAME
|
data/docs/dns.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# DNS Setup Example
|
2
|
+
|
3
|
+
About reactrails.com DNS, steps:
|
4
|
+
1. create CNAME or ALIAS record pointing to rails-xxxx.cpln.app
|
5
|
+
1. go to CPLN Domains -> create
|
6
|
+
1. add reactrails.com copy code from there
|
7
|
+
1. add TXT record with code as _cpln.reactrails.com
|
8
|
+
1. hit ok on CPLN, route to rails workload when asked
|
9
|
+
1. wait domain check and certificates created
|
data/docs/tips.md
CHANGED
@@ -85,7 +85,17 @@ For storing ENVs in the source code, we can use a level of indirection so that y
|
|
85
85
|
code like `cpln://secret/my-app-review-env-secrets.SECRET_KEY_BASE` and then have the secret value stored at the org
|
86
86
|
level, which applies to your GVCs mapped to that org.
|
87
87
|
|
88
|
-
|
88
|
+
You can do this during the initial app setup, like this:
|
89
|
+
|
90
|
+
1. Add the templates for `identity`, `secrets` and `secrets-policy` to `.controlplane/templates`
|
91
|
+
2. Ensure that the templates are listed in `setup_app_templates` for the app in `.controlplane/controlplane.yml`
|
92
|
+
3. Run `cpl setup-app -a $APP_NAME`
|
93
|
+
4. The identity, secrets and secrets policy will be automatically created, along with the proper binding
|
94
|
+
5. In the upper left "Manage Org" menu, click on "Secrets"
|
95
|
+
6. Find the created secret (it will be in the `$APP_PREFIX-secrets` format) and add the secret env vars there
|
96
|
+
7. Use `cpln://secret/...` in the app to access the secret env vars (e.g., `cpln://secret/$APP_PREFIX-secrets.SOME_VAR`)
|
97
|
+
|
98
|
+
You can also do it manually after. Here is how you do this:
|
89
99
|
|
90
100
|
1. In the upper left "Manage Org" menu, click on "Secrets"
|
91
101
|
2. Create a secret with `Secret Type: Dictionary` (e.g., `my-secrets`) and add the secret env vars there
|
data/examples/controlplane.yml
CHANGED
@@ -25,8 +25,20 @@ aliases:
|
|
25
25
|
|
26
26
|
# Allows running the command `cpl setup-app`
|
27
27
|
# instead of `cpl apply-template gvc redis postgres memcached rails sidekiq`.
|
28
|
-
|
28
|
+
#
|
29
|
+
# Note:
|
30
|
+
# 1. These names correspond to files in the `./controlplane/templates` directory.
|
31
|
+
# 2. Each file can contain many objects, such as in the case of templates that create a resource, like `postgres`.
|
32
|
+
# 3. While the naming often corresponds to a workload or other object name, the naming is arbitrary.
|
33
|
+
# Naming does not need to match anything other than the file name without the `.yml` extension.
|
34
|
+
setup_app_templates:
|
29
35
|
- gvc
|
36
|
+
|
37
|
+
# These templates are only required if using secrets.
|
38
|
+
- identity
|
39
|
+
- secrets
|
40
|
+
- secrets-policy
|
41
|
+
|
30
42
|
- redis
|
31
43
|
- postgres
|
32
44
|
- memcached
|
@@ -37,11 +49,16 @@ aliases:
|
|
37
49
|
one_off_workload: rails
|
38
50
|
|
39
51
|
# Workloads that are for the application itself and are using application Docker images.
|
52
|
+
# These are updated with the new image when running the `deploy-image` command,
|
53
|
+
# and are also used by the `info`, `ps:`, and `run:cleanup` commands in order to get all of the defined workloads.
|
54
|
+
# On the other hand, if you have a workload for Redis, that would NOT use the application Docker image
|
55
|
+
# and not be listed here.
|
40
56
|
app_workloads:
|
41
57
|
- rails
|
42
58
|
- sidekiq
|
43
59
|
|
44
60
|
# Additional "service type" workloads, using non-application Docker images.
|
61
|
+
# These are only used by the `info`, `ps:` and `run:cleanup` commands in order to get all of the defined workloads.
|
45
62
|
additional_workloads:
|
46
63
|
- redis
|
47
64
|
- postgres
|
@@ -101,6 +118,10 @@ apps:
|
|
101
118
|
# This is relative to the `.controlplane/` directory.
|
102
119
|
release_script: release_script
|
103
120
|
|
121
|
+
# default_domain is used for commands that require a domain
|
122
|
+
# including `maintenance`, `maintenance:on`, `maintenance:off`.
|
123
|
+
default_domain: domain.com
|
124
|
+
|
104
125
|
my-app-other:
|
105
126
|
<<: *common
|
106
127
|
|
@@ -20,10 +20,14 @@ module Command
|
|
20
20
|
**Preprocessed template variables:**
|
21
21
|
|
22
22
|
```
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
{{APP_ORG}} - organization name
|
24
|
+
{{APP_NAME}} - GVC/app name
|
25
|
+
{{APP_LOCATION}} - location, per YML file, ENV, or command line arg
|
26
|
+
{{APP_LOCATION_LINK}} - full link for location, ready to be used for the value of `staticPlacement.locationLinks` in the templates
|
27
|
+
{{APP_IMAGE}} - latest app image
|
28
|
+
{{APP_IMAGE_LINK}} - full link for latest app image, ready to be used for the value of `containers[].image` in the templates
|
29
|
+
{{APP_IDENTITY}} - default identity
|
30
|
+
{{APP_IDENTITY_LINK}} - full link for identity, ready to be used for the value of `identityLink` in the templates
|
27
31
|
```
|
28
32
|
DESC
|
29
33
|
EXAMPLES = <<~EX
|
@@ -36,7 +40,7 @@ module Command
|
|
36
40
|
```
|
37
41
|
EX
|
38
42
|
|
39
|
-
def call # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
|
43
|
+
def call # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
40
44
|
ensure_templates!
|
41
45
|
|
42
46
|
@created_items = []
|
@@ -55,6 +59,8 @@ module Command
|
|
55
59
|
|
56
60
|
progress.puts if @asked_for_confirmation
|
57
61
|
|
62
|
+
@deprecated_variables = []
|
63
|
+
|
58
64
|
pending_templates.each do |template, filename|
|
59
65
|
step("Applying template '#{template}'", abort_on_error: false) do
|
60
66
|
items = apply_template(filename)
|
@@ -70,9 +76,13 @@ module Command
|
|
70
76
|
end
|
71
77
|
end
|
72
78
|
|
79
|
+
warn_deprecated_variables
|
80
|
+
|
73
81
|
print_created_items
|
74
82
|
print_failed_templates
|
75
83
|
print_skipped_templates
|
84
|
+
|
85
|
+
exit(1) if @failed_templates.any?
|
76
86
|
end
|
77
87
|
|
78
88
|
private
|
@@ -124,17 +134,55 @@ module Command
|
|
124
134
|
false
|
125
135
|
end
|
126
136
|
|
127
|
-
def apply_template(filename)
|
137
|
+
def apply_template(filename) # rubocop:disable Metrics/MethodLength
|
128
138
|
data = File.read(filename)
|
129
|
-
.gsub("
|
130
|
-
.gsub("
|
131
|
-
.gsub("
|
132
|
-
.gsub("
|
139
|
+
.gsub("{{APP_ORG}}", config.org)
|
140
|
+
.gsub("{{APP_NAME}}", config.app)
|
141
|
+
.gsub("{{APP_LOCATION}}", config.location)
|
142
|
+
.gsub("{{APP_LOCATION_LINK}}", app_location_link)
|
143
|
+
.gsub("{{APP_IMAGE}}", latest_image)
|
144
|
+
.gsub("{{APP_IMAGE_LINK}}", app_image_link)
|
145
|
+
.gsub("{{APP_IDENTITY}}", app_identity)
|
146
|
+
.gsub("{{APP_IDENTITY_LINK}}", app_identity_link)
|
147
|
+
.gsub("{{APP_SECRETS}}", app_secrets)
|
148
|
+
.gsub("{{APP_SECRETS_POLICY}}", app_secrets_policy)
|
149
|
+
|
150
|
+
find_deprecated_variables(data)
|
151
|
+
|
152
|
+
# Kept for backwards compatibility
|
153
|
+
data = data
|
154
|
+
.gsub("APP_ORG", config.org)
|
155
|
+
.gsub("APP_GVC", config.app)
|
156
|
+
.gsub("APP_LOCATION", config.location)
|
157
|
+
.gsub("APP_IMAGE", latest_image)
|
133
158
|
|
134
159
|
# Don't read in YAML.safe_load as that doesn't handle multiple documents
|
135
160
|
cp.apply_template(data)
|
136
161
|
end
|
137
162
|
|
163
|
+
def new_variables
|
164
|
+
{
|
165
|
+
"APP_ORG" => "{{APP_ORG}}",
|
166
|
+
"APP_GVC" => "{{APP_NAME}}",
|
167
|
+
"APP_LOCATION" => "{{APP_LOCATION}}",
|
168
|
+
"APP_IMAGE" => "{{APP_IMAGE}}"
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
def find_deprecated_variables(data)
|
173
|
+
@deprecated_variables.push(*new_variables.keys.select { |old_key| data.include?(old_key) })
|
174
|
+
@deprecated_variables = @deprecated_variables.uniq.sort
|
175
|
+
end
|
176
|
+
|
177
|
+
def warn_deprecated_variables
|
178
|
+
return unless @deprecated_variables.any?
|
179
|
+
|
180
|
+
message = "Please replace these variables in the templates, " \
|
181
|
+
"as support for them will be removed in a future major version bump:"
|
182
|
+
deprecated = @deprecated_variables.map { |old_key| " - #{old_key} -> #{new_variables[old_key]}" }.join("\n")
|
183
|
+
progress.puts("\n#{Shell.color("DEPRECATED: #{message}", :yellow)}\n#{deprecated}")
|
184
|
+
end
|
185
|
+
|
138
186
|
def report_success(item)
|
139
187
|
@created_items.push(item)
|
140
188
|
end
|