Compare commits
4 Commits
fix-subcom
...
monorepo
Author | SHA1 | Date | |
---|---|---|---|
66013f6ddb | |||
3d3d6b9b67 | |||
eec1dcb0b2 | |||
1d52c0f5ed |
38
.drone.yml
38
.drone.yml
@ -3,41 +3,11 @@ kind: pipeline
|
||||
name: linters
|
||||
steps:
|
||||
- name: run shellcheck
|
||||
image: koalaman/shellcheck-alpine:v0.7.1
|
||||
image: debian:buster
|
||||
commands:
|
||||
- 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
|
||||
|
||||
- apt update
|
||||
- apt install -y shellcheck
|
||||
- shellcheck abra installer
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
coverage/
|
||||
/.venv
|
73
CHANGELOG.md
73
CHANGELOG.md
@ -1,76 +1,3 @@
|
||||
# abra x.x.x (UNRELEASED)
|
||||
|
||||
- Search for subcommands in descending order of how many components there are ([#108](https://git.autonomic.zone/coop-cloud/abra/issues/108))
|
||||
|
||||
# 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))
|
||||
|
14
Makefile
Normal file
14
Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
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
|
80
README.md
80
README.md
@ -1,60 +1,56 @@
|
||||
# abra
|
||||
|
||||
[](https://drone.autonomic.zone/coop-cloud/abra)
|
||||
[](undefined)
|
||||
[](https://drone.autonomic.zone/autonomic-cooperative/abra)
|
||||
|
||||
> 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/)
|
||||
Docker stack magic 🎩🐇
|
||||
|
||||
## Install
|
||||
|
||||
Install the latest stable release:
|
||||
|
||||
```sh
|
||||
curl https://install.abra.autonomic.zone | bash
|
||||
curl -fsSL https://install.abra.autonomic.zone | bash
|
||||
```
|
||||
|
||||
or the bleeding-edge development version:
|
||||
Specific releases are available via the project [release page](https://git.autonomic.zone/autonomic-cooperative/abra/releases).
|
||||
|
||||
## Changes
|
||||
|
||||
See [CHANGELOG.md](./CHANGELOG.md).
|
||||
|
||||
## Hacking
|
||||
|
||||
```sh
|
||||
curl https://install.abra.autonomic.zone | bash -s -- --dev
|
||||
git clone ssh://git@git.autonomic.zone:2222/autonomic-cooperative/abra.git
|
||||
cd abra
|
||||
make dev_install
|
||||
```
|
||||
|
||||
The source for this script is [here](./installer/installer).
|
||||
See [autonomic-cooperative/installer-scripts](https://git.autonomic.zone/autonomic-cooperative/installer-scripts) for the installer script deployment. To make a release, just add an entry to [CHANGELOG.md](./CHANGELOG.md) and the [installer](./installer) (following [semver](https://semver.org/) please) and then `git tag x.x.x && git push origin main --tags`. If you want the [installer-scripts](https://git.autonomic.zone/autonomic-cooperative/installer-scripts) deployment to pick that up, you'll need to change the version number in the [Makefile](https://git.autonomic.zone/autonomic-cooperative/installer-scripts/src/branch/main/Makefile) and run `make` in that repository and push the changes.
|
||||
|
||||
## Update
|
||||
## Specify what to deploy where
|
||||
|
||||
Run `abra upgrade` to automatically download and install the latest release
|
||||
version.
|
||||
You can use `abra` in one of 2 ways:
|
||||
|
||||
To update the development version, run `abra upgrade --dev`.
|
||||
1. Clone a `compose-stack`, create an `.envrc` in it, and run `abra` in that
|
||||
directory. Be sure to set `ABRA_STACK_DIR=.`
|
||||
2. "Monorepo mode": keep all your `compose-stack`s in one directory and all your `env` files in
|
||||
another, e.g.:
|
||||
```
|
||||
$ tree
|
||||
.
|
||||
├── apps
|
||||
│ ├── mediawiki.demo.autonomic.zone.env
|
||||
│ ├── wordpress.demo.autonomic.zone.env
|
||||
└── stacks
|
||||
├── gitea
|
||||
├── matrix-synapse
|
||||
├── mediawiki
|
||||
├── nextcloud
|
||||
├── swarmpit
|
||||
├── traefik
|
||||
└── wordpress
|
||||
$ abra -e apps/mediawiki.demo.autonomic.zone.env deploy
|
||||
```
|
||||
|
||||
## Hack
|
||||
## Examples
|
||||
|
||||
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.
|
||||
|
||||
## Release
|
||||
|
||||
- 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)
|
||||
- `git commit` the above changes and then tag it with `git tag <your-new-version>`
|
||||
- Then `git push` and `git push --tags`
|
||||
- Deploy a new installer script `make release-installer`
|
||||
- Tell the world
|
||||
- `abra run mariadb mysqldump gitea -p'GdIbMeS09SURRktBnm3jcTufsL5z0MPd' | gzip > ../git.autonomic.zone_mariadb_`date +%F`.sql.gz`
|
||||
|
100
app-catalogue.sh
100
app-catalogue.sh
@ -1,100 +0,0 @@
|
||||
#!/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
|
@ -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"
|
@ -1,52 +0,0 @@
|
||||
#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 "$@"
|
@ -1,117 +0,0 @@
|
||||
#!/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
|
18
installer
Executable file
18
installer
Executable file
@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
ABRA_VERSION="0.1.2"
|
||||
ABRA_SRC="https://git.autonomic.zone/autonomic-cooperative/abra/raw/tag/$ABRA_VERSION/abra"
|
||||
|
||||
function install_abra {
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
curl "$ABRA_SRC" > "$HOME/.local/bin/abra"
|
||||
chmod +x "$HOME/.local/bin/abra"
|
||||
echo "abra installed to $HOME/.loca/bin/abra"
|
||||
}
|
||||
|
||||
function run_installation {
|
||||
install_abra
|
||||
}
|
||||
|
||||
run_installation
|
||||
exit 0
|
@ -1,38 +0,0 @@
|
||||
---
|
||||
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:
|
@ -1,34 +0,0 @@
|
||||
#!/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
|
@ -1,10 +0,0 @@
|
||||
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
50
makefile
@ -1,50 +0,0 @@
|
||||
.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
|
7
test/abra.yml
Normal file
7
test/abra.yml
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
name: mystack
|
||||
secrets:
|
||||
foo:
|
||||
bar:
|
||||
baz:
|
||||
length: 128
|
@ -1,17 +0,0 @@
|
||||
#!/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
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
#!/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