Compare commits

..

128 Commits
0.6.0 ... 0.7.0

Author SHA1 Message Date
8e6b620e8c Release latest version
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 20:54:16 +02:00
3wc
523fc2850c Make --no-prompt more consistent
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 20:47:11 +02:00
968d3809a5 Add change log entry
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 20:09:45 +02:00
2ccef8948d Support abra-hetzner
Closes https://git.autonomic.zone/coop-cloud/abra/issues/88.
2021-04-07 20:09:00 +02:00
08de1e0676 Fix plugin require logic
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 19:54:48 +02:00
b2e66a01fc Require JQ for abra-hetzner
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 19:51:24 +02:00
3wc
23f8cfc8dd Download apps.json for app new
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 18:32:04 +02:00
3wc
878a26a411 Update CHANGELOG
[ci skip]
2021-04-07 18:32:01 +02:00
3wc
656dd829ca Support ABRA_DIR in installer 2021-04-07 18:31:42 +02:00
10bcb68c9d Appease shellcheck
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 13:18:55 +02:00
e0c9c4e5b3 Add log entries
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-07 13:16:26 +02:00
d936080393 Allow skipping domain polling
Closes https://git.autonomic.zone/coop-cloud/abra/issues/140.
2021-04-07 13:15:26 +02:00
809ee6e68b Always inform we're polling the domain
Closes https://git.autonomic.zone/coop-cloud/abra/issues/141.
2021-04-07 13:14:53 +02:00
3wc
e0b185b5ef Add debugging for tests
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-07 01:29:43 +02:00
3wc
9815230eba Handle missing app versions during .. new
Closes #138
2021-04-07 01:28:33 +02:00
3wc
8cb556275f Make sure to get apps.json for recipe subcommands
Some checks failed
continuous-integration/drone/push Build is failing
Closes #136
2021-04-05 16:11:50 +02:00
48a7bb8c2d Merge pull request 'Use apps.json to power upgrade / rollback, add helper commands' (#135) from apps-json into main
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: https://git.autonomic.zone/coop-cloud/abra/pulls/135
2021-04-05 15:50:57 +02:00
3wc
a26a0d27d7 Reduce noise from app-json.py
Some checks failed
continuous-integration/drone/pr Build is failing
2021-04-05 13:26:49 +02:00
3wc
028c7dbde5 Tweak recipe .. release docs 2021-04-05 13:26:49 +02:00
3wc
103a4941c7 Reliability improvements to recipe .. release 2021-04-05 13:26:49 +02:00
3wc
a261114bbc Add --force to recipe .. release 2021-04-05 13:26:49 +02:00
3wc
e2640fac08 Add .. recipe .. release subcommand
Closes #134
2021-04-05 13:26:49 +02:00
3wc
33280f90b3 Rejig rollback, add <version> to deploy
Ref #132
2021-04-05 13:26:49 +02:00
3wc
8b60ece3d4 Add "recipe" commands, rejig vendoring, vendor jq 2021-04-05 13:26:49 +02:00
3wc
47efae4e6c Keep a fresh copy of apps.json
Ref #132
2021-04-05 13:26:49 +02:00
3wc
25d15c9596 Update abra-apps.json for new Rocket.chat version
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-05 12:58:53 +02:00
3wc
515bd7789d Provide DOCKER_CONTEXT for make release.. cmds
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-05 12:34:06 +02:00
3wc
6abb5db6ee Update abra-apps.json 2021-04-05 12:32:18 +02:00
3wc
699c4e76d5 Add a little more logging, fix typo
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-05 00:07:03 +02:00
3wc
703889d4ea Disco app JSON update 2021-04-05 00:07:03 +02:00
3wc
05cf00d272 Clean-up; require_binary, comments, shellcheck 2021-04-05 00:07:03 +02:00
c531faec52 Appease flake8 on the linting
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-04 21:15:00 +02:00
4e9aefcafd Appease shellcheck for app-catalogue script 2021-04-04 21:13:18 +02:00
fb338b414b Fix typo
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-04 21:11:25 +02:00
3wc
f1bdbf21c2 Update CHANGELOG
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-04 14:31:02 +02:00
3wc
c3e3f0a1f8 Use version info from compose file(s) not abra.sh
Ref #131
2021-04-04 14:29:29 +02:00
3wc
df4e5045be Add --skip-version-check option to app ... deploy 2021-04-04 14:28:00 +02:00
3wc
4a0889138f app-version.sh to slurp versions into compose files
Ref #131
2021-04-04 14:25:49 +02:00
3wc
f717c53e8b Gracefully handle README-parsing failures
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-04 10:27:02 +02:00
3wc
0206279894 Use abra's vendored copy of yq instead of system 2021-04-04 10:26:59 +02:00
fbb1081ed5 Remove two old scripts
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 21:31:12 +02:00
aad6f1db6e Remove unused import
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 21:07:32 +02:00
2599cff4cb Fix handling of existing tags
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 21:07:03 +02:00
25b916d969 Grab latest tags also
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 20:54:16 +02:00
37600727a4 Use the utility here 2021-04-03 20:54:11 +02:00
f4860ec662 Commit latest generation attempt for abra apps json
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 20:51:48 +02:00
20e56a755e Fix key error when missing the cache 2021-04-03 20:46:34 +02:00
c60265791e Wipe borked abra apps in preperation for a new run
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 20:44:19 +02:00
2e159050e9 Grab published abra apps json file
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 20:42:28 +02:00
25090a8129 Drop timeout value 2021-04-03 20:42:21 +02:00
be5383b164 Make use of caching for speeding up tags generation
See https://git.autonomic.zone/coop-cloud/abra/issues/129.
2021-04-03 20:42:02 +02:00
3720ef838d Track branch state when parsing versions
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 20:28:31 +02:00
071fcbb96b Don't deal with branches on feature parsing 2021-04-03 20:28:14 +02:00
abfb1c6404 Support multiple compose files for app json generation
Some checks failed
continuous-integration/drone/push Build is failing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/127.
2021-04-03 20:22:53 +02:00
0369a18c6e Fix service version collection
Closes https://git.autonomic.zone/coop-cloud/abra/issues/128.
2021-04-03 20:18:31 +02:00
57f74b0d46 Update with latest generated file
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-03 20:14:00 +02:00
93142ba305 Fix tag generation for underlying services
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 21:26:25 +02:00
f289f79ec3 Add change log entry
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 21:21:28 +02:00
6b0f8a3d45 Fix loads of bugs and generate apps JSON again
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 21:00:55 +02:00
6f776a8c51 Take a cleanup pass on generation script
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 20:40:31 +02:00
55dc3a1d2a Add versions listing script
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 17:24:15 +02:00
91ccc819d5 Fix URL
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 17:03:58 +02:00
bf0ed8fd1c Fix folder path
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 16:55:16 +02:00
8a54fa3f27 Only gather image names and fix generator
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 16:54:40 +02:00
26f9e1747f Fix domain 2021-04-02 16:47:06 +02:00
4a3c4ce0c5 Fix path 2021-04-02 16:46:48 +02:00
903b286d3f Fix URL 2021-04-02 16:46:31 +02:00
f4ab771e2a First working generation (woohoo)
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 16:43:43 +02:00
cd647f090b Further fixes to apps json generator 2021-04-02 16:35:29 +02:00
85670538c6 Hashed out a very broken tags gathering logic
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 16:28:56 +02:00
90780eab91 More dependencies! 2021-04-02 16:13:07 +02:00
1fabae0f48 Add jq dep docs
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 16:11:36 +02:00
75af48bc5d Add docs and remove unused import
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 16:05:31 +02:00
0323fbe1c8 It ain't the final step
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 15:56:15 +02:00
dbb61b9a46 Merge those two sections again
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 15:55:29 +02:00
3a40d27778 Expand release docs
Some checks failed
continuous-integration/drone/push Build is failing
2021-04-02 15:53:08 +02:00
1d1329b77e Wire up correct save path for deployment 2021-04-02 15:49:18 +02:00
d9374dc48e Don't ignore JSON, we'll need it 2021-04-02 15:49:08 +02:00
a760ef7869 Fix service name to match existing convention 2021-04-02 15:44:37 +02:00
3b9d6a7eb2 Fix copy/pasta for apps json deployer 2021-04-02 15:44:24 +02:00
663ba19c8b Run flake8 against python scripts 2021-04-02 15:42:28 +02:00
70b2a68f34 Add newline 2021-04-02 15:39:15 +02:00
2b0f691d5f Get shellcheck working for the bin/ scripts 2021-04-02 15:39:02 +02:00
18f8ea982e Add abra-apps releaser docs and target 2021-04-02 15:38:49 +02:00
d6cec2ff1a Update installer paths
All checks were successful
continuous-integration/drone/push Build is passing
2021-04-01 22:34:51 +02:00
29e0077edb Move installer script to more general deploy folder 2021-04-01 22:33:19 +02:00
73c1290c52 Move to bin/ folder 2021-04-01 22:33:05 +02:00
26e839ea7b Get this JSON generator over the line 2021-04-01 21:40:38 +02:00
e881f8007e Take a very sloppy regex mania pass on apps.json generation
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-28 11:40:49 +02:00
6f3f4b6779 Flesh out more of this generation script
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-26 20:48:08 +01:00
a5274f123c Fix non-master branch switching for repos 2021-03-26 20:21:37 +01:00
fc12634fbb Fix change log entries
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-26 01:17:06 +01:00
a5ce75a29b First stab at the apps JSON generation script
All checks were successful
continuous-integration/drone/push Build is passing
See https://git.autonomic.zone/coop-cloud/abra/issues/121.
2021-03-26 01:14:14 +01:00
701784930b Reinstate --force for the deploy command
All checks were successful
continuous-integration/drone/push Build is passing
Follow up to 07e3678c78.

Also remove bad docs for commands without `--force` now.
2021-03-26 00:40:23 +01:00
aa717c2323 Fix tests
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-26 00:28:47 +01:00
9836d27052 Add abra doctor command
Some checks failed
continuous-integration/drone/push Build is failing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/119.
2021-03-26 00:26:34 +01:00
e361b493b1 Recognise undeployed apps when undeploying
Some checks failed
continuous-integration/drone/push Build is failing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/123.
2021-03-26 00:01:07 +01:00
b28460cf84 Add wait and domain check logic
Some checks failed
continuous-integration/drone/push Build is failing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/116.
Also see https://git.autonomic.zone/coop-cloud/abra/issues/113.
2021-03-25 23:56:16 +01:00
07e3678c78 Replace all --force usage with --no-prompt
Some checks failed
continuous-integration/drone/push Build is failing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/118.
2021-03-25 22:47:59 +01:00
c315ebe319 Fix branch handling (again, again)
All checks were successful
continuous-integration/drone/push Build is passing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/122.
2021-03-25 22:13:08 +01:00
3wc
36dd6b5eff Simplify require_foo commands
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-20 23:17:05 +02:00
2f1f51bad1 Check for docker version
All checks were successful
continuous-integration/drone/push Build is passing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/15.
2021-03-20 22:00:02 +01:00
bada24f3f6 Add warning to README too
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-20 21:44:26 +01:00
2d5afd8149 Bump warning to the top and use emojis
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-20 21:43:35 +01:00
dfb949eecc Specify and wrap
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-20 21:42:04 +01:00
49771980a6 Add changes warning
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-20 21:41:27 +01:00
7e31184bd6 Add add version check command
All checks were successful
continuous-integration/drone/push Build is passing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/108.
2021-03-20 21:35:28 +01:00
49226f1640 Change warning to reflect version check scenarioj 2021-03-20 21:35:13 +01:00
4251c32b30 Re-word new app language to emphasise config editing
All checks were successful
continuous-integration/drone/push Build is passing
See https://git.autonomic.zone/coop-cloud/abra/issues/111#issuecomment-4407.
2021-03-20 21:24:38 +01:00
ece5385a38 Merge branch 'fix-subcommand-select' into main
All checks were successful
continuous-integration/drone/push Build is passing
Fix merge conflict in docopt generation + change log entry.
2021-03-20 21:18:34 +01:00
3wc
35d5df14aa Fix subcommand selection..
Some checks failed
continuous-integration/drone/pr Build is failing
..by sorting the list of subcommand function names in descending order
of how many '_' are in them. This means that `abra app <app> version`
will always be matched before `abra version`.

Ref #108
2021-03-20 19:07:02 +02:00
1c437b99eb Fix status checking
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-18 20:10:42 +01:00
9580b2dd7d Add entry
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-18 19:46:43 +01:00
f382765f29 Show correct status for missing contexts
Closes https://git.autonomic.zone/coop-cloud/abra/issues/99.
2021-03-18 19:45:30 +01:00
f5951add54 Fix variables in print statement
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-18 19:09:34 +01:00
2b4efc2c61 Quote that
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-18 18:57:00 +01:00
8ab854c822 Add log entry
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-18 18:55:44 +01:00
005323ff3c Add debug for SSH connect on init
Closes https://git.autonomic.zone/coop-cloud/abra/issues/109.
2021-03-18 18:55:04 +01:00
390e918417 Add missing it 2021-03-18 18:54:53 +01:00
c5ccfa0fa1 Add entry
Some checks failed
continuous-integration/drone/push Build is failing
2021-03-18 18:47:13 +01:00
87b71cb9d4 Show connection details on abra server ls
Closes https://git.autonomic.zone/coop-cloud/abra/issues/110.
2021-03-18 18:46:33 +01:00
89bd18a76b Add change log entries
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-18 17:21:16 +01:00
6e61c08b2c Handle undeployed state for version output summary
Closes https://git.autonomic.zone/coop-cloud/abra/issues/104.
2021-03-18 17:20:54 +01:00
54b6acc46c Fix output for stack name 2021-03-18 17:19:43 +01:00
e5e98d536a Add --force for undeploy 2021-03-18 17:18:35 +01:00
8df91de3af Add --force to deploy command
All checks were successful
continuous-integration/drone/push Build is passing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/105.
2021-03-18 14:12:18 +01:00
7557966c98 Add debug logging for STACK_NAME
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-17 14:12:59 +01:00
fa5d3ae3a1 Document release process
All checks were successful
continuous-integration/drone/push Build is passing
2021-03-17 12:59:09 +01:00
16 changed files with 2524 additions and 312 deletions

View File

@ -6,6 +6,12 @@ steps:
image: koalaman/shellcheck-alpine:v0.7.1
commands:
- shellcheck abra
- shellcheck bin/*.sh
- name: run flake8
image: alpine/flake8:3.9.0
commands:
- flake8 --max-line-length 100 bin/app-json.py
- name: run unit tests
image: decentral1se/docker-dind-bats-kcov

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
coverage/
/.venv
coverage/

View File

@ -1,5 +1,40 @@
> 🔥 🔥 🔥 Please note, while we are still in [public
> alpha](https://docs.cloud.autonomic.zone/roadmap/), the `abra` release
> versioning scheme is not following [semver](https://semver.org/) conventions
> because we are still in the exploratory phases of building this tool. Please
> read the changes before upgrading your `abra` installation as there are
> **most likely** breaking changes coming each release. Sorry for any
> inconvenience caused, we're working hard to make this tool stable. Semver
> will be respected when we reach public beta. 🔥 🔥 🔥
# abra x.x.x (UNRELEASED)
# abra 0.7.0 (2021-04-07)
- Add `--force` to the `deploy` command to allow overriding deployment logic ([#105](https://git.autonomic.zone/coop-cloud/abra/issues/105))
- Handle undeployed apps in version summaries when deploying ([#104](https://git.autonomic.zone/coop-cloud/abra/issues/104))
- Add `--force` to `undeploy` command ([e5e98d5](https://git.autonomic.zone/coop-cloud/abra/commit/e5e98d5))
- Rename "app type" back to "stack" in the deployment overview ([54b6acc](https://git.autonomic.zone/coop-cloud/abra/commit/54b6acc))
- Show context connection details on `abra server ls` ([#110](https://git.autonomic.zone/coop-cloud/abra/issues/110))
- Allow to debug the SSH connection details on swarm init ([#109](https://git.autonomic.zone/coop-cloud/abra/issues/109))
- Show correct status for apps deployed on servers with missing context ([#99](https://git.autonomic.zone/coop-cloud/abra/issues/99))
- Search for subcommands in descending order of how many components there are ([#108](https://git.autonomic.zone/coop-cloud/abra/issues/108))
- Add specific app version checking command (`abra app <app> version`) ([#108](https://git.autonomic.zone/coop-cloud/abra/issues/108))
- Add docker version check (guestimating < v19 is a bad idea) ([#15](https://git.autonomic.zone/coop-cloud/abra/issues/15))
- Fix git branch handling when not passing `-b <branch>` ([#122](https://git.autonomic.zone/coop-cloud/abra/issues/122))
- Add work-around to correctly git clone non-master default branch app repositories ([#122](https://git.autonomic.zone/coop-cloud/abra/issues/122))
- Replace `--force` (except for the `deploy` command) with a global `--no-prompt` for avoiding interactive questions ([#118](https://git.autonomic.zone/coop-cloud/abra/issues/118))
- Use [docker-stack-wait-deploy](https://github.com/vitalets/docker-stack-wait-deploy) inspired logic to deploy apps ([#116](https://git.autonomic.zone/coop-cloud/abra/issues/116))
- Add a domain polling check when deploying apps ([#113](https://git.autonomic.zone/coop-cloud/abra/issues/113))
- Recognise when apps are already undeployed with `abra app <app> undeploy` ([#123](https://git.autonomic.zone/coop-cloud/abra/issues/123))
- Add `abra doctor` command to help diagnose setup issues ([#119](https://git.autonomic.zone/coop-cloud/abra/issues/119))
- Add apps version and feature catalogue generation script ([#121](https://git.autonomic.zone/coop-cloud/abra/issues/121))
- New `--skip-version-check` option to `deploy` ([df4e504](https://git.autonomic.zone/coop-cloud/abra/commit/df4e504)
- Look up local available version from compose files instead of `abra.sh` ([#131](https://git.autonomic.zone/coop-cloud/abra/issues/131))
- Improve domain polling logging and allow to skip the check altogether with `--no-domain-poll` ([#140](https://git.autonomic.zone/coop-cloud/abra/issues/140), [#141](https://git.autonomic.zone/coop-cloud/abra/issues/141))
- Support `ABRA_DIR` in the installer script ([4e94a424e94a42](https://git.autonomic.zone/coop-cloud/abra/commit/4e94a424e94a42))
- Support [abra-hetzner](https://git.autonomic.zone/coop-cloud/abra-hetzner) plugin ([#88](https://git.autonomic.zone/coop-cloud/abra/issues/88))
# 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))

View File

@ -11,6 +11,15 @@ The cooperative cloud utility belt 🎩🐇
## Change log
> 🔥 🔥 🔥 Please note, while we are still in [public
> alpha](https://docs.cloud.autonomic.zone/roadmap/), the `abra` release
> versioning scheme is not following [semver](https://semver.org/) conventions
> because we are still in the exploratory phases of building this tool. Please
> read the changes before upgrading your `abra` installation as there are
> **most likely** breaking changes coming each release. Sorry for any
> inconvenience caused, we're working hard to make this tool stable. Semver
> will be respected when we reach public beta. 🔥 🔥 🔥
See [CHANGELOG.md](./CHANGELOG.md).
## Documentation
@ -31,7 +40,7 @@ or the bleeding-edge development version:
curl https://install.abra.autonomic.zone | bash -s -- --dev
```
The source for this script is [here](./installer/installer).
The source for this script is [here](./deploy/install.abra.autonomic.zone/installer).
## Update
@ -50,8 +59,33 @@ The command-line interface is generated via [docopt](http://docopt.org/). If you
Please remember to update the [CHANGELOG](./CHANGELOG.md) when you make a change.
To deploy a new version of the installer scripts:
## Generating a new abra-apps.json
```sh
make release-installer
You'll need to install the following requirements:
- [requests](https://docs.python-requests.org/en/master/) (`apt install python3-requests` / `pip install requests`)
- [skopeo](https://github.com/containers/skopeo) (check [the install docs](https://github.com/containers/skopeo/blob/master/install.md))
- [jq](https://stedolan.github.io/jq/tutorial/) (`sudo apt-get install jq` or see [the install docs](https://stedolan.github.io/jq/download/))
- [yq](https://mikefarah.gitbook.io/yq/) (see [the install docs](https://mikefarah.gitbook.io/yq/#install))
Then run `./bin/app-json.py` ([source](./bin/app-json.py)) and it will spit out the JSON file into [deploy/abra-apps.cloud.autonomic.zone/abra-apps.json](./deploy/abra-apps.cloud.autonomic.zone/abra-apps.json).
## Releasing
### `abra`
- Change the `x.x.x` header in [CHANGELOG.md](./CHANGELOG.md) to reflect new version and mark date
- Update the version in [abra](./abra)
- Update the version in [deploy/install.abra.autonomic.zone/installer](./deploy/install.abra.autonomic.zone/installer)
- `git commit` the above changes and then tag it with `git tag <your-new-version>`
- `git push` and `git push --tags`
- Deploy a new installer script `make release-installer`
- Tell the world (CoTech forum, Matrix public channel, Autonomic mastodon, etc.)
### abra-apps.cloud.autonomic.zone
> [abra-apps.cloud.autonomic.zone](https://abra-apps.cloud.autonomic.zone)
```bash
$ make release-abra-apps
```

1032
abra

File diff suppressed because it is too large Load Diff

View File

@ -1,42 +0,0 @@
#!/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"

View File

@ -1,4 +1,7 @@
#!/bin/bash
# shellcheck disable=SC2119
# Usage: ./app-catalogue.sh
#
# Gather metadata from Co-op Cloud apps in $ABRA_DIR/apps (default
@ -7,7 +10,7 @@
stack_dir="${ABRA_DIR:-$HOME/.abra}/apps/"
cd "$stack_dir"
cd "$stack_dir" || exit
# load all README files into ENV_FILES array
mapfile -t readmes < <(find -L . -name "README.md")

253
bin/app-json.py Executable file
View File

@ -0,0 +1,253 @@
#!/usr/bin/env python3
# Usage: ./app-json.py
#
# Gather metadata from Co-op Cloud apps in $ABRA_DIR/apps (default
# ~/.abra/apps), and format it as JSON so that it can be hosted here:
# https://abra-apps.cloud.autonomic.zone
from json import dump
from logging import DEBUG, basicConfig, getLogger
from os import chdir, listdir, mkdir
from os.path import basename, exists, expanduser
from pathlib import Path
from re import findall, search
from shlex import split
from subprocess import check_output, DEVNULL
from sys import exit
from requests import get
HOME_PATH = expanduser("~/")
CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute()
YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq")
SCRIPT_PATH = Path(__file__).absolute().parent
REPOS_TO_SKIP = (
"abra",
"backup-bot",
"cloud.autonomic.zone",
"docs.cloud.autonomic.zone",
"example",
"organising",
"pyabra",
"stack-ssh-deploy",
"radicle-seed-node",
"coturn"
)
log = getLogger(__name__)
basicConfig()
log.setLevel(DEBUG)
def _run_cmd(cmd, shell=False, **kwargs):
"""Run a shell command."""
args = [split(cmd)]
if shell:
args = [cmd]
kwargs = {"shell": shell}
try:
return check_output(*args, **kwargs).decode("utf-8").strip()
except Exception as exception:
log.error(f"Failed to run {cmd}, saw {str(exception)}")
exit(1)
def get_published_apps_json():
"""Retrieve already published apps json."""
url = "https://abra-apps.cloud.autonomic.zone"
log.info(f"Retrieving {url}")
try:
return get(url, timeout=5).json()
except Exception as exception:
log.error(f"Failed to retrieve {url}, saw {str(exception)}")
return {}
def clone_all_apps():
"""Clone all Co-op Cloud apps to ~/.abra/apps."""
if not exists(CLONES_PATH):
mkdir(CLONES_PATH)
url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos"
log.info(f"Retrieving {url}")
try:
response = get(url, timeout=10)
except Exception as exception:
log.error(f"Failed to retrieve {url}, saw {str(exception)}")
exit(1)
repos = [[p["name"], p["ssh_url"]] for p in response.json()]
for name, url in repos:
if name in REPOS_TO_SKIP:
continue
if not exists(f"{CLONES_PATH}/{name}"):
log.info(f"Retrieving {url}")
_run_cmd(f"git clone {url} {CLONES_PATH}/{name}")
chdir(f"{CLONES_PATH}/{name}")
if not int(_run_cmd("git branch --list | wc -l", shell=True)):
log.info(f"Guessing main branch is HEAD for {name}")
_run_cmd("git checkout main")
else:
log.info(f"Updating {name}")
chdir(f"{CLONES_PATH}/{name}")
_run_cmd("git fetch -a")
def generate_apps_json():
"""Generate the abra-apps.json application versions file."""
apps_json = {}
cached_apps_json = get_published_apps_json()
for app in listdir(CLONES_PATH):
if app in REPOS_TO_SKIP:
log.info(f"Skipping {app}")
continue
app_path = f"{CLONES_PATH}/{app}"
chdir(app_path)
log.info(f"Processing {app}")
apps_json[app] = {
"category": "apps",
"repository": f"https://git.autonomic.zone/coop-cloud/{app}.git",
# Note(decentral1se): please note that the app features do not
# correspond to version tags. We simply parse the latest features
# list from HEAD. This may lead to unexpected situations where
# users believe X feature is available under Y version but it is
# not.
"features": get_app_features(app_path),
"versions": get_app_versions(app_path, cached_apps_json),
}
return apps_json
def get_app_features(app_path):
"""Parse features from app repo README files."""
features = {}
chdir(app_path)
with open(f"{app_path}/README.md", "r") as handle:
log.info(f"{app_path}/README.md")
contents = handle.read()
try:
for match in findall(r"\*\*.*\s\*", contents):
title = search(r"(?<=\*\*).*(?=\*\*)", match).group().lower()
if title == "image":
value = {
"image": search(r"(?<=`).*(?=`)", match).group(),
"url": search(r"(?<=\().*(?=\))", match).group(),
"rating": match.split(",")[1].strip(),
"source": match.split(",")[-1].replace("*", "").strip(),
}
else:
value = match.split(":")[-1].replace("*", "").strip()
features[title] = value
except (IndexError, AttributeError):
log.info(f"Can't parse {app_path}/README.md")
return {}
finally:
_run_cmd("git checkout HEAD")
log.info(f"Parsed {features}")
return features
def get_app_versions(app_path, cached_apps_json):
versions = {}
chdir(app_path)
tags = _run_cmd("git tag --list").split()
if not tags:
log.info("No tags discovered, moving on")
return {}
initial_branch = _run_cmd("git rev-parse --abbrev-ref HEAD")
app_name = basename(app_path)
try:
existing_tags = cached_apps_json[app_name]["versions"].keys()
except KeyError:
existing_tags = []
for tag in tags:
_run_cmd(f"git checkout {tag}",
stderr=DEVNULL)
services_cmd = f"{YQ_PATH} e '.services | keys | .[]' compose*.yml"
services = _run_cmd(services_cmd, shell=True).split()
parsed_services = []
service_versions = {}
for service in services:
if service in ("null", "---"):
continue
if tag in existing_tags:
log.info(f"Skipping {tag} because we've already processed it")
existing_versions = cached_apps_json[app_name]["versions"][tag][service]
service_versions[service] = existing_versions
_run_cmd(f"git checkout {initial_branch}")
continue
if service in parsed_services:
log.info(f"Skipped {service}, we've already parsed it locally")
continue
services_cmd = f"{YQ_PATH} e '.services.{service}.image' compose*.yml"
images = _run_cmd(services_cmd, shell=True).split()
for image in images:
if image in ("null", "---"):
continue
images_cmd = f"skopeo inspect docker://{image} | jq '.Digest'"
output = _run_cmd(images_cmd, shell=True)
service_version_info = {
"image": image.split(":")[0],
"tag": image.split(":")[-1],
"digest": output.split(":")[-1][:8],
}
log.info(f"Parsed {service_version_info}")
service_versions[service] = service_version_info
parsed_services.append(service)
versions[tag] = service_versions
_run_cmd(f"git checkout {initial_branch}")
return versions
def main():
"""Run the script."""
clone_all_apps()
target = f"{SCRIPT_PATH}/../deploy/abra-apps.cloud.autonomic.zone/abra-apps.json"
with open(target, "w", encoding="utf-8") as handle:
dump(generate_apps_json(), handle, ensure_ascii=False, indent=4)
log.info(f"Successfully generated {target}")
main()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,38 @@
---
version: "3.8"
services:
app:
image: "nginx:stable"
configs:
- source: abra_conf
target: /etc/nginx/conf.d/abra.conf
- source: abra_apps_json
target: /var/www/abra-apps/abra-apps.json
volumes:
- "public:/var/www/abra-apps"
networks:
- proxy
deploy:
update_config:
failure_action: rollback
order: start-first
labels:
- "traefik.enable=true"
- "traefik.http.services.abra-apps.loadbalancer.server.port=80"
- "traefik.http.routers.abra-apps.rule=Host(`abra-apps.cloud.autonomic.zone`)"
- "traefik.http.routers.abra-apps.entrypoints=web-secure"
- "traefik.http.routers.abra-apps.tls.certresolver=production"
configs:
abra_apps_json:
file: abra-apps.json
abra_conf:
file: nginx.conf
networks:
proxy:
external: true
volumes:
public:

View File

@ -0,0 +1,10 @@
server {
listen 80 default_server;
server_name abra-apps.cloud.autonomic.zone;
location / {
root /var/www/abra-apps;
add_header Content-Type application/json;
index abra-apps.json;
}
}

View File

@ -2,7 +2,7 @@
version: "3.8"
services:
abra_installer:
app:
image: "nginx:stable"
configs:
- source: abra_conf

View File

@ -1,8 +1,9 @@
#!/bin/bash
ABRA_VERSION="0.6.0"
ABRA_VERSION="0.7.0"
GIT_URL="https://git.autonomic.zone/coop-cloud/abra"
ABRA_SRC="$GIT_URL/raw/tag/$ABRA_VERSION/abra"
ABRA_DIR="${ABRA_DIR:+$ABRA_DIR}"
function install_abra_release {
mkdir -p "$HOME/.local/bin"
@ -12,13 +13,13 @@ function install_abra_release {
}
function install_abra_dev {
mkdir -p "$HOME/.abra/"
if [[ ! -d "$HOME/.abra/src" ]]; then
git clone "$GIT_URL" "$HOME/.abra/src"
mkdir -p "$ABRA_DIR/"
if [[ ! -d "$ABRA_DIR/src" ]]; then
git clone "$GIT_URL" "$ABRA_DIR/src"
fi
( cd "$HOME/.abra/src" && git pull origin main && cd -)
(cd "$ABRA_DIR/src" && git pull origin main && cd - || exit)
mkdir -p "$HOME/.local/bin"
ln -sf "$HOME/.abra/src/abra" "$HOME/.local/bin/abra"
ln -sf "$ABRA_DIR/src/abra" "$HOME/.local/bin/abra"
echo "abra installed to $HOME/.local/bin/abra (development bleeding edge)"
}

View File

@ -21,7 +21,8 @@ shellcheck:
--rm \
-v $$(pwd):/workdir \
koalaman/shellcheck-alpine \
shellcheck /workdir/abra
shellcheck /workdir/abra && \
shellcheck /workdir/bin/*.sh
docopt:
@if [ ! -d ".venv" ]; then \
@ -45,6 +46,13 @@ codecov:
-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
@DOCKER_CONTEXT=swarm.autonomic.zone \
docker stack rm abra-installer-script && \
cd deploy/install.abra.autonomic.zone && \
DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-installer-script
release-abra-apps:
@DOCKER_CONTEXT=swarm.autonomic.zone \
docker stack rm abra-apps-json && \
cd deploy/abra-apps.cloud.autonomic.zone && \
DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-apps-json

View File

@ -9,44 +9,48 @@ teardown() {
rm -rf "$ABRA_DIR"
}
abra() {
./abra -d $@
}
@test "abra server (add|rm)" {
./abra server add swarm.test.com
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 swarm.test.com rm
./abra server add swarm.test.com foobar 12345
abra server add swarm.test.com foobar 12345
[ -d $ABRA_DIR/servers/swarm.test.com ]
./abra server swarm.test.com rm
abra server swarm.test.com rm
}
@test "abra server init" {
./abra server default 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
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
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
# --no-prompt
abra app new --server default --domain traefik_test_com --app-name traefik_test_com traefik
abra --no-prompt app traefik_test_com delete
[ ! -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 new --server default --domain traefik_test_com --app-name traefik_test_com traefik
./abra app traefik_test_com secret insert foobar v1 "foobar"
abra app traefik_test_com secret insert foobar v1 "foobar"
# interactive prompt
echo "y" | ./abra app traefik_test_com secret rm foobar
echo "y" | abra app traefik_test_com secret rm foobar
./abra app traefik_test_com secret insert foobar v1 "foobar"
abra app traefik_test_com secret insert foobar v1 "foobar"
# prompt
./abra app traefik_test_com secret rm foobar --force
abra --no-prompt app traefik_test_com secret rm foobar
}