Compare commits

...

100 Commits

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
16 changed files with 2406 additions and 314 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

@ -9,6 +9,8 @@
# 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))
@ -18,7 +20,20 @@
- 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 < v20 is a bad idea) ([#15](https://git.autonomic.zone/coop-cloud/abra/issues/15))
- 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)

View File

@ -40,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
@ -59,11 +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.
## Release
## Generating a new abra-apps.json
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 versions in [installer/installer](./installer/installer) and [abra](./abra)
- 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>`
- Then `git push` and `git push --tags`
- `git push` and `git push --tags`
- Deploy a new installer script `make release-installer`
- Tell the world
- 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
```

930
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
}