forked from toolshed/abra
Compare commits
340 Commits
Author | SHA1 | Date | |
---|---|---|---|
d68444be9e | |||
f7bc8efabe | |||
f5284ba725 | |||
293d3ff558 | |||
c00319ab01 | |||
8b4141670c | |||
23c852125d | |||
b4eae2e5e5 | |||
9e953319cf | |||
0814fa9146 | |||
0e1b6c858b | |||
28618bd3ac | |||
b04bfea1c7 | |||
bc0ef0d6fc | |||
16c91fedd1 | |||
9f5945094c | |||
76513a1f35 | |||
86eb8d7fde | |||
e31b3d3173 | |||
58b13d7528 | |||
b0fca49ecb | |||
79dacf557e | |||
d6caf03301 | |||
9b90712d28 | |||
1dd3fe6fcd | |||
29953c17d9 | |||
3b59adfe34 | |||
00c8a988e1 | |||
524fb6a44c | |||
e99bedf9e4 | |||
0d98c442a2 | |||
bcc15ecdb0 | |||
a617629a7a | |||
f7ae400eb3 | |||
7141d364e1 | |||
057ce223f1 | |||
7511b25e47 | |||
62b447d61f | |||
88d2a75575 | |||
8cb6617a0f | |||
1a649c56cb | |||
fd655274f8 | |||
946d1a068d | |||
e8651976ca | |||
af52ba1fec | |||
499c08c374 | |||
08281891a1 | |||
5bce042922 | |||
3276c9fe47 | |||
040374e781 | |||
621c8cd5c4 | |||
7434b67c34 | |||
17306a753b | |||
2e3f4cabd8 | |||
cf2308cdd7 | |||
eec49d6dd1 | |||
d6195ad6d7 | |||
fd04c5a6e9 | |||
1c9d7282b2 | |||
dd9c485c66 | |||
99ab5bf369 | |||
25a0afed65 | |||
44e22db11b | |||
3321010089 | |||
e04c4626f2 | |||
65ce949e03 | |||
5931cbd791 | |||
0bbff91722 | |||
7f5e753dfd | |||
d3776f4424 | |||
544c4e86ba | |||
516309b478 | |||
dfd7e29a30 | |||
bb30fa28da | |||
044de5824b | |||
00cdce7bd2 | |||
f163d4b0fa | |||
e0032fb74a | |||
152dfe9349 | |||
5a95ae97a0 | |||
98e674b8e8 | |||
b655cf20be | |||
5bc702bf96 | |||
4bd842db66 | |||
a8f7faddb9 | |||
e5b2a426f0 | |||
29b22fe162 | |||
c082645da0 | |||
156d5d8fba | |||
d2cdb11fcc | |||
cef06a82a6 | |||
9a630a0440 | |||
1c6651b18b | |||
5f7df4694f | |||
7feeab24ec | |||
1a6688cfbf | |||
f90e1d154c | |||
6cc265e931 | |||
854ae23f60 | |||
43e7672725 | |||
4e913c426d | |||
8a08de51e4 | |||
1c7a51bce1 | |||
5d84cef63c | |||
eda5198904 | |||
a4a3dccd66 | |||
a2d249e3a1 | |||
dc83baea12 | |||
d6b4a4744f | |||
6ba2657dc1 | |||
ac6b805cbf | |||
d4e52a9de3 | |||
aa59c1ad43 | |||
36f1d679ae | |||
f5c8ee1136 | |||
9a17817cc8 | |||
b2e3292453 | |||
13fafb5929 | |||
114f99ae2e | |||
fff4b10a41 | |||
ab1353603d | |||
1600b6277f | |||
b79e35f982 | |||
703dbe0a0f | |||
7abb0191e1 | |||
886ae5b7f2 | |||
5411c85793 | |||
caa315e361 | |||
e6b24fe65c | |||
81782bb5f0 | |||
406b9e374e | |||
ce0e0e893c | |||
fac45f276e | |||
44d3ac3a1c | |||
5da9f26076 | |||
4e99cf1ded | |||
55324524ca | |||
b6928959cb | |||
8ddb290683 | |||
2cb1134a54 | |||
c4b1ac482e | |||
29cc392dff | |||
8839bd4595 | |||
0179f600f5 | |||
15f0233351 | |||
bbaacb7b9f | |||
6761574d74 | |||
8384af8b95 | |||
b9e97688d6 | |||
1055805c8d | |||
678906cb39 | |||
11c50ae98d | |||
e911ab246b | |||
34775f306b | |||
375a4dd29d | |||
2b951e9f54 | |||
01184c313a | |||
3936d6afc0 | |||
407744827f | |||
b634b4c668 | |||
67cce192df | |||
3a9e141b24 | |||
ebfe7ca4e8 | |||
fff2fbe819 | |||
f213c3df5f | |||
9b1be33018 | |||
6ecf4f287a | |||
e1d6ff8b73 | |||
07d4815a74 | |||
33315f6b43 | |||
f017324431 | |||
4339c91cf3 | |||
592f515ec4 | |||
77ba5652b2 | |||
fdf6334ed3 | |||
73e5e64b9a | |||
3f9b4477cd | |||
412729aac9 | |||
8022a2cb41 | |||
35182ed260 | |||
d90c6ef361 | |||
40ca8dfe93 | |||
7f009f927b | |||
e222f4152b | |||
893150cdd9 | |||
61126f16e1 | |||
63c982c550 | |||
0d202eedfc | |||
cb2d563ea0 | |||
059968a8cf | |||
c57069e0af | |||
946a527baa | |||
89d530a553 | |||
25fe6808ad | |||
28b2d8ecc7 | |||
fd735a1310 | |||
e307286db7 | |||
dd570e224b | |||
f495ec0d94 | |||
b75bce531b | |||
0d62f01d5a | |||
eec55896a4 | |||
c2a56c6c09 | |||
74dfd75fb1 | |||
e8c0efa91e | |||
6bae48431c | |||
543072ab37 | |||
57e3a34133 | |||
33a49a8457 | |||
5806e40c1c | |||
0d24a8e5cc | |||
e01f06423e | |||
80f06ba0e1 | |||
f8306b282d | |||
2bdfe8baa8 | |||
b226396764 | |||
a3cd6d2281 | |||
50651aeea1 | |||
57e24eaf0a | |||
50ca4f8029 | |||
0433da3689 | |||
3e0b9e9475 | |||
c6b841de6c | |||
2daffc8694 | |||
b15a214049 | |||
8d7194fcce | |||
188dc56dd1 | |||
dbfe6f8097 | |||
26b994ab84 | |||
dba3c391bd | |||
5a72ed0cfb | |||
b5d84d5e0d | |||
e3983c2440 | |||
85b8a4f459 | |||
6e38dc35e5 | |||
841e4fc61a | |||
c1d12eacc5 | |||
3b730d314b | |||
5df3a9fffb | |||
3e3fe0e349 | |||
db766f4aec | |||
8909a46d8c | |||
8d139d4d28 | |||
b6b80298c2 | |||
b1e8ac4498 | |||
c5785089d6 | |||
bec3272a41 | |||
dc3b772b72 | |||
07d4f8cbdf | |||
37c59a53ef | |||
87a54594f6 | |||
e2e76edaaf | |||
ab7772e8f7 | |||
7304612f5f | |||
5a07f08ab3 | |||
1e158cce55 | |||
2102193df1 | |||
1b4258f1ea | |||
cc060b8546 | |||
dce46603bf | |||
64d04a29ab | |||
db7eb30447 | |||
f648b251bf | |||
86a790bbe4 | |||
b423d61fce | |||
f03c509552 | |||
e6458e5e60 | |||
9580199616 | |||
b59e902d18 | |||
c50b1d8760 | |||
b49b510c43 | |||
b68bfdfb43 | |||
983e4af08c | |||
6cf7cf843a | |||
d37d8a0c66 | |||
da33064a5f | |||
be2fffd858 | |||
38f0c92bc7 | |||
c1fbb75657 | |||
33fd0eeb8d | |||
5955505752 | |||
e022fe2310 | |||
02fa9025dc | |||
2250713c05 | |||
2b77cfebf9 | |||
aff01e6741 | |||
0eb5d14ad8 | |||
6d6208a63c | |||
1e059ffe7f | |||
eb12f2392c | |||
a13e58c6c0 | |||
44c41830a7 | |||
ae6c2c26ae | |||
dad72c820a | |||
eec9a8ba1a | |||
bf44270b3d | |||
4bf1dbd7eb | |||
4ca1026c2c | |||
891b2cc6c9 | |||
4de7f24d8e | |||
ad1063a0cc | |||
4cfe143326 | |||
16cc5d9cf7 | |||
9d22797dc8 | |||
16a09887e6 | |||
b7757b51b1 | |||
3c7c7694bf | |||
f15dfd9f5f | |||
66dcaedfd0 | |||
6598aabc37 | |||
6759e6a175 | |||
8735362580 | |||
7223dca951 | |||
dd9444b036 | |||
81e24b6f72 | |||
16292df5f6 | |||
92c91ddbb0 | |||
cff9b13f60 | |||
0444991636 | |||
28ba33b18e | |||
77eb83b128 | |||
ff7fcf2201 | |||
b0d525a980 | |||
aa1ffd5d8a | |||
5627e67bf7 | |||
29343369f3 | |||
427ed97678 | |||
b01fee3c86 | |||
949246821f | |||
60f2892acd | |||
0268685cfa | |||
dd4f31d9a1 | |||
8a19bb059c | |||
3a1f4e7bf6 | |||
a065f5f2a6 | |||
3d47cf97c0 | |||
e052aa2b27 | |||
9660f32b84 | |||
32cef2af68 | |||
e2e1e07803 |
36
.drone.yml
36
.drone.yml
@ -3,11 +3,41 @@ kind: pipeline
|
|||||||
name: linters
|
name: linters
|
||||||
steps:
|
steps:
|
||||||
- name: run shellcheck
|
- name: run shellcheck
|
||||||
image: debian:buster
|
image: koalaman/shellcheck-alpine:v0.7.1
|
||||||
commands:
|
commands:
|
||||||
- apt update
|
|
||||||
- apt install -y shellcheck
|
|
||||||
- shellcheck abra
|
- shellcheck abra
|
||||||
|
|
||||||
|
- name: run unit tests
|
||||||
|
image: decentral1se/docker-dind-bats-kcov
|
||||||
|
commands:
|
||||||
|
- bats tests
|
||||||
|
|
||||||
|
- name: collect code coverage
|
||||||
|
failure: ignore # until we fix this
|
||||||
|
image: decentral1se/docker-dind-bats-kcov
|
||||||
|
commands:
|
||||||
|
- kcov . bats tests || true
|
||||||
|
|
||||||
|
- name: send code coverage report to codecov
|
||||||
|
failure: ignore # until we fix this
|
||||||
|
image: plugins/codecov
|
||||||
|
settings:
|
||||||
|
token:
|
||||||
|
from_secret: codecov_token
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- name: notify rocket chat
|
||||||
|
image: plugins/slack
|
||||||
|
settings:
|
||||||
|
webhook:
|
||||||
|
from_secret: rc_builds_url
|
||||||
|
username: comradebritney
|
||||||
|
channel: "internal.builds"
|
||||||
|
template: "{{repo.owner}}/{{repo.name}} build failed: {{build.link}}"
|
||||||
|
when:
|
||||||
|
status:
|
||||||
|
- failure
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branch:
|
branch:
|
||||||
- main
|
- main
|
||||||
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
coverage/
|
||||||
|
/.venv
|
79
CHANGELOG.md
79
CHANGELOG.md
@ -1,3 +1,82 @@
|
|||||||
|
# abra x.x.x (UNRELEASED)
|
||||||
|
|
||||||
|
# abra 0.6.0 (2021-03-17)
|
||||||
|
|
||||||
|
- Show version and digest of app if labelled ([98e674b8e8](https://git.autonomic.zone/coop-cloud/abra/commit/98e674b8e83458a83dcbf331e8e34c7188559c4a))
|
||||||
|
- Implement basic version checking on deployment ([#82](https://git.autonomic.zone/coop-cloud/abra/issues/82))
|
||||||
|
- New `app-catalogue.sh` script to auto-generate app list for documentation ([f163d4b](https://git.autonomic.zone/coop-cloud/abra/commit/f163d4b0fa920232e9d995a22d20fe78b174b3a9))
|
||||||
|
- Support app service rollbacks with `abra <app> rollback <service>` ([#76](https://git.autonomic.zone/coop-cloud/abra/issues/76))
|
||||||
|
- Detect when latest version is deployed and perform a no-op ([#87](https://git.autonomic.zone/coop-cloud/abra/issues/87))
|
||||||
|
- Allow cloning of app repos with different main branches using `-b, --branch=<branch>` ([#80](https://git.autonomic.zone/coop-cloud/abra/issues/80))
|
||||||
|
- Protect against lengthy app names which gives Docker trouble later on ([#83](https://git.autonomic.zone/coop-cloud/abra/issues/83))
|
||||||
|
- Support removal of secrets and volumes when `rm`'ing apps ([#44](https://git.autonomic.zone/coop-cloud/abra/issues/44))
|
||||||
|
- Always choose the default IPv4 address with `abra server <host> init` ([#91](https://git.autonomic.zone/coop-cloud/abra/issues/91))
|
||||||
|
- Add `--type=<type>` filtering option to `abra <app> ls` ([0828189](https://git.autonomic.zone/coop-cloud/abra/commit/0828189))
|
||||||
|
- Check for bash 4+ ([#96](https://git.autonomic.zone/coop-cloud/abra/commit/0828189))
|
||||||
|
- Add `--dev` option to installer using `git clone` ([88d2a75](https://git.autonomic.zone/coop-cloud/abra/commit/88d2a75))
|
||||||
|
- Support `--dev` on the `abra upgrade` command also ([bcc15ec](https://git.autonomic.zone/coop-cloud/abra/commit/bcc15ec))
|
||||||
|
- Vendor [yq](https://github.com/mikefarah/yq/releases) automatically ([3b59adf](https://git.autonomic.zone/coop-cloud/abra/commit/3b59adf))
|
||||||
|
- Extend version handling logic to support all underlying services ([#90](https://git.autonomic.zone/coop-cloud/abra/issues/90))
|
||||||
|
- Fix development installation script symlink issue ([#98](https://git.autonomic.zone/coop-cloud/abra/issues/98))
|
||||||
|
- Add `app-version.sh` script to help packagers version apps ([28618bd](https://git.autonomic.zone/coop-cloud/abra/commit/28618bd))
|
||||||
|
- Add git digest to `abra version` output ([8b41416](https://git.autonomic.zone/coop-cloud/abra/commit/8b41416))
|
||||||
|
|
||||||
|
# abra 0.5.0 (2021-03-01)
|
||||||
|
|
||||||
|
- `secret auto` merged into `secret generate` and `app new --auto` is now `app new --secrets` ([#64](https://git.autonomic.zone/coop-cloud/abra/pulls/64))
|
||||||
|
- Avoid outputting length during secret generation when not in use ([#67](https://git.autonomic.zone/coop-cloud/abra/issues/67))
|
||||||
|
- Support graceful failure when missing secret generation commands ([44d3ac3](https://git.autonomic.zone/coop-cloud/abra/commit/44d3ac3a1cb86edc9b9e91eea1a00e70eae14965))
|
||||||
|
- Fix secret detection when using new `.env` file format in apps ([5532452](https://git.autonomic.zone/coop-cloud/abra/commit/55324524ca77141666ffe6cc41b62cc71cf89ace))
|
||||||
|
- Support choosing an `$EDITOR` when editing configs ([29cc392](https://git.autonomic.zone/coop-cloud/abra/commit/29cc392dff3e93e48e0e2edd3ce11b405c66a95a))
|
||||||
|
- "server" shell completion fixed ([8839bd4](https://git.autonomic.zone/coop-cloud/abra/commit/8839bd45951d00dccf4ef81ece445bcc49e13ee6))
|
||||||
|
- Drop `multilogs` command ([#56](https://git.autonomic.zone/coop-cloud/abra/pulls/56))
|
||||||
|
- Remove `server use` command ([#51](https://git.autonomic.zone/coop-cloud/abra/issues/51))
|
||||||
|
- `new <app>` becomes `new <type>` ([#48](https://git.autonomic.zone/coop-cloud/abra/issues/48))
|
||||||
|
- `check` is run on `deploy` now and configurable ([77ba565](https://git.autonomic.zone/coop-cloud/abra/commit/77ba5652b2fe15820f5edfa0f642636f7b8eae7e))
|
||||||
|
- App configurations are always updated now ([#42](https://git.autonomic.zone/coop-cloud/abra/issues/42))
|
||||||
|
- We use docker format `.env` files (no "export" syntax) from now now ([#55](https://git.autonomic.zone/coop-cloud/abra/pulls/55))
|
||||||
|
- Rename `<domain>` option to `<app>` and `APP` variable to `TYPE`, see ([#47](https://git.autonomic.zone/coop-cloud/abra/issues/47))
|
||||||
|
- Use Docker-in-Docker (dind), and `dind-bats-kcov` Docker image, for `make test` ([1600b62](https://git.autonomic.zone/coop-cloud/abra/commit/1600b6277fbbffc4c6de1e4ba799c7bbe72ec6a0))
|
||||||
|
- Add built-in documentation using `abra help <subcommand>...`, see ([#50](https://git.autonomic.zone/coop-cloud/abra/issues/50))
|
||||||
|
- `version` subcommand ([e6b24fe](https://git.autonomic.zone/coop-cloud/abra/commit/e6b24fe))
|
||||||
|
- Use `# length=x` comments to generate passwords with `pwgen` and drop `KEY`/`PASSWORD` logic ([#68](https://git.autonomic.zone/coop-cloud/abra/issues/68))
|
||||||
|
- Global `--skip-update|-U` / `--skip-check|-C` options to make things quicker ([37e8b00](https://git.autonomic.zone/coop-cloud/abra/commit/37e8b00))
|
||||||
|
- `app backup` and `app restore` commands; requires per-app definition ([#70](https://git.autonomic.zone/coop-cloud/abra/issues/70))
|
||||||
|
- Rename per-type `abra-commands.sh` to `abra.sh`, and include config versions as type-level instead of app-level config ([#43](https://git.autonomic.zone/coop-cloud/abra/issues/43))
|
||||||
|
- Show per-subcommand help by adding `-h/--help` to a command line ([#38](https://git.autonomic.zone/coop-cloud/abra/issues/78))
|
||||||
|
|
||||||
|
# abra 0.4.1 (2020-12-24)
|
||||||
|
|
||||||
|
- Bug-fixes on `app ls --status` & custom commands
|
||||||
|
- Add `app ls --server=...` and alias
|
||||||
|
|
||||||
|
# abra 0.4.0 (2020-12-24)
|
||||||
|
|
||||||
|
- New command-line interface based on docopt
|
||||||
|
- `~/.abra` directory instead of expecting local `.env` files
|
||||||
|
- Integration tests & code coverage
|
||||||
|
|
||||||
|
# abra 0.3.1 (2020-09-27)
|
||||||
|
|
||||||
|
- Fix installer version
|
||||||
|
|
||||||
|
# abra 0.3.0 (2020-09-27)
|
||||||
|
|
||||||
|
- Add multilogs stack logs implementation ([#8](https://git.autonomic.zone/compose-stacks/abra/issues/8))
|
||||||
|
- Add beginnings of "monorepo" functionality
|
||||||
|
|
||||||
|
# abra 0.2.0 (2020-09-24)
|
||||||
|
|
||||||
|
- Prepare for swarm install script using script.d ([#12](https://git.autonomic.zone/compose-stacks/planning/issues/12))
|
||||||
|
|
||||||
|
# abra 0.1.2 (2020-09-22)
|
||||||
|
|
||||||
|
- Add upgrade command ([#10](https://git.autonomic.zone/autonomic-cooperative/abra/issues/10))
|
||||||
|
|
||||||
|
# abra 0.1.1 (2020-09-22)
|
||||||
|
|
||||||
|
- Add installer script ([#9](https://git.autonomic.zone/autonomic-cooperative/abra/issues/9))
|
||||||
|
|
||||||
# abra 0.1.0 (2020-09-22)
|
# abra 0.1.0 (2020-09-22)
|
||||||
|
|
||||||
- Initial pre-alpha release
|
- Initial pre-alpha release
|
||||||
|
14
Makefile
14
Makefile
@ -1,14 +0,0 @@
|
|||||||
default: install
|
|
||||||
|
|
||||||
dev_install:
|
|
||||||
ln -sf $(PWD)/abra ~/.local/bin
|
|
||||||
|
|
||||||
install:
|
|
||||||
install abra /usr/bin/abra
|
|
||||||
|
|
||||||
get_yq:
|
|
||||||
wget https://github.com/mikefarah/yq/releases/download/3.3.2/yq_linux_amd64 && \
|
|
||||||
chmod +x yq_linux_amd64 && \
|
|
||||||
mv yq_linux_amd64 yq
|
|
||||||
|
|
||||||
.PHONY: dev_install install get_yq
|
|
56
README.md
56
README.md
@ -1,29 +1,57 @@
|
|||||||
# abra
|
# abra
|
||||||
|
|
||||||
[](https://drone.autonomic.zone/autonomic-cooperative/abra)
|
[](https://drone.autonomic.zone/coop-cloud/abra)
|
||||||
|
[](undefined)
|
||||||
|
|
||||||
Docker stack magic 🎩🐇
|
> https://cloud.autonomic.zone
|
||||||
|
|
||||||
|
The cooperative cloud utility belt 🎩🐇
|
||||||
|
|
||||||
|
`abra` is a command-line tool for managing your own [Co-op Cloud](https://cloud.autonomic.zone). It can provision new servers, create applications, deploy them, run backup and restore operations and a whole lot of other things. It is the go-to tool for day-to-day operations when managing a Co-op Cloud instance.
|
||||||
|
|
||||||
|
## Change log
|
||||||
|
|
||||||
|
See [CHANGELOG.md](./CHANGELOG.md).
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
> [docs.cloud.autonomic.zone](https://docs.cloud.autonomic.zone/)
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
|
Install the latest stable release:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl https://install.abra.autonomic.zone | bash
|
curl https://install.abra.autonomic.zone | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
Specific releases are available via the project [release page](https://git.autonomic.zone/autonomic-cooperative/abra/releases).
|
or the bleeding-edge development version:
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
See [CHANGELOG.md](./CHANGELOG.md).
|
|
||||||
|
|
||||||
## Hacking
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone ssh://git@git.autonomic.zone:2222/autonomic-cooperative/abra.git
|
curl https://install.abra.autonomic.zone | bash -s -- --dev
|
||||||
cd abra
|
|
||||||
make dev_install
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Examples
|
The source for this script is [here](./installer/installer).
|
||||||
|
|
||||||
- `abra run mariadb mysqldump gitea -p'GdIbMeS09SURRktBnm3jcTufsL5z0MPd' | gzip > ../git.autonomic.zone_mariadb_`date +%F`.sql.gz`
|
## Update
|
||||||
|
|
||||||
|
Run `abra upgrade` to automatically download and install the latest release
|
||||||
|
version.
|
||||||
|
|
||||||
|
To update the development version, run `abra upgrade --dev`.
|
||||||
|
|
||||||
|
## Hack
|
||||||
|
|
||||||
|
It's written in Bash version 4 or greater!
|
||||||
|
|
||||||
|
Install it via `curl https://install.abra.autonomic.zone | bash -s -- --dev`, then you can hack on the source in `~/.abra/src`.
|
||||||
|
|
||||||
|
The command-line interface is generated via [docopt](http://docopt.org/). If you add arguments then you need to run `make docopt` ro regenerate the parser.
|
||||||
|
|
||||||
|
Please remember to update the [CHANGELOG](./CHANGELOG.md) when you make a change.
|
||||||
|
|
||||||
|
To deploy a new version of the installer scripts:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make release-installer
|
||||||
|
```
|
||||||
|
100
app-catalogue.sh
Executable file
100
app-catalogue.sh
Executable file
@ -0,0 +1,100 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Usage: ./app-catalogue.sh
|
||||||
|
#
|
||||||
|
# Gather metadata from Co-op Cloud apps in $ABRA_DIR/apps (default
|
||||||
|
# ~/.abra/apps), and format it as a Markdown table for this page:
|
||||||
|
# https://docs.cloud.autonomic.zone/apps/
|
||||||
|
|
||||||
|
stack_dir="${ABRA_DIR:-$HOME/.abra}/apps/"
|
||||||
|
|
||||||
|
cd "$stack_dir"
|
||||||
|
|
||||||
|
# load all README files into ENV_FILES array
|
||||||
|
mapfile -t readmes < <(find -L . -name "README.md")
|
||||||
|
# FIXME 3wc: requires bash 4, use for loop instead
|
||||||
|
|
||||||
|
base_url="https://git.autonomic.zone/coop-cloud"
|
||||||
|
|
||||||
|
cat_apps=()
|
||||||
|
cat_development=()
|
||||||
|
cat_utilities=()
|
||||||
|
cat_graveyard=()
|
||||||
|
|
||||||
|
get_var() {
|
||||||
|
echo "$1" | grep "$2" | sed 's/^[^:]*: //'
|
||||||
|
}
|
||||||
|
|
||||||
|
# shellcheck disable=SC2120
|
||||||
|
trim() {
|
||||||
|
# accept input as argument or from STDIN, see here:
|
||||||
|
# https://zwbetz.com/passing-input-to-a-bash-function-via-arguments-or-stdin/
|
||||||
|
# shellcheck disable=SC2155
|
||||||
|
local input="$([[ -p /dev/stdin ]] && cat - || echo "$@")"
|
||||||
|
[[ -z "$input" ]] && return 1
|
||||||
|
echo "$input" | tr -d ' '
|
||||||
|
}
|
||||||
|
|
||||||
|
# shellcheck disable=SC2120
|
||||||
|
prettify() {
|
||||||
|
# as above
|
||||||
|
# shellcheck disable=SC2155
|
||||||
|
local input="$([[ -p /dev/stdin ]] && cat - || echo "$@")"
|
||||||
|
[[ -z "$input" ]] && return 1
|
||||||
|
|
||||||
|
echo "$input" | sed -e 's/Yes/✅/' -e 's/No/❌/' -e 's/N\/A/⛔/'
|
||||||
|
}
|
||||||
|
|
||||||
|
for readme in "${readmes[@]}"; do
|
||||||
|
type="$(basename "${readme%README.md}")"
|
||||||
|
if [ "$type" = "example" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
title="$(grep '^# ' "$type/README.md" | sed 's/^# //' )"
|
||||||
|
# find section between 'metadata' and 'endmetadata' comments
|
||||||
|
metadata="$(awk '/-- metadata --/,/-- endmetadata --/' "$type/README.md")"
|
||||||
|
status="$(get_var "$metadata" "Status")"
|
||||||
|
category="$(get_var "$metadata" "Category" | cut -d',' -f2 | trim)"
|
||||||
|
|
||||||
|
if [ -z "$category" ]; then
|
||||||
|
echo "ERROR: missing category for $type"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
image="$(get_var "$metadata" "Image" | cut -d',' -f2 | trim)"
|
||||||
|
healthcheck="$(get_var "$metadata" "Healthcheck" | prettify)"
|
||||||
|
backups="$(get_var "$metadata" "Backups" | prettify)"
|
||||||
|
email="$(get_var "$metadata" "Email" | prettify)"
|
||||||
|
tests="$(get_var "$metadata" "Tests" | prettify)"
|
||||||
|
sso="$(get_var "$metadata" "SSO" | prettify)"
|
||||||
|
|
||||||
|
row="| [$title]($base_url/$type) | $status | $image | $healthcheck | $backups | $email | $tests | $sso |"
|
||||||
|
|
||||||
|
category_lower="$(echo "$category" | tr '[:upper:]' '[:lower:]')"
|
||||||
|
eval "cat_$category_lower+=( '$row' )"
|
||||||
|
done
|
||||||
|
|
||||||
|
headers="
|
||||||
|
| **Name** | **Status** | **Image** | **Healtcheck** | **Backups** | **Email** | **CI** | **Single-Sign-On** |
|
||||||
|
| --- | --- | --- | --- | --- | --- | --- | --- |"
|
||||||
|
|
||||||
|
echo "## Applications"
|
||||||
|
echo "$headers"
|
||||||
|
printf '%s\n' "${cat_apps[@]}" | sort
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "## Developer tools"
|
||||||
|
echo "$headers"
|
||||||
|
printf '%s\n' "${cat_development[@]}" | sort
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "## Utilities"
|
||||||
|
echo "$headers"
|
||||||
|
printf '%s\n' "${cat_utilities[@]}" | sort
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "## Graveyard"
|
||||||
|
echo "$headers"
|
||||||
|
printf '%s\n' "${cat_graveyard[@]}" | sort
|
42
app-version.sh
Executable file
42
app-version.sh
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Usage: ./app-version.sh <image> <service>
|
||||||
|
# Example: ./app-version.sh drone/drone:1.10.1 app
|
||||||
|
#
|
||||||
|
# Accepts a full format hub.docker.com image tag which it pulls locally and
|
||||||
|
# generates output which can be used to put in the abra.sh for app packaging.
|
||||||
|
# Requires the yq program https://mikefarah.gitbook.io/yq/
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo "$(tput setaf 1)ERROR: $*$(tput sgr0)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
IMAGE="$1"
|
||||||
|
SERVICE="$2"
|
||||||
|
|
||||||
|
if ! docker pull -q "$IMAGE" > /dev/null 2>&1; then
|
||||||
|
error "Failed to download image, is the tag correct?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
version=$(echo "$IMAGE" | cut -d ':' -f2)
|
||||||
|
digest=$(docker image inspect -f "{{.Id}}" "$IMAGE" | cut -d ':' -f2- | cut -c 1-8)
|
||||||
|
|
||||||
|
echo "--- Add the following to your abra.sh ---"
|
||||||
|
echo "export ABRA_TYPE_${SERVICE^^}_VERSION=${version}"
|
||||||
|
echo "export ABRA_TYPE_${SERVICE^^}_DIGEST=${digest}"
|
||||||
|
|
||||||
|
version_lookup="ABRA_TYPE_${SERVICE^^}_VERSION"
|
||||||
|
digest_lookup="ABRA_TYPE_${SERVICE^^}_DIGEST"
|
||||||
|
|
||||||
|
label='- "coop-cloud.${STACK_NAME}.'
|
||||||
|
label+="${SERVICE}"
|
||||||
|
label+='.version=${'
|
||||||
|
label+="${version_lookup}"
|
||||||
|
label+='}-${'
|
||||||
|
label+="${digest_lookup}"
|
||||||
|
label+='}"'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "--- And don't forget to label the actual service in the compose file ---"
|
||||||
|
echo "$label"
|
52
completion/_abra
Normal file
52
completion/_abra
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#compdef abra
|
||||||
|
|
||||||
|
_abra () {
|
||||||
|
local context state line curcontext="$curcontext" ret=1
|
||||||
|
_arguments -n : \
|
||||||
|
{-h,--help}'[Help message]' \
|
||||||
|
'1:commands:(app server)' \
|
||||||
|
'*::arguments:->arguments' \
|
||||||
|
&& ret=0
|
||||||
|
|
||||||
|
case $state in
|
||||||
|
(arguments)
|
||||||
|
curcontext="${curcontext%:*:*}:abra-arguments-$words[1]:"
|
||||||
|
case $words[1] in
|
||||||
|
(app)
|
||||||
|
_arguments \
|
||||||
|
'1: :_abra_apps' \
|
||||||
|
&& ret=0
|
||||||
|
;;
|
||||||
|
(server)
|
||||||
|
_arguments \
|
||||||
|
'1:servers:_abra_servers' \
|
||||||
|
&& ret=0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_servers() {
|
||||||
|
_path_files -/W $HOME/.abra/servers
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_apps()
|
||||||
|
{
|
||||||
|
local newapps apps=($HOME/.abra/servers/*/*.env)
|
||||||
|
typeset -a apps
|
||||||
|
newapps=()
|
||||||
|
for app in $apps; do
|
||||||
|
newapps+=($(_abra_basename "${app}"))
|
||||||
|
done
|
||||||
|
_describe -t apps 'app' newapps
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_basename()
|
||||||
|
{
|
||||||
|
printf -- "${1##*/}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra "$@"
|
117
completion/abra.bash
Normal file
117
completion/abra.bash
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
_abra_basename()
|
||||||
|
{
|
||||||
|
echo "${1##*/}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_servers()
|
||||||
|
{
|
||||||
|
# FIXME 3wc: copied from abra/get_servers()
|
||||||
|
shopt -s nullglob dotglob
|
||||||
|
local SERVERS=(~/.abra/servers/*)
|
||||||
|
shopt -u nullglob dotglob
|
||||||
|
|
||||||
|
for SERVER in "${SERVERS[@]}"; do
|
||||||
|
_abra_basename "${SERVER}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_complete_servers()
|
||||||
|
{
|
||||||
|
mapfile -t COMPREPLY < <(compgen -W "$(_abra_servers)" -- "$1")
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_apps()
|
||||||
|
{
|
||||||
|
shopt -s nullglob dotglob
|
||||||
|
local APPS=(~/.abra/servers/*/*.env)
|
||||||
|
shopt -u nullglob dotglob
|
||||||
|
|
||||||
|
for APP in "${APPS[@]}"; do
|
||||||
|
_abra_basename "${APP%.env}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_complete_apps()
|
||||||
|
{
|
||||||
|
mapfile -t COMPREPLY < <(compgen -W "$(_abra_apps)" -- "$1")
|
||||||
|
}
|
||||||
|
|
||||||
|
_abra_complete()
|
||||||
|
{
|
||||||
|
compopt +o default +o nospace
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local -r cmds='
|
||||||
|
app
|
||||||
|
server
|
||||||
|
'
|
||||||
|
local -r short_opts='-e -h -s -v'
|
||||||
|
local -r long_opts='--env --help --stack --version'
|
||||||
|
|
||||||
|
# Scan through the command line and find the abra command
|
||||||
|
# (if present), as well as its expected position.
|
||||||
|
local cmd
|
||||||
|
local cmd_index=1 # Expected index of the command token.
|
||||||
|
local i
|
||||||
|
for (( i = 1; i < ${#COMP_WORDS[@]}; i++ )); do
|
||||||
|
local word="${COMP_WORDS[i]}"
|
||||||
|
case "$word" in
|
||||||
|
-*)
|
||||||
|
((cmd_index++))
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
cmd="$word"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
|
||||||
|
if (( COMP_CWORD < cmd_index )); then
|
||||||
|
# Offer option completions.
|
||||||
|
case "$cur" in
|
||||||
|
--*)
|
||||||
|
mapfile -t COMPREPLY < <(compgen -W "$long_opts" -- "$cur")
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
mapfile -t COMPREPLY < <(compgen -W "$short_opts" -- "$cur")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Skip completion; we should never get here.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
elif (( COMP_CWORD == cmd_index )); then
|
||||||
|
# Offer command name completions.
|
||||||
|
mapfile -t COMPREPLY < <(compgen -W "$cmds" -- "$cur")
|
||||||
|
else
|
||||||
|
# Offer command argument completions.
|
||||||
|
case "$cmd" in
|
||||||
|
server)
|
||||||
|
# Offer exactly one server name completion.
|
||||||
|
if (( COMP_CWORD == cmd_index + 1 )); then
|
||||||
|
_abra_complete_servers "$cur"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
app)
|
||||||
|
# Offer exactly one app completion.
|
||||||
|
if (( COMP_CWORD == cmd_index + 1 )); then
|
||||||
|
_abra_complete_apps "$cur"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
#help)
|
||||||
|
# # Offer exactly one command name completion.
|
||||||
|
# if (( COMP_CWORD == cmd_index + 1 )); then
|
||||||
|
# COMPREPLY=($(compgen -W "$cmds" -- "$cur"))
|
||||||
|
# fi
|
||||||
|
# ;;
|
||||||
|
*)
|
||||||
|
# Unknown command or unknowable argument.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -o default -F _abra_complete abra
|
38
installer/compose.yml
Normal file
38
installer/compose.yml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
abra_installer:
|
||||||
|
image: "nginx:stable"
|
||||||
|
configs:
|
||||||
|
- source: abra_conf
|
||||||
|
target: /etc/nginx/conf.d/abra.conf
|
||||||
|
- source: abra_installer
|
||||||
|
target: /var/www/abra-installer/installer
|
||||||
|
volumes:
|
||||||
|
- "public:/var/www/abra-installer"
|
||||||
|
networks:
|
||||||
|
- proxy
|
||||||
|
deploy:
|
||||||
|
update_config:
|
||||||
|
failure_action: rollback
|
||||||
|
order: start-first
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.services.abra-installer.loadbalancer.server.port=80"
|
||||||
|
- "traefik.http.routers.abra-installer.rule=Host(`install.abra.autonomic.zone`)"
|
||||||
|
- "traefik.http.routers.abra-installer.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.abra-installer.tls.certresolver=production"
|
||||||
|
|
||||||
|
configs:
|
||||||
|
abra_installer:
|
||||||
|
file: installer
|
||||||
|
abra_conf:
|
||||||
|
file: nginx.conf
|
||||||
|
|
||||||
|
networks:
|
||||||
|
proxy:
|
||||||
|
external: true
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
public:
|
34
installer/installer
Executable file
34
installer/installer
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ABRA_VERSION="0.6.0"
|
||||||
|
GIT_URL="https://git.autonomic.zone/coop-cloud/abra"
|
||||||
|
ABRA_SRC="$GIT_URL/raw/tag/$ABRA_VERSION/abra"
|
||||||
|
|
||||||
|
function install_abra_release {
|
||||||
|
mkdir -p "$HOME/.local/bin"
|
||||||
|
curl "$ABRA_SRC" > "$HOME/.local/bin/abra"
|
||||||
|
chmod +x "$HOME/.local/bin/abra"
|
||||||
|
echo "abra installed to $HOME/.local/bin/abra"
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_abra_dev {
|
||||||
|
mkdir -p "$HOME/.abra/"
|
||||||
|
if [[ ! -d "$HOME/.abra/src" ]]; then
|
||||||
|
git clone "$GIT_URL" "$HOME/.abra/src"
|
||||||
|
fi
|
||||||
|
( cd "$HOME/.abra/src" && git pull origin main && cd -)
|
||||||
|
mkdir -p "$HOME/.local/bin"
|
||||||
|
ln -sf "$HOME/.abra/src/abra" "$HOME/.local/bin/abra"
|
||||||
|
echo "abra installed to $HOME/.local/bin/abra (development bleeding edge)"
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_installation {
|
||||||
|
if [ "$1" = "--dev" ]; then
|
||||||
|
install_abra_dev
|
||||||
|
else
|
||||||
|
install_abra_release
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
run_installation "$@"
|
||||||
|
exit 0
|
10
installer/nginx.conf
Normal file
10
installer/nginx.conf
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
server_name install.abra.autonomic.zone;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
root /var/www/abra-installer;
|
||||||
|
add_header Content-Type text/plain;
|
||||||
|
index installer;
|
||||||
|
}
|
||||||
|
}
|
50
makefile
Normal file
50
makefile
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
.PHONY: test shellcheck docopt kcov codecov release-installer
|
||||||
|
|
||||||
|
test:
|
||||||
|
@sudo DOCKER_CONTEXT=default docker run \
|
||||||
|
-v $$(pwd):/workdir \
|
||||||
|
--privileged \
|
||||||
|
-d \
|
||||||
|
--name=abra-test-dind \
|
||||||
|
-e DOCKER_TLS_CERTDIR="" \
|
||||||
|
decentral1se/docker-dind-bats-kcov
|
||||||
|
@DOCKER_CONTEXT=default docker exec \
|
||||||
|
-it \
|
||||||
|
abra-test-dind \
|
||||||
|
sh -c "cd /workdir && bats /workdir/tests"
|
||||||
|
@DOCKER_CONTEXT=default docker stop abra-test-dind
|
||||||
|
@DOCKER_CONTEXT=default docker rm abra-test-dind
|
||||||
|
|
||||||
|
shellcheck:
|
||||||
|
@docker run \
|
||||||
|
-it \
|
||||||
|
--rm \
|
||||||
|
-v $$(pwd):/workdir \
|
||||||
|
koalaman/shellcheck-alpine \
|
||||||
|
shellcheck /workdir/abra
|
||||||
|
|
||||||
|
docopt:
|
||||||
|
@if [ ! -d ".venv" ]; then \
|
||||||
|
python3 -m venv .venv && \
|
||||||
|
.venv/bin/pip install -U pip setuptools wheel && \
|
||||||
|
.venv/bin/pip install docopt-sh; \
|
||||||
|
fi
|
||||||
|
.venv/bin/docopt.sh abra
|
||||||
|
|
||||||
|
kcov:
|
||||||
|
@docker run \
|
||||||
|
-it \
|
||||||
|
--rm \
|
||||||
|
-v $$(pwd):/workdir \
|
||||||
|
kcov/kcov:latest \
|
||||||
|
sh -c "kcov /workdir/coverage /workdir/abra || true"
|
||||||
|
|
||||||
|
codecov: SHELL:=/bin/bash
|
||||||
|
codecov:
|
||||||
|
@bash <(curl -s https://codecov.io/bash) \
|
||||||
|
-s coverage -t $$(pass show hosts/swarm.autonomic.zone/drone/codecov/token)
|
||||||
|
|
||||||
|
release-installer:
|
||||||
|
@docker stack rm abra-installer-script && \
|
||||||
|
cd installer && \
|
||||||
|
docker stack deploy -c compose.yml abra-installer-script
|
@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
name: mystack
|
|
||||||
secrets:
|
|
||||||
foo:
|
|
||||||
bar:
|
|
||||||
baz:
|
|
||||||
length: 128
|
|
17
tests/01_environment.bats
Normal file
17
tests/01_environment.bats
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env bats
|
||||||
|
|
||||||
|
@test "docker is available" {
|
||||||
|
command -v docker
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "abra is executable" {
|
||||||
|
./abra --help
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "git is available" {
|
||||||
|
command -v git
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "running in a container" {
|
||||||
|
ls /etc/alpine-release
|
||||||
|
}
|
52
tests/02_abra.bats
Normal file
52
tests/02_abra.bats
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bats
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
export ABRA_DIR=$(mktemp -d)
|
||||||
|
mkdir -p $ABRA_DIR/servers/default
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown() {
|
||||||
|
rm -rf "$ABRA_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "abra server (add|rm)" {
|
||||||
|
./abra server add swarm.test.com
|
||||||
|
docker context ls | grep swarm.test.com
|
||||||
|
[ -d $ABRA_DIR/servers/swarm.test.com ]
|
||||||
|
./abra server swarm.test.com rm
|
||||||
|
|
||||||
|
./abra server add swarm.test.com foobar 12345
|
||||||
|
[ -d $ABRA_DIR/servers/swarm.test.com ]
|
||||||
|
./abra server swarm.test.com rm
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "abra server init" {
|
||||||
|
./abra server default init
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "abra app (new|rm)" {
|
||||||
|
./abra app new --server default --domain traefik.test.com --app-name traefik_test_com traefik
|
||||||
|
[ -f $ABRA_DIR/servers/default/traefik_test_com.env ]
|
||||||
|
|
||||||
|
# interactive prompt
|
||||||
|
echo "y" | ./abra app traefik_test_com delete
|
||||||
|
[ ! -f $ABRA_DIR/servers/default/traefik_test_com.env ]
|
||||||
|
|
||||||
|
# --force
|
||||||
|
./abra app new --server default --domain traefik_test_com --app-name traefik_test_com traefik
|
||||||
|
./abra app traefik_test_com delete --force
|
||||||
|
[ ! -f $ABRA_DIR/servers/default/traefik_test_com.env ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "abra app <domain> secret (insert|generate|rm)" {
|
||||||
|
./abra app new --server default --domain traefik_test_com --app-name traefik_test_com traefik
|
||||||
|
|
||||||
|
./abra app traefik_test_com secret insert foobar v1 "foobar"
|
||||||
|
|
||||||
|
# interactive prompt
|
||||||
|
echo "y" | ./abra app traefik_test_com secret rm foobar
|
||||||
|
|
||||||
|
./abra app traefik_test_com secret insert foobar v1 "foobar"
|
||||||
|
# prompt
|
||||||
|
./abra app traefik_test_com secret rm foobar --force
|
||||||
|
}
|
Reference in New Issue
Block a user