Compare commits

...

22 Commits

Author SHA1 Message Date
34775f306b Merge branch 'main' into merge-logging
All checks were successful
continuous-integration/drone/pr Build is passing
2020-12-30 11:21:03 +01:00
375a4dd29d Re-add require_app_latest for custom commands
All checks were successful
continuous-integration/drone/push Build is passing
Revision of 67cce192df.

See https://git.autonomic.zone/coop-cloud/abra/pulls/54#issuecomment-2300.
2020-12-30 11:19:55 +01:00
2b951e9f54 Mark minor
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-30 11:18:32 +01:00
3wc
01184c313a Add missing CHANGELOG entries
All checks were successful
continuous-integration/drone/push Build is passing
Closes #46
2020-12-30 00:43:52 +02:00
3936d6afc0 Merge logs/multilogs and avoid multitail external
All checks were successful
continuous-integration/drone/pr Build is passing
2020-12-29 23:22:46 +01:00
407744827f Add change log entry for #42
All checks were successful
continuous-integration/drone/push Build is passing
See https://git.autonomic.zone/coop-cloud/abra/issues/42.
2020-12-29 17:11:30 +01:00
b634b4c668 Merge pull request 'Make sure to git pull latest changes on ~/.abra/apps side' (#54) from latest-checks into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/abra/pulls/54
2020-12-29 17:10:16 +01:00
67cce192df Don't do more cloning that necessary
All checks were successful
continuous-integration/drone/pr Build is passing
2020-12-29 17:06:49 +01:00
3a9e141b24 Pull latest changes
Closes https://git.autonomic.zone/coop-cloud/abra/issues/42.
2020-12-29 17:06:32 +01:00
ebfe7ca4e8 Suppress output of clone and do better logging 2020-12-29 17:05:30 +01:00
fff2fbe819 Prepare function name for new functionality 2020-12-29 17:05:00 +01:00
f213c3df5f Follow convention and show type of message 2020-12-29 17:04:17 +01:00
9b1be33018 Mark as quote and not as entry
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-29 15:11:15 +01:00
6ecf4f287a Add missing )
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-29 15:10:57 +01:00
e1d6ff8b73 Add docs link
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-29 15:10:05 +01:00
07d4815a74 Start 0.5.0 change log
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-29 15:08:42 +01:00
33315f6b43 Merge pull request '<app> -> <type>' (#53) from app-goes-to-type into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/abra/pulls/53
2020-12-29 15:03:43 +01:00
f017324431 <app> -> <type>
All checks were successful
continuous-integration/drone/pr Build is passing
Closes https://git.autonomic.zone/coop-cloud/abra/issues/48.
2020-12-29 14:56:50 +01:00
4339c91cf3 Merge pull request 'Remove abra server use' (#52) from server-use-remove into main
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/abra/pulls/52
2020-12-29 14:26:39 +01:00
592f515ec4 Remove abra server use
All checks were successful
continuous-integration/drone/pr Build is passing
2020-12-29 14:24:50 +01:00
3wc
77ba5652b2 Run "check" during "deploy", + "--skip-check"
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-29 11:15:14 +02:00
3wc
fdf6334ed3 Use temporary ABRA_DIr in tests
All checks were successful
continuous-integration/drone/push Build is passing
2020-12-27 21:53:44 +02:00
4 changed files with 155 additions and 139 deletions

View File

@ -1,6 +1,21 @@
# abra x.x.x (UNRELEASED) # abra x.x.x (UNRELEASED)
- ??? - 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 ([77ba5652b2fe15820f5edfa0f642636f7b8eae7e](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))
# 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) # abra 0.3.1 (2020-09-27)
@ -8,7 +23,7 @@
# abra 0.3.0 (2020-09-27) # abra 0.3.0 (2020-09-27)
- Add multilogs stack logs implementation ([#8](https://git.autonomic.zone/compose-stacks/abra/issues/8) - Add multilogs stack logs implementation ([#8](https://git.autonomic.zone/compose-stacks/abra/issues/8))
- Add beginnings of "monorepo" functionality - Add beginnings of "monorepo" functionality
# abra 0.2.0 (2020-09-24) # abra 0.2.0 (2020-09-24)

View File

@ -7,6 +7,10 @@
The cooperative cloud utility belt 🎩🐇 The cooperative cloud utility belt 🎩🐇
## Documentation
> [docs.cloud.autonomic.zone](https://docs.cloud.autonomic.zone/)
## Install ## Install
```sh ```sh

255
abra
View File

@ -11,14 +11,13 @@ DOC="
The cooperative cloud utility belt 🎩🐇 The cooperative cloud utility belt 🎩🐇
Usage: Usage:
abra [options] app new [--server=<server>] [--domain=<domain>] [--pass] [--auto] <app> abra [options] app new [--server=<server>] [--domain=<domain>] [--pass] [--auto] <type>
abra [options] app (list|ls) [--status] [--server=<server>] abra [options] app (list|ls) [--status] [--server=<server>]
abra [options] app <domain> deploy abra [options] app <domain> deploy [--skip-check]
abra [options] app <domain> undeploy abra [options] app <domain> undeploy
abra [options] app <domain> config abra [options] app <domain> config
abra [options] app <domain> (delete|rm) [--force] abra [options] app <domain> (delete|rm) [--force]
abra [options] app <domain> logs [<service>] abra [options] app <domain> logs [<service>]
abra [options] app <domain> multilogs
abra [options] app <domain> cp <src> <dst> abra [options] app <domain> cp <src> <dst>
abra [options] app <domain> check abra [options] app <domain> check
abra [options] app <domain> ps abra [options] app <domain> ps
@ -32,7 +31,6 @@ Usage:
abra [options] server add <host> [<user>] [<port>] abra [options] server add <host> [<user>] [<port>]
abra [options] server (list|ls) abra [options] server (list|ls)
abra [options] server <host> rm abra [options] server <host> rm
abra [options] server <host> use
abra [options] server <host> init abra [options] server <host> init
abra [options] server <host> apps [--status] abra [options] server <host> apps [--status]
abra [options] upgrade abra [options] upgrade
@ -145,91 +143,91 @@ eval "var_$1+=($value)"; else eval "var_$1=$value"; fi; return 0; fi; done
return 1; }; stdout() { printf -- "cat <<'EOM'\n%s\nEOM\n" "$1"; }; stderr() { return 1; }; stdout() { printf -- "cat <<'EOM'\n%s\nEOM\n" "$1"; }; stderr() {
printf -- "cat <<'EOM' >&2\n%s\nEOM\n" "$1"; }; error() { printf -- "cat <<'EOM' >&2\n%s\nEOM\n" "$1"; }; error() {
[[ -n $1 ]] && stderr "$1"; stderr "$usage"; _return 1; }; _return() { [[ -n $1 ]] && stderr "$1"; stderr "$usage"; _return 1; }; _return() {
printf -- "exit %d\n" "$1"; exit "$1"; }; set -e; trimmed_doc=${DOC:1:1579} printf -- "exit %d\n" "$1"; exit "$1"; }; set -e; trimmed_doc=${DOC:1:1520}
usage=${DOC:40:1271}; digest=974cf usage=${DOC:40:1212}; digest=7df47
shorts=(-h -e -s -v '' '' '' '' '' '' '' '' '') shorts=(-e -h -v -s '' '' '' '' '' '' '' '' '' '')
longs=(--help --env --stack --version --server --domain --pass --auto --status --force --no-tty --user --all) longs=(--env --help --version --stack --server --domain --pass --auto --status --skip-check --force --no-tty --user --all)
argcounts=(0 1 1 0 1 1 0 0 0 0 0 1 0); node_0(){ switch __help 0; }; node_1(){ argcounts=(1 0 0 1 1 1 0 0 0 0 0 0 1 0); node_0(){ value __env 0; }; node_1(){
value __env 1; }; node_2(){ value __stack 2; }; node_3(){ switch __version 3; } switch __help 1; }; node_2(){ switch __version 2; }; node_3(){ value __stack 3
node_4(){ value __server 4; }; node_5(){ value __domain 5; }; node_6(){ }; node_4(){ value __server 4; }; node_5(){ value __domain 5; }; node_6(){
switch __pass 6; }; node_7(){ switch __auto 7; }; node_8(){ switch __status 8; } switch __pass 6; }; node_7(){ switch __auto 7; }; node_8(){ switch __status 8; }
node_9(){ switch __force 9; }; node_10(){ switch __no_tty 10; }; node_11(){ node_9(){ switch __skip_check 9; }; node_10(){ switch __force 10; }; node_11(){
value __user 11; }; node_12(){ switch __all 12; }; node_13(){ value _app_ a; } switch __no_tty 11; }; node_12(){ value __user 12; }; node_13(){ switch __all 13
node_14(){ value _domain_ a; }; node_15(){ value _service_ a; }; node_16(){ }; node_14(){ value _type_ a; }; node_15(){ value _domain_ a; }; node_16(){
value _src_ a; }; node_17(){ value _dst_ a; }; node_18(){ value _args_ a true; } value _service_ a; }; node_17(){ value _src_ a; }; node_18(){ value _dst_ a; }
node_19(){ value _secret_ a; }; node_20(){ value _version_ a; }; node_21(){ node_19(){ value _args_ a true; }; node_20(){ value _secret_ a; }; node_21(){
value _cmd_ a; }; node_22(){ value _data_ a; }; node_23(){ value _command_ a; } value _version_ a; }; node_22(){ value _cmd_ a; }; node_23(){ value _data_ a; }
node_24(){ value _host_ a; }; node_25(){ value _user_ a; }; node_26(){ node_24(){ value _command_ a; }; node_25(){ value _host_ a; }; node_26(){
value _port_ a; }; node_27(){ _command app; }; node_28(){ _command new; } value _user_ a; }; node_27(){ value _port_ a; }; node_28(){ _command app; }
node_29(){ _command list; }; node_30(){ _command ls; }; node_31(){ node_29(){ _command new; }; node_30(){ _command list; }; node_31(){ _command ls
_command deploy; }; node_32(){ _command undeploy; }; node_33(){ _command config }; node_32(){ _command deploy; }; node_33(){ _command undeploy; }; node_34(){
}; node_34(){ _command delete; }; node_35(){ _command rm; }; node_36(){ _command config; }; node_35(){ _command delete; }; node_36(){ _command rm; }
_command logs; }; node_37(){ _command multilogs; }; node_38(){ _command cp; } node_37(){ _command logs; }; node_38(){ _command cp; }; node_39(){
node_39(){ _command check; }; node_40(){ _command ps; }; node_41(){ _command run _command check; }; node_40(){ _command ps; }; node_41(){ _command run; }
}; node_42(){ _command secret; }; node_43(){ _command auto; }; node_44(){ node_42(){ _command secret; }; node_43(){ _command auto; }; node_44(){
_command generate; }; node_45(){ _command insert; }; node_46(){ _command server _command generate; }; node_45(){ _command insert; }; node_46(){ _command server
}; node_47(){ _command add; }; node_48(){ _command use; }; node_49(){ }; node_47(){ _command add; }; node_48(){ _command init; }; node_49(){
_command init; }; node_50(){ _command apps; }; node_51(){ _command upgrade; } _command apps; }; node_50(){ _command upgrade; }; node_51(){ optional 0 1 2 3; }
node_52(){ optional 0 1 2 3; }; node_53(){ optional 52; }; node_54(){ optional 4 node_52(){ optional 51; }; node_53(){ optional 4; }; node_54(){ optional 5; }
}; node_55(){ optional 5; }; node_56(){ optional 6; }; node_57(){ optional 7; } node_55(){ optional 6; }; node_56(){ optional 7; }; node_57(){
node_58(){ required 53 27 28 54 55 56 57 13; }; node_59(){ either 29 30; } required 52 28 29 53 54 55 56 14; }; node_58(){ either 30 31; }; node_59(){
node_60(){ required 59; }; node_61(){ optional 8; }; node_62(){ required 58; }; node_60(){ optional 8; }; node_61(){ required 52 28 59 60 53; }
required 53 27 60 61 54; }; node_63(){ required 53 27 14 31; }; node_64(){ node_62(){ optional 9; }; node_63(){ required 52 28 15 32 62; }; node_64(){
required 53 27 14 32; }; node_65(){ required 53 27 14 33; }; node_66(){ required 52 28 15 33; }; node_65(){ required 52 28 15 34; }; node_66(){
either 34 35; }; node_67(){ required 66; }; node_68(){ optional 9; }; node_69(){ either 35 36; }; node_67(){ required 66; }; node_68(){ optional 10; }
required 53 27 14 67 68; }; node_70(){ optional 15; }; node_71(){ node_69(){ required 52 28 15 67 68; }; node_70(){ optional 16; }; node_71(){
required 53 27 14 36 70; }; node_72(){ required 53 27 14 37; }; node_73(){ required 52 28 15 37 70; }; node_72(){ required 52 28 15 38 17 18; }; node_73(){
required 53 27 14 38 16 17; }; node_74(){ required 53 27 14 39; }; node_75(){ required 52 28 15 39; }; node_74(){ required 52 28 15 40; }; node_75(){
required 53 27 14 40; }; node_76(){ optional 10; }; node_77(){ optional 11; } optional 11; }; node_76(){ optional 12; }; node_77(){ oneormore 19; }
node_78(){ oneormore 18; }; node_79(){ required 53 27 14 41 76 77 15 78; } node_78(){ required 52 28 15 41 75 76 16 77; }; node_79(){
node_80(){ required 53 27 14 41 15 78; }; node_81(){ required 53 27 14 42 43 56 required 52 28 15 41 16 77; }; node_80(){ required 52 28 15 42 43 55; }
}; node_82(){ optional 21; }; node_83(){ required 53 27 14 42 44 19 20 82 56; } node_81(){ optional 22; }; node_82(){ required 52 28 15 42 44 20 21 81 55; }
node_84(){ required 53 27 14 42 45 19 20 22 56; }; node_85(){ either 19 12; } node_83(){ required 52 28 15 42 45 20 21 23 55; }; node_84(){ either 20 13; }
node_86(){ required 85; }; node_87(){ required 53 27 14 42 67 86 56 68; } node_85(){ required 84; }; node_86(){ required 52 28 15 42 67 85 55 68; }
node_88(){ optional 78; }; node_89(){ required 53 27 14 23 88; }; node_90(){ node_87(){ optional 77; }; node_88(){ required 52 28 15 24 87; }; node_89(){
optional 25; }; node_91(){ optional 26; }; node_92(){ required 53 46 47 24 90 91 optional 26; }; node_90(){ optional 27; }; node_91(){ required 52 46 47 25 89 90
}; node_93(){ required 53 46 60; }; node_94(){ required 53 46 24 35; } }; node_92(){ required 52 46 59; }; node_93(){ required 52 46 25 36; }
node_95(){ required 53 46 24 48; }; node_96(){ required 53 46 24 49; } node_94(){ required 52 46 25 48; }; node_95(){ required 52 46 25 49 60; }
node_97(){ required 53 46 24 50 61; }; node_98(){ required 53 51; }; node_99(){ node_96(){ required 52 50; }; node_97(){
either 58 62 63 64 65 69 71 72 73 74 75 79 80 81 83 84 87 89 92 93 94 95 96 97 98 either 57 61 63 64 65 69 71 72 73 74 78 79 80 82 83 86 88 91 92 93 94 95 96; }
}; node_100(){ required 99; }; cat <<<' docopt_exit() { node_98(){ required 97; }; cat <<<' docopt_exit() {
[[ -n $1 ]] && printf "%s\n" "$1" >&2; printf "%s\n" "${DOC:40:1271}" >&2 [[ -n $1 ]] && printf "%s\n" "$1" >&2; printf "%s\n" "${DOC:40:1212}" >&2
exit 1; }'; unset var___help var___env var___stack var___version var___server \ exit 1; }'; unset var___env var___help var___version var___stack var___server \
var___domain var___pass var___auto var___status var___force var___no_tty \ var___domain var___pass var___auto var___status var___skip_check var___force \
var___user var___all var__app_ var__domain_ var__service_ var__src_ var__dst_ \ var___no_tty var___user var___all var__type_ var__domain_ var__service_ \
var__args_ var__secret_ var__version_ var__cmd_ var__data_ var__command_ \ var__src_ var__dst_ var__args_ var__secret_ var__version_ var__cmd_ var__data_ \
var__host_ var__user_ var__port_ var_app var_new var_list var_ls var_deploy \ var__command_ var__host_ var__user_ var__port_ var_app var_new var_list var_ls \
var_undeploy var_config var_delete var_rm var_logs var_multilogs var_cp \ var_deploy var_undeploy var_config var_delete var_rm var_logs var_cp var_check \
var_check var_ps var_run var_secret var_auto var_generate var_insert \ var_ps var_run var_secret var_auto var_generate var_insert var_server var_add \
var_server var_add var_use var_init var_apps var_upgrade; parse 100 "$@" var_init var_apps var_upgrade; parse 98 "$@"; local prefix=${DOCOPT_PREFIX:-''}
local prefix=${DOCOPT_PREFIX:-''}; unset "${prefix}__help" "${prefix}__env" \ unset "${prefix}__env" "${prefix}__help" "${prefix}__version" \
"${prefix}__stack" "${prefix}__version" "${prefix}__server" \ "${prefix}__stack" "${prefix}__server" "${prefix}__domain" "${prefix}__pass" \
"${prefix}__domain" "${prefix}__pass" "${prefix}__auto" "${prefix}__status" \ "${prefix}__auto" "${prefix}__status" "${prefix}__skip_check" \
"${prefix}__force" "${prefix}__no_tty" "${prefix}__user" "${prefix}__all" \ "${prefix}__force" "${prefix}__no_tty" "${prefix}__user" "${prefix}__all" \
"${prefix}_app_" "${prefix}_domain_" "${prefix}_service_" "${prefix}_src_" \ "${prefix}_type_" "${prefix}_domain_" "${prefix}_service_" "${prefix}_src_" \
"${prefix}_dst_" "${prefix}_args_" "${prefix}_secret_" "${prefix}_version_" \ "${prefix}_dst_" "${prefix}_args_" "${prefix}_secret_" "${prefix}_version_" \
"${prefix}_cmd_" "${prefix}_data_" "${prefix}_command_" "${prefix}_host_" \ "${prefix}_cmd_" "${prefix}_data_" "${prefix}_command_" "${prefix}_host_" \
"${prefix}_user_" "${prefix}_port_" "${prefix}app" "${prefix}new" \ "${prefix}_user_" "${prefix}_port_" "${prefix}app" "${prefix}new" \
"${prefix}list" "${prefix}ls" "${prefix}deploy" "${prefix}undeploy" \ "${prefix}list" "${prefix}ls" "${prefix}deploy" "${prefix}undeploy" \
"${prefix}config" "${prefix}delete" "${prefix}rm" "${prefix}logs" \ "${prefix}config" "${prefix}delete" "${prefix}rm" "${prefix}logs" \
"${prefix}multilogs" "${prefix}cp" "${prefix}check" "${prefix}ps" \ "${prefix}cp" "${prefix}check" "${prefix}ps" "${prefix}run" "${prefix}secret" \
"${prefix}run" "${prefix}secret" "${prefix}auto" "${prefix}generate" \ "${prefix}auto" "${prefix}generate" "${prefix}insert" "${prefix}server" \
"${prefix}insert" "${prefix}server" "${prefix}add" "${prefix}use" \ "${prefix}add" "${prefix}init" "${prefix}apps" "${prefix}upgrade"
"${prefix}init" "${prefix}apps" "${prefix}upgrade"
eval "${prefix}"'__help=${var___help:-false}'
eval "${prefix}"'__env=${var___env:-}' eval "${prefix}"'__env=${var___env:-}'
eval "${prefix}"'__stack=${var___stack:-}' eval "${prefix}"'__help=${var___help:-false}'
eval "${prefix}"'__version=${var___version:-false}' eval "${prefix}"'__version=${var___version:-false}'
eval "${prefix}"'__stack=${var___stack:-}'
eval "${prefix}"'__server=${var___server:-}' eval "${prefix}"'__server=${var___server:-}'
eval "${prefix}"'__domain=${var___domain:-}' eval "${prefix}"'__domain=${var___domain:-}'
eval "${prefix}"'__pass=${var___pass:-false}' eval "${prefix}"'__pass=${var___pass:-false}'
eval "${prefix}"'__auto=${var___auto:-false}' eval "${prefix}"'__auto=${var___auto:-false}'
eval "${prefix}"'__status=${var___status:-false}' eval "${prefix}"'__status=${var___status:-false}'
eval "${prefix}"'__skip_check=${var___skip_check:-false}'
eval "${prefix}"'__force=${var___force:-false}' eval "${prefix}"'__force=${var___force:-false}'
eval "${prefix}"'__no_tty=${var___no_tty:-false}' eval "${prefix}"'__no_tty=${var___no_tty:-false}'
eval "${prefix}"'__user=${var___user:-}' eval "${prefix}"'__user=${var___user:-}'
eval "${prefix}"'__all=${var___all:-false}' eval "${prefix}"'__all=${var___all:-false}'
eval "${prefix}"'_app_=${var__app_:-}' eval "${prefix}"'_type_=${var__type_:-}'
eval "${prefix}"'_domain_=${var__domain_:-}' eval "${prefix}"'_domain_=${var__domain_:-}'
eval "${prefix}"'_service_=${var__service_:-}' eval "${prefix}"'_service_=${var__service_:-}'
eval "${prefix}"'_src_=${var__src_:-}'; eval "${prefix}"'_dst_=${var__dst_:-}' eval "${prefix}"'_src_=${var__src_:-}'; eval "${prefix}"'_dst_=${var__dst_:-}'
@ -249,7 +247,6 @@ eval "${prefix}"'undeploy=${var_undeploy:-false}'
eval "${prefix}"'config=${var_config:-false}' eval "${prefix}"'config=${var_config:-false}'
eval "${prefix}"'delete=${var_delete:-false}' eval "${prefix}"'delete=${var_delete:-false}'
eval "${prefix}"'rm=${var_rm:-false}'; eval "${prefix}"'logs=${var_logs:-false}' eval "${prefix}"'rm=${var_rm:-false}'; eval "${prefix}"'logs=${var_logs:-false}'
eval "${prefix}"'multilogs=${var_multilogs:-false}'
eval "${prefix}"'cp=${var_cp:-false}' eval "${prefix}"'cp=${var_cp:-false}'
eval "${prefix}"'check=${var_check:-false}' eval "${prefix}"'check=${var_check:-false}'
eval "${prefix}"'ps=${var_ps:-false}'; eval "${prefix}"'run=${var_run:-false}' eval "${prefix}"'ps=${var_ps:-false}'; eval "${prefix}"'run=${var_run:-false}'
@ -258,24 +255,24 @@ eval "${prefix}"'auto=${var_auto:-false}'
eval "${prefix}"'generate=${var_generate:-false}' eval "${prefix}"'generate=${var_generate:-false}'
eval "${prefix}"'insert=${var_insert:-false}' eval "${prefix}"'insert=${var_insert:-false}'
eval "${prefix}"'server=${var_server:-false}' eval "${prefix}"'server=${var_server:-false}'
eval "${prefix}"'add=${var_add:-false}'; eval "${prefix}"'use=${var_use:-false}' eval "${prefix}"'add=${var_add:-false}'
eval "${prefix}"'init=${var_init:-false}' eval "${prefix}"'init=${var_init:-false}'
eval "${prefix}"'apps=${var_apps:-false}' eval "${prefix}"'apps=${var_apps:-false}'
eval "${prefix}"'upgrade=${var_upgrade:-false}'; local docopt_i=1 eval "${prefix}"'upgrade=${var_upgrade:-false}'; local docopt_i=1
[[ $BASH_VERSION =~ ^4.3 ]] && docopt_i=2; for ((;docopt_i>0;docopt_i--)); do [[ $BASH_VERSION =~ ^4.3 ]] && docopt_i=2; for ((;docopt_i>0;docopt_i--)); do
declare -p "${prefix}__help" "${prefix}__env" "${prefix}__stack" \ declare -p "${prefix}__env" "${prefix}__help" "${prefix}__version" \
"${prefix}__version" "${prefix}__server" "${prefix}__domain" "${prefix}__pass" \ "${prefix}__stack" "${prefix}__server" "${prefix}__domain" "${prefix}__pass" \
"${prefix}__auto" "${prefix}__status" "${prefix}__force" "${prefix}__no_tty" \ "${prefix}__auto" "${prefix}__status" "${prefix}__skip_check" \
"${prefix}__user" "${prefix}__all" "${prefix}_app_" "${prefix}_domain_" \ "${prefix}__force" "${prefix}__no_tty" "${prefix}__user" "${prefix}__all" \
"${prefix}_service_" "${prefix}_src_" "${prefix}_dst_" "${prefix}_args_" \ "${prefix}_type_" "${prefix}_domain_" "${prefix}_service_" "${prefix}_src_" \
"${prefix}_secret_" "${prefix}_version_" "${prefix}_cmd_" "${prefix}_data_" \ "${prefix}_dst_" "${prefix}_args_" "${prefix}_secret_" "${prefix}_version_" \
"${prefix}_command_" "${prefix}_host_" "${prefix}_user_" "${prefix}_port_" \ "${prefix}_cmd_" "${prefix}_data_" "${prefix}_command_" "${prefix}_host_" \
"${prefix}app" "${prefix}new" "${prefix}list" "${prefix}ls" "${prefix}deploy" \ "${prefix}_user_" "${prefix}_port_" "${prefix}app" "${prefix}new" \
"${prefix}undeploy" "${prefix}config" "${prefix}delete" "${prefix}rm" \ "${prefix}list" "${prefix}ls" "${prefix}deploy" "${prefix}undeploy" \
"${prefix}logs" "${prefix}multilogs" "${prefix}cp" "${prefix}check" \ "${prefix}config" "${prefix}delete" "${prefix}rm" "${prefix}logs" \
"${prefix}ps" "${prefix}run" "${prefix}secret" "${prefix}auto" \ "${prefix}cp" "${prefix}check" "${prefix}ps" "${prefix}run" "${prefix}secret" \
"${prefix}generate" "${prefix}insert" "${prefix}server" "${prefix}add" \ "${prefix}auto" "${prefix}generate" "${prefix}insert" "${prefix}server" \
"${prefix}use" "${prefix}init" "${prefix}apps" "${prefix}upgrade"; done; } "${prefix}add" "${prefix}init" "${prefix}apps" "${prefix}upgrade"; done; }
# docopt parser above, complete command for generating this parser is `docopt.sh abra` # docopt parser above, complete command for generating this parser is `docopt.sh abra`
PROGRAM_NAME=$(basename "$0") PROGRAM_NAME=$(basename "$0")
@ -296,7 +293,7 @@ warning() {
} }
success() { success() {
echo "$(tput setaf 2)$*$(tput sgr0)" echo "$(tput setaf 2)SUCCESS: $*$(tput sgr0)"
} }
###### Default settings ###### Default settings
@ -323,16 +320,19 @@ require_stack() {
fi fi
} }
require_app_clone() { require_app_latest() {
APP="$1" APP="$1"
APP_DIR="$ABRA_DIR/apps/$APP" APP_DIR="$ABRA_DIR/apps/$APP"
if [ ! -d "$APP_DIR" ]; then if [ ! -d "$APP_DIR" ]; then
warning "'$APP' not found, fetching via git.." warning "The app type '$APP' was not found, fetching via Git"
if ! git clone "$GIT_URL/$APP.git" "$ABRA_DIR/apps/$APP"; then if ! git clone "$GIT_URL/$APP.git" "$ABRA_DIR/apps/$APP" > /dev/null 2>&1 ; then
error "Could not retrieve '$APP', this app doesn't exist?" error "Could not retrieve app type '$APP', this app type doesn't exist?"
fi fi
success "Fetched app configuration via Git"
fi fi
cd "$APP_DIR" && git pull > /dev/null 2>&1
} }
# FIXME 3wc: update or remove # FIXME 3wc: update or remove
@ -351,8 +351,7 @@ load_custom_commands() {
if [ -n "$abra__domain_" ]; then if [ -n "$abra__domain_" ]; then
load_instance load_instance
load_instance_env load_instance_env
require_app_latest "$APP"
require_app_clone "$APP"
fi fi
if [ -f "$APP_DIR/abra-commands.sh" ]; then if [ -f "$APP_DIR/abra-commands.sh" ]; then
@ -453,6 +452,22 @@ parse_secret() {
sub_app_secret_generate sub_app_secret_generate
} }
stack_logs (){
# Note(decentral1se): see https://github.com/moby/moby/issues/31458#issuecomment-617871046
STACK="$1"
services=$(docker stack services "${STACK}" --format "{{.ID}}")
# shellcheck disable=SC2154
trap 'jobs=$(jobs -p) && test -n "$jobs" && kill $jobs' EXIT
for item in ${services//\\n/$'\n'}; do
docker service logs -f -t --tail 10 "$item" &
done
sleep infinity
}
####################################### #######################################
# abra app .. # abra app ..
####################################### #######################################
@ -530,11 +545,15 @@ sub_app_new (){
require_abra_dir require_abra_dir
get_servers get_servers
APP=$abra__app_ # Note(decentral1se): we are overloading the use of the word "app" on this
# the interface and therefore try to use the word "type" to refer to "a type
# of app" vs. "an instance of an app"
APP=$abra__type_
SERVER=$abra___server SERVER=$abra___server
DOMAIN=$abra___domain DOMAIN=$abra___domain
require_app_clone "$APP" require_app_latest "$APP"
if [ -z "$SERVER" ]; then if [ -z "$SERVER" ]; then
echo "Where would you like to put $APP?" echo "Where would you like to put $APP?"
@ -590,7 +609,11 @@ sub_app_deploy (){
load_instance load_instance
load_instance_env load_instance_env
require_app_clone "$APP" require_app_latest "$APP"
if [ "$abra___skip_check" == "false" ]; then
sub_app_check
fi
echo "About to deploy:" echo "About to deploy:"
echo " Server: $(tput setaf 4)${SERVER}$(tput sgr0)" echo " Server: $(tput setaf 4)${SERVER}$(tput sgr0)"
@ -612,7 +635,6 @@ sub_app_deploy (){
prompt_confirm prompt_confirm
APP=$(basename "$APP_DIR") APP=$(basename "$APP_DIR")
require_app_clone "$APP"
( (
cd "$APP_DIR" || error "\$APP_DIR '$APP_DIR' not found" cd "$APP_DIR" || error "\$APP_DIR '$APP_DIR' not found"
@ -652,15 +674,17 @@ sub_app_check (){
load_instance load_instance
load_instance_env load_instance_env
APP_ENV=$(grep -v '^#' "$ENV_FILE" | sed 's/^.* \([^=]\+\)=.*/\1/' | sort) #APP_ENV=$(grep -v '^#' "$ENV_FILE" | sed 's/^.* \([^=]\+\)=.*/\1/' | sort)
STACK_ENV=$(grep -v '^#' "$APP_DIR/.envrc.sample" | sed 's/^.* \([^=]\+\)=.*/\1/' | sort) APP_ENV=$(grep -v '^#' "$ENV_FILE" | cut -d' ' -f2 | cut -d'=' -f1 | sort)
#STACK_ENV=$(grep -v '^#' "$APP_DIR/.envrc.sample" | sed 's/^.* \([^=]\+\)=.*/\1/' | sort)
STACK_ENV=$(grep -v '^#' "$APP_DIR/.envrc.sample" | cut -d' ' -f2 | cut -d'=' -f1 | sort)
# Only show "1", items in STACK_ENV which aren't in APP_ENV # Only show "1", items in STACK_ENV which aren't in APP_ENV
MISSING_VARS=$(comm -23 <(echo "$STACK_ENV") <(echo "$APP_ENV")) MISSING_VARS=$(comm -23 <(echo "$STACK_ENV") <(echo "$APP_ENV"))
if [ -z "$MISSING_VARS" ]; then if [ -z "$MISSING_VARS" ]; then
success "Yay! All the necessary basic variables are defined" success "Yay! All the necessary basic variables are defined"
exit 0 return 0
fi fi
error "Found missing variables: $MISSING_VARS" error "Found missing variables: $MISSING_VARS"
@ -824,27 +848,6 @@ sub_app_run(){
return return
} }
###### .. app <domain> multilogs
sub_app_multilogs() {
# Inspired by https://github.com/moby/moby/issues/31458#issuecomment-475411564
require_multitail
load_instance
load_instance_env
# Get a list of the service names
SERVICES=$(docker stack services --format "{{.Name}}" "${STACK_NAME}")
# Sort the service names
SERVICES=$(echo "${SERVICES}" | sort)
# Create the command to run
COMMAND='multitail --mergeall'
for SERVICE in ${SERVICES}; do
COMMAND="${COMMAND} -L 'docker service logs --tail 20 -f ${SERVICE}'"
done
# Run the command
bash -c "${COMMAND}"
}
###### .. app <domain> logs <service> <args>... ###### .. app <domain> logs <service> <args>...
sub_app_logs (){ sub_app_logs (){
load_instance load_instance
@ -853,8 +856,7 @@ sub_app_logs (){
SERVICE="${abra__service_}" SERVICE="${abra__service_}"
if [ -z "$SERVICE" ]; then if [ -z "$SERVICE" ]; then
warning "No \$SERVICE provided, running multilogs" stack_logs "${STACK_NAME}"
sub_app_multilogs
return return
fi fi
@ -969,11 +971,6 @@ sub_server_delete() {
docker context rm "$abra__host_" docker context rm "$abra__host_"
} }
###### .. server <host> use
sub_server_use() {
docker context use "$abra__host_"
}
###### .. server <host> apps ###### .. server <host> apps
sub_server_apps() { sub_server_apps() {
abra___server="$abra__host_" abra___server="$abra__host_"
@ -1016,9 +1013,9 @@ abra() {
# the place to handle the dynamically-defined vars # the place to handle the dynamically-defined vars
declare abra___stack abra___env abra__command_ abra__args_ \ declare abra___stack abra___env abra__command_ abra__args_ \
abra__secret_ abra__version_ abra__data_ abra___user abra__host_ \ abra__secret_ abra__version_ abra__data_ abra___user abra__host_ \
abra__app_ abra__port_ abra__user_ abra__service_ abra__src_ abra__dst_ \ abra__type_ abra__port_ abra__user_ abra__service_ abra__src_ abra__dst_ \
abra__domain_ abra___server abra___domain abra___force abra___pass \ abra__domain_ abra___server abra___domain abra___force abra___pass \
abra___auto abra___status abra___no_tty abra___auto abra___status abra___no_tty abra___skip_check
if ! type tput > /dev/null 2>&1; then if ! type tput > /dev/null 2>&1; then
tput() { tput() {

View File

@ -1,37 +1,37 @@
#!/usr/bin/env bats #!/usr/bin/env bats
setup() { setup() {
mkdir -p ~/.abra/servers/default export ABRA_DIR=$(mktemp -d)
mkdir -p $ABRA_DIR/servers/default
} }
teardown() { teardown() {
rm -rf ~/.abra/servers/default rm -rf "$ABRA_DIR"
rm -rf ~/.abra/servers/swarm.test.com
} }
@test "abra server add/rm works" { @test "abra server add/rm works" {
./abra server add swarm.test.com ./abra server add swarm.test.com
docker context ls | grep swarm.test.com docker context ls | grep swarm.test.com
[ -d ~/.abra/servers/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/servers/swarm.test.com ] [ -d $ABRA_DIR/servers/swarm.test.com ]
./abra server swarm.test.com rm ./abra server swarm.test.com rm
} }
@test "abra app new/rm works" { @test "abra app new/rm works" {
./abra app new --server default --domain traefik.test.com traefik ./abra app new --server default --domain traefik.test.com traefik
[ -f ~/.abra/servers/default/traefik.test.com.env ] [ -f $ABRA_DIR/servers/default/traefik.test.com.env ]
# interactive prompt # interactive prompt
echo "y" | ./abra app traefik.test.com delete echo "y" | ./abra app traefik.test.com delete
[ ! -f ~/.abra/servers/default/traefik.test.com.env ] [ ! -f $ABRA_DIR/servers/default/traefik.test.com.env ]
# --force # --force
./abra app new --server default --domain traefik.test.com traefik ./abra app new --server default --domain traefik.test.com traefik
./abra app traefik.test.com delete --force ./abra app traefik.test.com delete --force
[ ! -f ~/.abra/servers/default/traefik.test.com.env ] [ ! -f $ABRA_DIR/servers/default/traefik.test.com.env ]
} }
@test "abra app <domain> secret (insert|generate|rm)" { @test "abra app <domain> secret (insert|generate|rm)" {