Compare commits
144 Commits
Author | SHA1 | Date | |
---|---|---|---|
63c982c550 | |||
0d202eedfc | |||
cb2d563ea0 | |||
059968a8cf | |||
c57069e0af | |||
946a527baa | |||
89d530a553 | |||
25fe6808ad | |||
28b2d8ecc7 | |||
fd735a1310 | |||
e307286db7 | |||
dd570e224b | |||
f495ec0d94 | |||
b75bce531b | |||
0d62f01d5a | |||
eec55896a4 | |||
c2a56c6c09 | |||
74dfd75fb1 | |||
e8c0efa91e | |||
6bae48431c | |||
543072ab37 | |||
57e3a34133 | |||
33a49a8457 | |||
5806e40c1c | |||
0d24a8e5cc | |||
e01f06423e | |||
80f06ba0e1 | |||
f8306b282d | |||
2bdfe8baa8 | |||
b226396764 | |||
a3cd6d2281 | |||
50651aeea1 | |||
57e24eaf0a | |||
50ca4f8029 | |||
0433da3689 | |||
3e0b9e9475 | |||
c6b841de6c | |||
2daffc8694 | |||
b15a214049 | |||
8d7194fcce | |||
188dc56dd1 | |||
dbfe6f8097 | |||
26b994ab84 | |||
dba3c391bd | |||
5a72ed0cfb | |||
b5d84d5e0d | |||
e3983c2440 | |||
85b8a4f459 | |||
6e38dc35e5 | |||
841e4fc61a | |||
c1d12eacc5 | |||
3b730d314b | |||
5df3a9fffb | |||
3e3fe0e349 | |||
db766f4aec | |||
8909a46d8c | |||
8d139d4d28 | |||
b6b80298c2 | |||
b1e8ac4498 | |||
c5785089d6 | |||
bec3272a41 | |||
dc3b772b72 | |||
07d4f8cbdf | |||
37c59a53ef | |||
87a54594f6 | |||
e2e76edaaf | |||
ab7772e8f7 | |||
7304612f5f | |||
5a07f08ab3 | |||
1e158cce55 | |||
2102193df1 | |||
1b4258f1ea | |||
cc060b8546 | |||
dce46603bf | |||
64d04a29ab | |||
db7eb30447 | |||
f648b251bf | |||
86a790bbe4 | |||
b423d61fce | |||
f03c509552 | |||
e6458e5e60 | |||
9580199616 | |||
b59e902d18 | |||
c50b1d8760 | |||
b49b510c43 | |||
b68bfdfb43 | |||
983e4af08c | |||
6cf7cf843a | |||
d37d8a0c66 | |||
da33064a5f | |||
be2fffd858 | |||
38f0c92bc7 | |||
c1fbb75657 | |||
33fd0eeb8d | |||
5955505752 | |||
e022fe2310 | |||
02fa9025dc | |||
2250713c05 | |||
2b77cfebf9 | |||
aff01e6741 | |||
0eb5d14ad8 | |||
6d6208a63c | |||
1e059ffe7f | |||
eb12f2392c | |||
a13e58c6c0 | |||
44c41830a7 | |||
ae6c2c26ae | |||
dad72c820a | |||
eec9a8ba1a | |||
bf44270b3d | |||
4bf1dbd7eb | |||
4ca1026c2c | |||
891b2cc6c9 | |||
4de7f24d8e | |||
ad1063a0cc | |||
4cfe143326 | |||
16cc5d9cf7 | |||
9d22797dc8 | |||
16a09887e6 | |||
b7757b51b1 | |||
3c7c7694bf | |||
f15dfd9f5f | |||
66dcaedfd0 | |||
6598aabc37 | |||
6759e6a175 | |||
8735362580 | |||
7223dca951 | |||
dd9444b036 | |||
81e24b6f72 | |||
16292df5f6 | |||
92c91ddbb0 | |||
cff9b13f60 | |||
0444991636 | |||
28ba33b18e | |||
77eb83b128 | |||
ff7fcf2201 | |||
b0d525a980 | |||
aa1ffd5d8a | |||
5627e67bf7 | |||
29343369f3 | |||
427ed97678 | |||
b01fee3c86 | |||
949246821f | |||
60f2892acd |
28
.drone.yml
28
.drone.yml
@ -3,11 +3,31 @@ kind: pipeline
|
||||
name: linters
|
||||
steps:
|
||||
- name: run shellcheck
|
||||
image: debian:buster
|
||||
image: koalaman/shellcheck-alpine:latest
|
||||
commands:
|
||||
- apt update
|
||||
- apt install -y shellcheck
|
||||
- shellcheck abra installer
|
||||
- shellcheck abra
|
||||
|
||||
- name: run unit tests
|
||||
image: docker:dind
|
||||
commands:
|
||||
- apk add bats git bash
|
||||
- bats tests
|
||||
|
||||
- name: collect code coverage
|
||||
failure: ignore # until we fix this
|
||||
image: kcov/kcov:latest
|
||||
commands:
|
||||
- apk add bats git bash
|
||||
- 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
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
coverage/
|
||||
/.venv
|
13
CHANGELOG.md
13
CHANGELOG.md
@ -1,3 +1,16 @@
|
||||
# abra x.x.x (UNRELEASED)
|
||||
|
||||
- ???
|
||||
|
||||
# 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))
|
||||
|
44
Makefile
44
Makefile
@ -1,14 +1,38 @@
|
||||
default: install
|
||||
.PHONY: test shellcheck docopt kcov codecov
|
||||
|
||||
dev_install:
|
||||
ln -sf $(PWD)/abra ~/.local/bin
|
||||
test:
|
||||
@DOCKER_CONTEXT=default docker run \
|
||||
-it \
|
||||
--rm \
|
||||
-v $$(pwd):/workdir \
|
||||
docker:dind \
|
||||
sh -c "apk add bats git bash && cd /workdir && bats /workdir/test.bats"
|
||||
|
||||
install:
|
||||
install abra /usr/bin/abra
|
||||
shellcheck:
|
||||
@docker run \
|
||||
-it \
|
||||
--rm \
|
||||
-v $$(pwd):/workdir \
|
||||
koalaman/shellcheck-alpine \
|
||||
shellcheck /workdir/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
|
||||
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
|
||||
|
||||
.PHONY: dev_install install get_yq
|
||||
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)
|
||||
|
29
README.md
29
README.md
@ -1,31 +1,14 @@
|
||||
# abra
|
||||
|
||||
[](https://drone.autonomic.zone/autonomic-cooperative/abra)
|
||||
[](https://drone.autonomic.zone/coop-cloud/abra)
|
||||
[](undefined)
|
||||
|
||||
Docker stack magic 🎩🐇
|
||||
> https://cloud.autonomic.zone
|
||||
|
||||
The cooperative cloud utility belt 🎩🐇
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
curl -fsSL https://install.abra.autonomic.zone | bash
|
||||
curl https://install.abra.autonomic.zone | bash
|
||||
```
|
||||
|
||||
Specific releases are available via the project [release page](https://git.autonomic.zone/autonomic-cooperative/abra/releases).
|
||||
|
||||
## Changes
|
||||
|
||||
See [CHANGELOG.md](./CHANGELOG.md).
|
||||
|
||||
## Hacking
|
||||
|
||||
```sh
|
||||
git clone ssh://git@git.autonomic.zone:2222/autonomic-cooperative/abra.git
|
||||
cd abra
|
||||
make dev_install
|
||||
```
|
||||
|
||||
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 [abra-installer](./script.d/abra-installer) / [swarm-installer](./script.d/swarm-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.
|
||||
|
||||
## Examples
|
||||
|
||||
- `abra run mariadb mysqldump gitea -p'GdIbMeS09SURRktBnm3jcTufsL5z0MPd' | gzip > ../git.autonomic.zone_mariadb_`date +%F`.sql.gz`
|
||||
|
52
completion/_abra
Normal file
52
completion/_abra
Normal file
@ -0,0 +1,52 @@
|
||||
#compdef abra
|
||||
|
||||
_abra () {
|
||||
local context state line curcontext="$curcontext" ret=1
|
||||
_arguments -n : \
|
||||
{-h,--help}'[Help message]' \
|
||||
'1:commands:(app server)' \
|
||||
'*::arguments:->arguments' \
|
||||
&& ret=0
|
||||
|
||||
case $state in
|
||||
(arguments)
|
||||
curcontext="${curcontext%:*:*}:abra-arguments-$words[1]:"
|
||||
case $words[1] in
|
||||
(app)
|
||||
_arguments \
|
||||
'1: :_abra_apps' \
|
||||
&& ret=0
|
||||
;;
|
||||
(server)
|
||||
_arguments \
|
||||
'1:servers:_abra_servers' \
|
||||
&& ret=0
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_abra_servers() {
|
||||
_path_files -/W $HOME/.abra/servers
|
||||
}
|
||||
|
||||
_abra_apps()
|
||||
{
|
||||
local newapps apps=($HOME/.abra/servers/*/*.env)
|
||||
typeset -a apps
|
||||
newapps=()
|
||||
for app in $apps; do
|
||||
newapps+=($(_abra_basename "${app}"))
|
||||
done
|
||||
_describe -t apps 'app' newapps
|
||||
}
|
||||
|
||||
_abra_basename()
|
||||
{
|
||||
printf -- "${1##*/}"
|
||||
}
|
||||
|
||||
_abra "$@"
|
117
completion/abra.bash
Normal file
117
completion/abra.bash
Normal file
@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
_abra_basename()
|
||||
{
|
||||
echo "${1##*/}"
|
||||
}
|
||||
|
||||
_abra_servers()
|
||||
{
|
||||
# FIXME 3wc: copied from abra/get_servers()
|
||||
shopt -s nullglob dotglob
|
||||
local SERVERS=(~/.abra/servers/*)
|
||||
shopt -u nullglob dotglob
|
||||
|
||||
for SERVER in "${SERVERS[@]}"; do
|
||||
_abra_basename "${SERVER}"
|
||||
done
|
||||
}
|
||||
|
||||
_abra_complete_servers()
|
||||
{
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(_abra_servers)" -- "$1")
|
||||
}
|
||||
|
||||
_abra_apps()
|
||||
{
|
||||
shopt -s nullglob dotglob
|
||||
local APPS=(~/.abra/servers/*/*.env)
|
||||
shopt -u nullglob dotglob
|
||||
|
||||
for APP in "${APPS[@]}"; do
|
||||
_abra_basename "${APP%.env}"
|
||||
done
|
||||
}
|
||||
|
||||
_abra_complete_apps()
|
||||
{
|
||||
mapfile -t COMPREPLY < <(compgen -W "$(_abra_apps)" -- "$1")
|
||||
}
|
||||
|
||||
_abra_complete()
|
||||
{
|
||||
compopt +o default +o nospace
|
||||
COMPREPLY=()
|
||||
|
||||
local -r cmds='
|
||||
app
|
||||
server
|
||||
'
|
||||
local -r short_opts='-e -h -s -v'
|
||||
local -r long_opts='--env --help --stack --version'
|
||||
|
||||
# Scan through the command line and find the abra command
|
||||
# (if present), as well as its expected position.
|
||||
local cmd
|
||||
local cmd_index=1 # Expected index of the command token.
|
||||
local i
|
||||
for (( i = 1; i < ${#COMP_WORDS[@]}; i++ )); do
|
||||
local word="${COMP_WORDS[i]}"
|
||||
case "$word" in
|
||||
-*)
|
||||
((cmd_index++))
|
||||
;;
|
||||
*)
|
||||
cmd="$word"
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
|
||||
if (( COMP_CWORD < cmd_index )); then
|
||||
# Offer option completions.
|
||||
case "$cur" in
|
||||
--*)
|
||||
mapfile -t COMPREPLY < <(compgen -W "$long_opts" -- "$cur")
|
||||
;;
|
||||
-*)
|
||||
mapfile -t COMPREPLY < <(compgen -W "$short_opts" -- "$cur")
|
||||
;;
|
||||
*)
|
||||
# Skip completion; we should never get here.
|
||||
;;
|
||||
esac
|
||||
elif (( COMP_CWORD == cmd_index )); then
|
||||
# Offer command name completions.
|
||||
mapfile -t COMPREPLY < <(compgen -W "$cmds" -- "$cur")
|
||||
else
|
||||
# Offer command argument completions.
|
||||
case "$cmd" in
|
||||
server)
|
||||
# Offer exactly one server name completion.
|
||||
if (( COMP_CWORD == cmd_index + 2 )); 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
|
40
installer/compose.yml
Normal file
40
installer/compose.yml
Normal file
@ -0,0 +1,40 @@
|
||||
---
|
||||
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:
|
||||
name: abra_installer_v1
|
||||
file: installer
|
||||
abra_conf:
|
||||
name: abra_conf_v1
|
||||
file: nginx.conf
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
public:
|
@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
ABRA_VERSION="0.1.2"
|
||||
ABRA_SRC="https://git.autonomic.zone/autonomic-cooperative/abra/raw/tag/$ABRA_VERSION/abra"
|
||||
ABRA_VERSION="0.3.1"
|
||||
ABRA_SRC="https://git.autonomic.zone/coop-cloud/abra/raw/tag/$ABRA_VERSION/abra"
|
||||
|
||||
function install_abra {
|
||||
mkdir -p "$HOME/.local/bin"
|
10
installer/nginx.conf
Normal file
10
installer/nginx.conf
Normal file
@ -0,0 +1,10 @@
|
||||
server {
|
||||
listen 80 default_server;
|
||||
server_name install.abra.autonomic.zone;
|
||||
|
||||
location / {
|
||||
root /var/www/abra-installer;
|
||||
add_header Content-Type text/plain;
|
||||
index installer;
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
install_docker() {
|
||||
echo "install_docker: TODO"
|
||||
}
|
||||
init_swarm() {
|
||||
echo "init_swarm: TODO"
|
||||
}
|
||||
|
||||
run_installation() {
|
||||
install_docker
|
||||
init_swarm
|
||||
}
|
||||
|
||||
run_installation
|
||||
exit 0
|
@ -1,7 +0,0 @@
|
||||
---
|
||||
name: mystack
|
||||
secrets:
|
||||
foo:
|
||||
bar:
|
||||
baz:
|
||||
length: 128
|
17
tests/01_environment.bats
Normal file
17
tests/01_environment.bats
Normal file
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
@test "docker is available" {
|
||||
command -v docker
|
||||
}
|
||||
|
||||
@test "abra is executable" {
|
||||
./abra --help
|
||||
}
|
||||
|
||||
@test "git is available" {
|
||||
command -v git
|
||||
}
|
||||
|
||||
@test "running in a container" {
|
||||
ls /etc/alpine-release
|
||||
}
|
49
tests/02_abra.bats
Normal file
49
tests/02_abra.bats
Normal file
@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
setup() {
|
||||
mkdir -p ~/.abra/servers/default
|
||||
}
|
||||
|
||||
teardown() {
|
||||
rm -rf ~/.abra/servers/default
|
||||
rm -rf ~/.abra/servers/swarm.test.com
|
||||
}
|
||||
|
||||
@test "abra server add/rm works" {
|
||||
./abra server add swarm.test.com
|
||||
docker context ls | grep swarm.test.com
|
||||
[ -d ~/.abra/servers/swarm.test.com ]
|
||||
./abra server rm swarm.test.com
|
||||
|
||||
./abra server add swarm.test.com foobar 12345
|
||||
[ -d ~/.abra/servers/swarm.test.com ]
|
||||
./abra server rm swarm.test.com
|
||||
}
|
||||
|
||||
@test "abra app new/rm works" {
|
||||
./abra app new --server default --domain traefik.test.com traefik
|
||||
[ -f ~/.abra/servers/default/traefik.test.com.env ]
|
||||
|
||||
# interactive prompt
|
||||
echo "y" | ./abra app traefik.test.com delete
|
||||
[ ! -f ~/.abra/servers/default/traefik.test.com.env ]
|
||||
|
||||
# --force
|
||||
./abra app new --server default --domain traefik.test.com traefik
|
||||
./abra app traefik.test.com delete --force
|
||||
[ ! -f ~/.abra/servers/default/traefik.test.com.env ]
|
||||
}
|
||||
|
||||
@test "abra app <domain> secret (insert|generate|rm)" {
|
||||
# TODO 3wc: mock `server new` so we don't endlessly re-test it
|
||||
./abra app new --server default --domain 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