Compare commits
138 Commits
Author | SHA1 | Date |
---|---|---|
decentral1se | e6f4e942a2 | |
decentral1se | 419e893968 | |
decentral1se | 4529c05d2b | |
decentral1se | 32b11c9bee | |
decentral1se | f1c1f25741 | |
decentral1se | a515198b9f | |
roxxers | 55138b7e0f | |
3wc | 78ab592209 | |
3wc | fdbbe93679 | |
3wc | cfdf7f82f6 | |
3wc | f69e155d27 | |
3wc | 9b7674c6d4 | |
3wc | 1c820c70fb | |
3wc | e92fa554d4 | |
3wc | 6ac14f55ca | |
3wc | 71820f7e0b | |
3wc | 207728e1be | |
decentral1se | 36e470c8e7 | |
decentral1se | 0096e0d30b | |
decentral1se | a636d2f17c | |
3wordchant | 179ed64e0f | |
nicksellen | 3ab85e4291 | |
decentral1se | e012de44d7 | |
decentral1se | edb7297e1f | |
3wc | 41e0b8bf12 | |
3wc | b694c37073 | |
3wc | 19041af9d5 | |
decentral1se | 7a1a436601 | |
decentral1se | 3d5d3ff3ac | |
3wc | 349b468140 | |
3wc | e982a45b5e | |
decentral1se | 9f835318d2 | |
decentral1se | 8f7997a70b | |
decentral1se | 035b05ca86 | |
decentral1se | 98cf63f7aa | |
decentral1se | 672df64011 | |
decentral1se | 0581559783 | |
decentral1se | cdd196346a | |
decentral1se | 78287fec37 | |
decentral1se | 4b820457de | |
decentral1se | 8519cb8661 | |
decentral1se | 3c30d3621b | |
decentral1se | 76a0badc5a | |
decentral1se | b2e0a95a11 | |
decentral1se | ace854e1d7 | |
decentral1se | bd7688f9e7 | |
decentral1se | d7a4c2cebe | |
decentral1se | d9a0922b2c | |
decentral1se | 32a86e0317 | |
decentral1se | b1c5391a91 | |
decentral1se | b813f6b90e | |
decentral1se | 73de76fc04 | |
decentral1se | 5c5cbbf20f | |
decentral1se | 19498d9494 | |
decentral1se | 6f6a9ab413 | |
decentral1se | aa81d26d08 | |
decentral1se | cc4efe69bf | |
decentral1se | 6c7b53f585 | |
decentral1se | 32bf28e7a9 | |
decentral1se | 624815e5b1 | |
decentral1se | e9fb9e56ad | |
decentral1se | 283eb21e29 | |
decentral1se | 92f49d56dd | |
decentral1se | d9ff48b55b | |
decentral1se | 3d8ce3492e | |
decentral1se | 07696760b7 | |
decentral1se | 43b4a01f8a | |
decentral1se | bb3b324e07 | |
decentral1se | eb9d1b883b | |
3wordchant | 6f6140ced2 | |
knoflook | cb225908d0 | |
decentral1se | f2892bad6f | |
decentral1se | 480b1453ec | |
decentral1se | 0ab2b3a652 | |
decentral1se | 93714a593b | |
decentral1se | 57f3f96bbc | |
decentral1se | e1959506c7 | |
decentral1se | 7482362af1 | |
decentral1se | e8510c8aeb | |
decentral1se | 4042e10985 | |
decentral1se | f7cd0eb54c | |
decentral1se | a571b839a8 | |
decentral1se | fae13d9af8 | |
decentral1se | 9c9f7225e7 | |
3wc | 352cc0939b | |
decentral1se | 2ca7884bbe | |
decentral1se | fa54705f79 | |
decentral1se | 8d802c78aa | |
decentral1se | 1c022fb616 | |
decentral1se | 0655c03434 | |
decentral1se | f6bdf596f5 | |
decentral1se | 6c6e6808c9 | |
decentral1se | a3ffd7f239 | |
decentral1se | a019417fd2 | |
decentral1se | 743600b94e | |
decentral1se | f4c2da894b | |
decentral1se | 4ef433312d | |
decentral1se | 9f69532dca | |
decentral1se | 3a97358f30 | |
decentral1se | 1e19805757 | |
decentral1se | 389ad9d049 | |
decentral1se | 93ffc633f3 | |
decentral1se | b61c9410a0 | |
decentral1se | bbab900ebc | |
decentral1se | 36d4dbc5cf | |
decentral1se | a4ade1463f | |
decentral1se | 20af4666c6 | |
decentral1se | d15b031f33 | |
decentral1se | a7f0bbde62 | |
decentral1se | 76d5a1026a | |
decentral1se | 7b0fb50e7f | |
decentral1se | f92364af80 | |
decentral1se | ca2a3c8b58 | |
decentral1se | a5c5526948 | |
decentral1se | d16eb0e309 | |
decentral1se | 3cff8aaada | |
decentral1se | 4ff4c83154 | |
decentral1se | f953743a7c | |
decentral1se | e84062e67c | |
decentral1se | e573794367 | |
decentral1se | 87f9c16db4 | |
decentral1se | 9fadc430a7 | |
decentral1se | 53cec2469b | |
decentral1se | a1de7f10cb | |
decentral1se | ece968478d | |
decentral1se | 3759bcd641 | |
decentral1se | 0ff08b5d34 | |
decentral1se | 8b541623ad | |
decentral1se | f24259dbfc | |
decentral1se | 40259f5e97 | |
decentral1se | fd471eb3f1 | |
decentral1se | a4633f06bd | |
decentral1se | 0d6031fef9 | |
decentral1se | 64d578cf91 | |
decentral1se | e216fe290b | |
decentral1se | 207278af75 | |
decentral1se | ff309182ea | |
decentral1se | 542cf793d2 |
79
.drone.yml
79
.drone.yml
|
@ -3,47 +3,86 @@ kind: pipeline
|
|||
name: linters
|
||||
steps:
|
||||
- name: run shellcheck
|
||||
image: koalaman/shellcheck-alpine:v0.7.1
|
||||
image: koalaman/shellcheck-alpine
|
||||
commands:
|
||||
- shellcheck abra
|
||||
- shellcheck bin/*.sh
|
||||
- shellcheck deploy/install.abra.coopcloud.tech/installer
|
||||
|
||||
- name: run flake8
|
||||
image: alpine/flake8:3.9.0
|
||||
image: alpine/flake8
|
||||
commands:
|
||||
- flake8 --max-line-length 100 bin/app-json.py
|
||||
- flake8 --max-line-length 100 bin/*.py
|
||||
|
||||
- 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
|
||||
- name: test installation script
|
||||
image: debian:buster
|
||||
commands:
|
||||
- kcov . bats tests || true
|
||||
- apt update && apt install -yqq sudo lsb-release
|
||||
- deploy/install.abra.coopcloud.tech/installer --no-prompt
|
||||
- ~/.local/bin/abra version
|
||||
|
||||
- name: send code coverage report to codecov
|
||||
failure: ignore # until we fix this
|
||||
image: plugins/codecov
|
||||
- name: publish image
|
||||
image: plugins/docker
|
||||
settings:
|
||||
auto_tag: true
|
||||
username: thecoopcloud
|
||||
password:
|
||||
from_secret: thecoopcloud_password
|
||||
repo: thecoopcloud/abra
|
||||
tags: latest
|
||||
depends_on:
|
||||
- run shellcheck
|
||||
- run flake8
|
||||
- run unit tests
|
||||
- test installation script
|
||||
when:
|
||||
event:
|
||||
exclude:
|
||||
- pull_request
|
||||
|
||||
- name: trigger downstream builds
|
||||
image: plugins/downstream
|
||||
settings:
|
||||
server: https://build.coopcloud.tech
|
||||
token:
|
||||
from_secret: codecov_token
|
||||
required: true
|
||||
from_secret: coopcloud_drone_token
|
||||
fork: true
|
||||
repositories:
|
||||
- coop-cloud/drone-abra
|
||||
depends_on:
|
||||
- run shellcheck
|
||||
- run flake8
|
||||
- run unit tests
|
||||
- test installation script
|
||||
- publish image
|
||||
when:
|
||||
event:
|
||||
exclude:
|
||||
- pull_request
|
||||
|
||||
- name: notify rocket chat
|
||||
image: plugins/slack
|
||||
- name: notify on failure
|
||||
image: plugins/matrix
|
||||
settings:
|
||||
webhook:
|
||||
from_secret: rc_builds_url
|
||||
username: comradebritney
|
||||
channel: "internal.builds"
|
||||
template: "{{repo.owner}}/{{repo.name}} build failed: {{build.link}}"
|
||||
homeserver: https://matrix.autonomic.zone
|
||||
roomid: "IFazIpLtxiScqbHqoa:autonomic.zone"
|
||||
userid: "@autono-bot:autonomic.zone"
|
||||
accesstoken:
|
||||
from_secret: autonobot_rocketchat_access_token
|
||||
depends_on:
|
||||
- run shellcheck
|
||||
- run flake8
|
||||
- run unit tests
|
||||
- test installation script
|
||||
- publish image
|
||||
- trigger downstream builds
|
||||
when:
|
||||
status:
|
||||
- failure
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
name: "Do not use this issue tracker"
|
||||
about: "Do not use this issue tracker"
|
||||
title: "Do not use this issue tracker"
|
||||
labels: []
|
||||
---
|
||||
|
||||
Please report your issue on [`coop-cloud/organising`](https://git.coopcloud.tech/coop-cloud/organising)
|
|
@ -1,2 +1,5 @@
|
|||
*.json
|
||||
*.pyc
|
||||
/.venv
|
||||
__pycache__
|
||||
coverage/
|
||||
|
|
116
CHANGELOG.md
116
CHANGELOG.md
|
@ -9,54 +9,106 @@
|
|||
|
||||
# abra x.x.x (UNRELEASED)
|
||||
|
||||
# abra 10.0.5 (2021-09-06)
|
||||
|
||||
- Fix catalogue version listing parsing.
|
||||
|
||||
# abra 10.0.4 (2021-09-06)
|
||||
|
||||
- Understand how to parse the new catalogue versions listing.
|
||||
|
||||
# abra 10.0.3 (????-??-??)
|
||||
|
||||
- Sorry folks, no change log.
|
||||
|
||||
# abra 10.0.2 (????-??-??)
|
||||
|
||||
- Sorry folks, no change log.
|
||||
|
||||
# abra 10.0.1 (2021-07-30)
|
||||
|
||||
- New `recipe .. lint` command ([#202](https://git.autonomic.zone/coop-cloud/abra/issues/202))
|
||||
- `abra-capsul` plugin ([e85bcc4](https://git.autonomic.zone/coop-cloud/abra/commit/e85bcc4))
|
||||
- Fix `run <service> <cmd>` invocations ([#204](https://git.autonomic.zone/coop-cloud/abra/issues/204))
|
||||
- Point installer at our [half-migrated new Gitea instance](https://git.coopcloud.tech) ([#207](https://git.coopcloud.tech/coop-cloud/abra/pulls/207) thanks @nicksellen!)
|
||||
|
||||
# abra 10.0.0 (2021-07-06)
|
||||
|
||||
- Add `--bump` to `deploy` command to allow packagers to make minor package related releases ([#173](https://git.autonomic.zone/coop-cloud/abra/issues/173))
|
||||
- Drop `--skip-version-check`/`--no-domain-poll`/`--no-state-poll` in favour of `--fast` ([#169](https://git.autonomic.zone/coop-cloud/abra/issues/169))
|
||||
- Move `abra` image under the new `thecoopcloud/...` namespace ([#1](https://git.autonomic.zone/coop-cloud/auto-apps-json/issues/1))
|
||||
- Add a `--output` flag to the `app-json.py` app generator for the CI environment ([#2](https://git.autonomic.zone/coop-cloud/auto-apps-json/issues/2))
|
||||
- Support logging in as new `thecoopcloud` Docker account via `skopeo` when generating new `apps.json` ([`7482362`](https://git.autonomic.zone/coop-cloud/abra/commit/7482362af1d01cc02828abd45b1222fa643d1f80))
|
||||
- App deployment checks are somewhat more reliable (see [#193](https://git.autonomic.zone/coop-cloud/abra/issues/193) for remaining work) ([#165](https://git.autonomic.zone/coop-cloud/abra/issues/165))
|
||||
- Skip generation of commented out secrets and correctly fail deploy when secret generation fails ([#133](https://git.autonomic.zone/coop-cloud/abra/issues/133))
|
||||
- Fix logging for chaos deploys and recipe selection logic ([#185](https://git.autonomic.zone/coop-cloud/abra/issues/185))
|
||||
- Improve reliability of selecting when to download a new `apps.json` ([#170](https://git.autonomic.zone/coop-cloud/abra/issues/170))
|
||||
- Implement `pwgen`/`pwqgen` native fallback for password generation ([#167](https://git.autonomic.zone/coop-cloud/abra/issues/167) / [#197](https://git.autonomic.zone/coop-cloud/abra/issues/197))
|
||||
- `abra` installer script will now try to install system requirements ([#196](https://git.autonomic.zone/coop-cloud/abra/issues/196))
|
||||
- Use latest [v4.9.6](https://github.com/mikefarah/yq/releases/tag/v4.9.6) install of `yq` for vendoring (**upgrade HOWTO:** `rm -rf ~/.abra/vendor/*`)
|
||||
- Support overriding `$ARGS` from `abra.sh` custom commands and error out correctly when these commands fail ([#1](https://github.com/Coop-Cloud/peertube/issues/1))
|
||||
- Add `abra <app> restart <service>` to support restarting individual services ([#200](https://git.autonomic.zone/coop-cloud/abra/issues/200))
|
||||
- Output diff of proposed changes when asking to commit during release logic ([`4b82045`](https://git.autonomic.zone/coop-cloud/abra/commit/4b820457defe1511208b6caa8b9feb9603ffc8be))
|
||||
- Add validation for generated output when making new release labels ([#186](https://git.autonomic.zone/coop-cloud/abra/issues/186))
|
||||
|
||||
# abra 9.0.0 (2021-06-10)
|
||||
|
||||
- Add Docker image for `abra` ([`64d578cf`](https://git.autonomic.zone/coop-cloud/abra/commit/64d578cf914bd2bad378ea4ef375747d10b33191))
|
||||
- Support unattended mode for recipe releasing ([`3759bcd6`](https://git.autonomic.zone/coop-cloud/abra/commit/3759bcd641cf60611c13927e83425e773d2bb629))
|
||||
- Add Renovate bot configuraiton script ([`9fadc430`](https://git.autonomic.zone/coop-cloud/abra/commit/9fadc430a7bb2d554c0ee26c0f9b6c51dc5b0475))
|
||||
- Add release automation via [drone-abra](https://git.autonomic.zone/coop-cloud/drone-abra) ([#56](https://git.autonomic.zone/coop-cloud/organising/issues/56))
|
||||
- Move `apps.json` generation to [auto-apps-json](https://git.autonomic.zone/coop-cloud/auto-apps-json) ([#125](https://git.autonomic.zone/coop-cloud/abra/issues/125))
|
||||
- Add Github mirroring script ([`4ef43331`](https://git.autonomic.zone/coop-cloud/abra/commit/4ef433312dd0b0ace91b3c285f82f3973093d92d))
|
||||
- Add `--chaos` flag to deploy (always choose latest Git commit) ([#178](https://git.autonomic.zone/coop-cloud/abra/issues/178))
|
||||
|
||||
# abra 8.0.1 (2021-05-31)
|
||||
|
||||
- Fix help for `... app ... volume ls` ([efad71c470](https://git.autonomic.zone/coop-cloud/abra/commits/branch/main))
|
||||
- Fix help for `... app ... volume ls` ([`efad71c4`](https://git.autonomic.zone/coop-cloud/abra/commit/efad71c470d6d65f7e4bfe39c5f68ff1097f80a2))
|
||||
- Only output secrets warnings once ([#143](https://git.autonomic.zone/coop-cloud/abra/issues/143))
|
||||
- Migrate `abra` installation script to `coopcloud.tech` domain ([#150](https://git.autonomic.zone/coop-cloud/abra/issues/150))
|
||||
- Add `--no-state-poll` to avoid success/failure forecasting on deployment ([#165](https://git.autonomic.zone/coop-cloud/abra/issues/165))
|
||||
|
||||
# abra 8.0.0 (2021-05-30)
|
||||
|
||||
- Fix secret length generation ([f537417](https://git.autonomic.zone/coop-cloud/abra/commit/1b85bf3d37280e9632c315d759c0f2d09c039fef))
|
||||
- Fix secret length generation ([`f537417`](https://git.autonomic.zone/coop-cloud/abra/commit/1b85bf3d37280e9632c315d759c0f2d09c039fef))
|
||||
- Fix checking out new apps ([#164](https://git.autonomic.zone/coop-cloud/abra/issues/164)
|
||||
- Give up if YAML is invalid ([#154](https://git.autonomic.zone/coop-cloud/abra/issues/154))
|
||||
- Switch from wget to cURL ([fc0caaa](https://git.autonomic.zone/coop-cloud/abra/commit/fc0caaa))
|
||||
- Add Bash completion for `recipe ..` ([8c93d1a](https://git.autonomic.zone/coop-cloud/abra/commit/8c93d1a))
|
||||
- Tweak README parsing in `app-json.py` ([b14219b](https://git.autonomic.zone/coop-cloud/abra/commit/b14219b))
|
||||
- Switch from wget to cURL ([`fc0caaa`](https://git.autonomic.zone/coop-cloud/abra/commit/fc0caaa))
|
||||
- Add Bash completion for `recipe ..` ([`8c93d1a`](https://git.autonomic.zone/coop-cloud/abra/commit/8c93d1a))
|
||||
- Tweak README parsing in `app-json.py` ([`b14219b`](https://git.autonomic.zone/coop-cloud/abra/commit/b14219b))
|
||||
- Add fallback names to `app.json` ([#157](https://git.autonomic.zone/coop-cloud/abra/issues/157))
|
||||
- Remove duplicate message ([#155](https://git.autonomic.zone/coop-cloud/abra/issues/155))
|
||||
- Add `deploy --fast` ([a7f7c96](https://git.autonomic.zone/coop-cloud/abra/commit/a7f7c96))
|
||||
- Add `deploy --fast` ([`a7f7c96`](https://git.autonomic.zone/coop-cloud/abra/commit/a7f7c96))
|
||||
- Add `app .. volume` commands, fix volume deletion with `app .. delete --volumes` ([#161](https://git.autonomic.zone/coop-cloud/abra/issues/161))
|
||||
|
||||
# abra 0.7.4 (2021-05-10)
|
||||
|
||||
- Sort `apps.json` when publishing ([39a7fc0](https://git.autonomic.zone/coop-cloud/abra/commit/39a7fc04fb5df1a6d78b84f51838530ab3eb76db))
|
||||
- Fix publishing of rating for new apps ([0e28af9](https://git.autonomic.zone/coop-cloud/abra/commit/0e28af9eb1af6c6da705b4614ddd173c60576629))
|
||||
- Detect compose filenames in `n+1` release generation ([ffc569e](https://git.autonomic.zone/coop-cloud/abra/commit/ffc569e275df7ca784a4db1a3331e17975fd8c87))
|
||||
- Fix secret generation when specifying length ([3a353f4](https://git.autonomic.zone/coop-cloud/abra/commit/3a353f4062baccde2c9f175b03afb2db6d462ae4))
|
||||
- Sort `apps.json` when publishing ([`39a7fc0`](https://git.autonomic.zone/coop-cloud/abra/commit/39a7fc04fb5df1a6d78b84f51838530ab3eb76db))
|
||||
- Fix publishing of rating for new apps ([`0e28af9`](https://git.autonomic.zone/coop-cloud/abra/commit/0e28af9eb1af6c6da705b4614ddd173c60576629))
|
||||
- Detect compose filenames in `n+1` release generation ([`ffc569e`](https://git.autonomic.zone/coop-cloud/abra/commit/ffc569e275df7ca784a4db1a3331e17975fd8c87))
|
||||
- Fix secret generation when specifying length ([`3a353f4`](https://git.autonomic.zone/coop-cloud/abra/commit/3a353f4062baccde2c9f175b03afb2db6d462ae4))
|
||||
|
||||
# abra 0.7.3 (2021-04-28)
|
||||
|
||||
- Only check for pw(q)gen if we're actually trying to use them ([#147](https://git.autonomic.zone/coop-cloud/abra/issues/147))
|
||||
- Use apps.coopcloud.tech for app data hosting & download ([75bd599](https://git.autonomic.zone/coop-cloud/abra/commit/75bd599))
|
||||
- Use apps.coopcloud.tech for app data hosting & download ([`75bd599`](https://git.autonomic.zone/coop-cloud/abra/commit/75bd599))
|
||||
- Choose latest commit messages for new tags ([#144](https://git.autonomic.zone/coop-cloud/abra/issues/144))
|
||||
- Handle recipes without an `app` service in `recipe .. release` ([#151](https://git.autonomic.zone/coop-cloud/abra/issues/151))
|
||||
|
||||
# abra 0.7.2 (2021-04-07)
|
||||
|
||||
- Fix installation script development installs (again! Thanks Bash!) ([4747d9b7](https://git.autonomic.zone/coop-cloud/abra/commit/4747d9b7fb5fba914f210b6570bfe2db0b53da23))
|
||||
- Fix installation script development installs (again! Thanks Bash!) ([`4747d9b7`](https://git.autonomic.zone/coop-cloud/abra/commit/4747d9b7fb5fba914f210b6570bfe2db0b53da23))
|
||||
|
||||
# abra 0.7.1 (2021-04-07)
|
||||
|
||||
- Fix installation script development installs ([8f2fadb3c](https://git.autonomic.zone/coop-cloud/abra/commit/8f2fadb3c43c5915520f5ea531ea3815c2ba8531))
|
||||
- Fix installation script development installs ([`8f2fadb3c`](https://git.autonomic.zone/coop-cloud/abra/commit/8f2fadb3c43c5915520f5ea531ea3815c2ba8531))
|
||||
|
||||
# abra 0.7.0 (2021-04-07)
|
||||
|
||||
- Add `--force` to the `deploy` command to allow overriding deployment logic ([#105](https://git.autonomic.zone/coop-cloud/abra/issues/105))
|
||||
- Handle undeployed apps in version summaries when deploying ([#104](https://git.autonomic.zone/coop-cloud/abra/issues/104))
|
||||
- Add `--force` to `undeploy` command ([e5e98d5](https://git.autonomic.zone/coop-cloud/abra/commit/e5e98d5))
|
||||
- Rename "app type" back to "stack" in the deployment overview ([54b6acc](https://git.autonomic.zone/coop-cloud/abra/commit/54b6acc))
|
||||
- Add `--force` to `undeploy` command ([`e5e98d5`](https://git.autonomic.zone/coop-cloud/abra/commit/e5e98d5))
|
||||
- Rename "app type" back to "stack" in the deployment overview ([`54b6acc`](https://git.autonomic.zone/coop-cloud/abra/commit/54b6acc))
|
||||
- Show context connection details on `abra server ls` ([#110](https://git.autonomic.zone/coop-cloud/abra/issues/110))
|
||||
- Allow to debug the SSH connection details on swarm init ([#109](https://git.autonomic.zone/coop-cloud/abra/issues/109))
|
||||
- Show correct status for apps deployed on servers with missing context ([#99](https://git.autonomic.zone/coop-cloud/abra/issues/99))
|
||||
|
@ -71,53 +123,53 @@
|
|||
- 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))
|
||||
- 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_DIR` in the installer script ([`4e94a424e`](https://git.autonomic.zone/coop-cloud/abra/commit/4e94a424e94a42))
|
||||
- Support [abra-hetzner](https://git.autonomic.zone/coop-cloud/abra-hetzner) plugin ([#88](https://git.autonomic.zone/coop-cloud/abra/issues/88))
|
||||
|
||||
# abra 0.6.0 (2021-03-17)
|
||||
|
||||
- Show version and digest of app if labelled ([98e674b8e8](https://git.autonomic.zone/coop-cloud/abra/commit/98e674b8e83458a83dcbf331e8e34c7188559c4a))
|
||||
- Show version and digest of app if labelled ([`98e674b8e`](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))
|
||||
- New `app-catalogue.sh` script to auto-generate app list for documentation ([`f163d4b0f`](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))
|
||||
- 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))
|
||||
- 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))
|
||||
- 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))
|
||||
- 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))
|
||||
- `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))
|
||||
- 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))
|
||||
- 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))
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
FROM alpine:latest
|
||||
|
||||
RUN apk add --upgrade --no-cache \
|
||||
bash \
|
||||
curl \
|
||||
git \
|
||||
grep \
|
||||
openssh-client \
|
||||
py3-requests \
|
||||
skopeo \
|
||||
util-linux
|
||||
|
||||
RUN mkdir -p ~./local/bin
|
||||
RUN mkdir -p ~/.abra/apps
|
||||
RUN mkdir -p ~/.abra/vendor
|
||||
RUN mkdir -p ~/.ssh/
|
||||
|
||||
RUN ssh-keyscan -p 2222 git.coopcloud.tech > ~/.ssh/known_hosts
|
||||
|
||||
RUN curl -L https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 --output ~/.abra/vendor/jq
|
||||
RUN chmod +x ~/.abra/vendor/jq
|
||||
|
||||
RUN curl -L https://github.com/mikefarah/yq/releases/download/v4.9.3/yq_linux_amd64 --output ~/.abra/vendor/yq
|
||||
RUN chmod +x ~/.abra/vendor/yq
|
||||
|
||||
# Note(decentral1se): it is fine to always use the development branch because
|
||||
# our Drone CI docker auto-tagger will publish official release tags and
|
||||
# otherwise give us the latest abra on the latest tag
|
||||
RUN curl https://install.abra.coopcloud.tech | bash -s -- --dev
|
||||
|
||||
COPY bin/* /root/.local/bin/
|
||||
|
||||
ENTRYPOINT ["/root/.local/bin/abra"]
|
55
README.md
55
README.md
|
@ -1,11 +1,18 @@
|
|||
# abra
|
||||
|
||||
## 🔥 🔥 🔥 D E P R E C A T E D 🔥 🔥 🔥
|
||||
|
||||
[`abra`](https://git.coopcloud.tech/coop-cloud/abra) served us well but we're porting it to [Golang](https://golang.org) over in [`go-abra`](https://git.coopcloud.tech/coop-cloud/go-abra). To learn more about the reasons for that, see [this blog post](https://coopcloud.tech/blog/this-month-in-coop-cloud-july/). This means this repository and tool are officially deprecated as of August 1rst 2021. We will still provide bug security fixes but no new features will be developed in `abra`. Feel free to go on using it and reporting issues against this issue tracker. Thanks for all the good times Bash.
|
||||
|
||||
## 🔥 🔥 🔥 D E P R E C A T E D 🔥 🔥 🔥
|
||||
|
||||
---
|
||||
|
||||
[![Build Status](https://drone.autonomic.zone/api/badges/coop-cloud/abra/status.svg)](https://drone.autonomic.zone/coop-cloud/abra)
|
||||
[![codecov](https://codecov.io/gh/Autonomic-Cooperative/abra/branch/main/graph/badge.svg?token=aX3I5NMRsj)](undefined)
|
||||
|
||||
> https://coopcloud.tech
|
||||
|
||||
The cooperative cloud utility belt 🎩🐇
|
||||
The Co-op Cloud utility belt 🎩🐇
|
||||
|
||||
`abra` is a command-line tool for managing your own [Co-op Cloud](https://coopcloud.tech). 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.
|
||||
|
||||
|
@ -26,29 +33,40 @@ See [CHANGELOG.md](./CHANGELOG.md).
|
|||
|
||||
> [docs.coopcloud.tech](https://docs.coopcloud.tech)
|
||||
|
||||
## Install
|
||||
## Requirements
|
||||
|
||||
Requirements:
|
||||
|
||||
- `pwqgen` (optional)
|
||||
- `pwgen` (optional)
|
||||
- `curl`
|
||||
- `docker`
|
||||
- `bash` >= 4
|
||||
|
||||
## Install
|
||||
|
||||
Install the latest stable release:
|
||||
|
||||
```sh
|
||||
curl https://install.abra.coopcloud.tech | bash
|
||||
```
|
||||
|
||||
or the bleeding-edge development version:
|
||||
The source for this script is [here](./deploy/install.abra.coopcloud.tech/installer).
|
||||
|
||||
You can pass options to the script like so (e.g. install the bleeding edge development version):
|
||||
|
||||
```sh
|
||||
curl https://install.abra.coopcloud.tech | bash -s -- --dev
|
||||
```
|
||||
|
||||
The source for this script is [here](./deploy/install.abra.coopcloud.tech/installer).
|
||||
Other options available are as follows:
|
||||
|
||||
- **--no-prompt**: non-interactive installation
|
||||
- **--no-deps**: do not attempt to install [requirements](#requirements)
|
||||
|
||||
## Container
|
||||
|
||||
An [image](https://hub.docker.com/r/thecoopcloud/abra) is also provided.
|
||||
|
||||
```
|
||||
docker run thecoopcloud/abra app ls
|
||||
```
|
||||
|
||||
## Update
|
||||
|
||||
|
@ -67,17 +85,6 @@ 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.
|
||||
|
||||
## Generating a new 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/apps.coopcloud.tech/apps.json](./deploy/apps.coopcloud.tech/apps.json).
|
||||
|
||||
## Releasing
|
||||
|
||||
### `abra`
|
||||
|
@ -91,11 +98,3 @@ Then run `./bin/app-json.py` ([source](./bin/app-json.py)) and it will spit out
|
|||
- `git push` and `git push --tags`
|
||||
- Deploy a new installer script `make release-installer`
|
||||
- Tell the world (CoTech forum, Matrix public channel, Autonomic mastodon, etc.)
|
||||
|
||||
### apps.coopcloud.tech
|
||||
|
||||
> [apps.coopcloud.tech](https://apps.coopcloud.tech)
|
||||
|
||||
```bash
|
||||
$ make release-apps
|
||||
```
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
"""Shared utilities for bin/*.py scripts."""
|
||||
|
||||
from logging import DEBUG, basicConfig, getLogger
|
||||
from os import chdir, mkdir
|
||||
from os.path import exists, expanduser
|
||||
from pathlib import Path
|
||||
from shlex import split
|
||||
from subprocess import check_output
|
||||
from sys import exit
|
||||
|
||||
from requests import get
|
||||
|
||||
HOME_PATH = expanduser("~/")
|
||||
CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute()
|
||||
REPOS_TO_SKIP = (
|
||||
"abra",
|
||||
"abra-aur",
|
||||
"abra-apps",
|
||||
"abra-capsul",
|
||||
"abra-gandi",
|
||||
"abra-hetzner",
|
||||
"apps",
|
||||
"auto-apps-json",
|
||||
"auto-mirror",
|
||||
"aur-abra-git",
|
||||
"backup-bot",
|
||||
"coopcloud.tech",
|
||||
"coturn",
|
||||
"docker-cp-deploy",
|
||||
"docker-dind-bats-kcov",
|
||||
"docs.coopcloud.tech",
|
||||
"example",
|
||||
"gardening",
|
||||
"go-abra",
|
||||
"organising",
|
||||
"pyabra",
|
||||
"radicle-seed-node",
|
||||
"tagcmp",
|
||||
"stack-ssh-deploy",
|
||||
"swarm-cronjob",
|
||||
"tyop",
|
||||
)
|
||||
YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq")
|
||||
JQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/jq")
|
||||
|
||||
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_repos_json():
|
||||
""" Retrieve repo list from Gitea """
|
||||
|
||||
url = "https://git.coopcloud.tech/api/v1/orgs/coop-cloud/repos"
|
||||
|
||||
log.info(f"Retrieving {url}")
|
||||
|
||||
repos = []
|
||||
response = True
|
||||
page = 1
|
||||
|
||||
try:
|
||||
while response:
|
||||
log.info(f"Trying to fetch page {page}")
|
||||
response = get(url + f"?page={page}", timeout=10).json()
|
||||
repos.extend(response)
|
||||
page += 1
|
||||
|
||||
return repos
|
||||
except Exception as exception:
|
||||
log.error(f"Failed to retrieve {url}, saw {str(exception)}")
|
||||
exit(1)
|
||||
|
||||
|
||||
def clone_all_apps(repos_json, ssh=False):
|
||||
"""Clone all Co-op Cloud apps to ~/.abra/apps."""
|
||||
if not exists(CLONES_PATH):
|
||||
mkdir(CLONES_PATH)
|
||||
|
||||
if ssh:
|
||||
repos = [[p["name"], p["ssh_url"]] for p in repos_json]
|
||||
else:
|
||||
repos = [[p["name"], p["clone_url"]] for p in repos_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")
|
148
bin/app-json.py
148
bin/app-json.py
|
@ -6,84 +6,44 @@
|
|||
# ~/.abra/apps), and format it as JSON so that it can be hosted here:
|
||||
# https://apps.coopcloud.tech
|
||||
|
||||
import argparse
|
||||
from json import dump
|
||||
from logging import DEBUG, basicConfig, getLogger
|
||||
from os import chdir, listdir, mkdir
|
||||
from os.path import basename, exists, expanduser
|
||||
from os import chdir, environ, getcwd, listdir
|
||||
from os.path import basename
|
||||
from pathlib import Path
|
||||
from re import findall, search
|
||||
from shlex import split
|
||||
from subprocess import DEVNULL, check_output
|
||||
from sys import exit
|
||||
from subprocess import DEVNULL
|
||||
|
||||
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",
|
||||
"abra-apps",
|
||||
"abra-gandi",
|
||||
"abra-hetzner",
|
||||
"backup-bot",
|
||||
"coopcloud.tech",
|
||||
"coturn",
|
||||
"docker-cp-deploy",
|
||||
"docker-dind-bats-kcov",
|
||||
"docs.coopcloud.tech",
|
||||
"example",
|
||||
"gardening",
|
||||
"organising",
|
||||
"pyabra",
|
||||
"radicle-seed-node",
|
||||
"stack-ssh-deploy",
|
||||
"swarm-cronjob",
|
||||
from abralib import (
|
||||
CLONES_PATH,
|
||||
JQ_PATH,
|
||||
REPOS_TO_SKIP,
|
||||
YQ_PATH,
|
||||
_run_cmd,
|
||||
clone_all_apps,
|
||||
get_repos_json,
|
||||
log,
|
||||
)
|
||||
|
||||
log = getLogger(__name__)
|
||||
basicConfig()
|
||||
log.setLevel(DEBUG)
|
||||
parser = argparse.ArgumentParser(description="Generate a new apps.json")
|
||||
parser.add_argument("--output", type=Path, default=f"{getcwd()}/apps.json")
|
||||
|
||||
|
||||
def _run_cmd(cmd, shell=False, **kwargs):
|
||||
"""Run a shell command."""
|
||||
args = [split(cmd)]
|
||||
def skopeo_login():
|
||||
"""Log into the docker registry to avoid rate limits."""
|
||||
user = environ.get("SKOPEO_USER")
|
||||
password = environ.get("SKOPEO_PASSWORD")
|
||||
registry = environ.get("SKOPEO_REGISTRY", "docker.io")
|
||||
|
||||
if shell:
|
||||
args = [cmd]
|
||||
kwargs = {"shell": shell}
|
||||
if not user or not password:
|
||||
log.info("Failed to log in via Skopeo due to missing env vars")
|
||||
return
|
||||
|
||||
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_repos_json():
|
||||
""" Retrieve repo list from Gitea """
|
||||
|
||||
url = "https://git.autonomic.zone/api/v1/orgs/coop-cloud/repos"
|
||||
|
||||
log.info(f"Retrieving {url}")
|
||||
|
||||
repos = []
|
||||
response = True
|
||||
page = 1
|
||||
|
||||
try:
|
||||
while response:
|
||||
log.info(f"Trying to fetch page {page}")
|
||||
response = get(url + f"?page={page}", timeout=10).json()
|
||||
repos.extend(response)
|
||||
page += 1
|
||||
|
||||
return repos
|
||||
except Exception as exception:
|
||||
log.error(f"Failed to retrieve {url}, saw {str(exception)}")
|
||||
exit(1)
|
||||
login_cmd = f"skopeo login {registry} -u {user} -p {password}"
|
||||
output = _run_cmd(login_cmd, shell=True)
|
||||
log.info(f"Skopeo login attempt: {output}")
|
||||
|
||||
|
||||
def get_published_apps_json():
|
||||
|
@ -99,31 +59,6 @@ def get_published_apps_json():
|
|||
return {}
|
||||
|
||||
|
||||
def clone_all_apps(repos_json):
|
||||
"""Clone all Co-op Cloud apps to ~/.abra/apps."""
|
||||
if not exists(CLONES_PATH):
|
||||
mkdir(CLONES_PATH)
|
||||
|
||||
repos = [[p["name"], p["ssh_url"]] for p in repos_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(repos_json):
|
||||
"""Generate the abra-apps.json application versions file."""
|
||||
apps_json = {}
|
||||
|
@ -204,8 +139,13 @@ def get_app_metadata(app_path):
|
|||
return metadata
|
||||
|
||||
|
||||
def get_cached_versions(cached_apps_json, app_name):
|
||||
versions = cached_apps_json[app_name]["versions"]
|
||||
return [list(k)[0] for k in [version.keys() for version in versions]]
|
||||
|
||||
|
||||
def get_app_versions(app_path, cached_apps_json):
|
||||
versions = {}
|
||||
versions = []
|
||||
|
||||
chdir(app_path)
|
||||
|
||||
|
@ -220,7 +160,7 @@ def get_app_versions(app_path, cached_apps_json):
|
|||
app_name = basename(app_path)
|
||||
|
||||
try:
|
||||
existing_tags = cached_apps_json[app_name]["versions"].keys()
|
||||
existing_tags = get_cached_versions(cached_apps_json, app_name)
|
||||
except KeyError:
|
||||
existing_tags = []
|
||||
|
||||
|
@ -236,9 +176,8 @@ def get_app_versions(app_path, cached_apps_json):
|
|||
if service in ("null", "---"):
|
||||
continue
|
||||
|
||||
if (
|
||||
tag in existing_tags
|
||||
and service in cached_apps_json[app_name]["versions"][tag]
|
||||
if tag in existing_tags and service in get_cached_versions(
|
||||
cached_apps_json, app_name
|
||||
):
|
||||
log.info(f"Skipping {tag} because we've already processed it")
|
||||
existing_versions = cached_apps_json[app_name]["versions"][tag][service]
|
||||
|
@ -257,7 +196,7 @@ def get_app_versions(app_path, cached_apps_json):
|
|||
if image in ("null", "---"):
|
||||
continue
|
||||
|
||||
images_cmd = f"skopeo inspect docker://{image} | jq '.Digest'"
|
||||
images_cmd = f"skopeo inspect docker://{image} | {JQ_PATH} '.Digest'"
|
||||
output = _run_cmd(images_cmd, shell=True)
|
||||
|
||||
service_version_info = {
|
||||
|
@ -271,7 +210,7 @@ def get_app_versions(app_path, cached_apps_json):
|
|||
|
||||
parsed_services.append(service)
|
||||
|
||||
versions[tag] = service_versions
|
||||
versions.append({tag: service_versions})
|
||||
|
||||
_run_cmd(f"git checkout {initial_branch}")
|
||||
|
||||
|
@ -280,11 +219,14 @@ def get_app_versions(app_path, cached_apps_json):
|
|||
|
||||
def main():
|
||||
"""Run the script."""
|
||||
repos_json = get_repos_json()
|
||||
clone_all_apps(repos_json)
|
||||
args = parser.parse_args()
|
||||
|
||||
target = f"{SCRIPT_PATH}/../deploy/apps.coopcloud.tech/apps.json"
|
||||
with open(target, "w", encoding="utf-8") as handle:
|
||||
skopeo_login()
|
||||
|
||||
repos_json = get_repos_json()
|
||||
# clone_all_apps(repos_json)
|
||||
|
||||
with open(args.output, "w", encoding="utf-8") as handle:
|
||||
dump(
|
||||
generate_apps_json(repos_json),
|
||||
handle,
|
||||
|
@ -293,7 +235,7 @@ def main():
|
|||
sort_keys=True,
|
||||
)
|
||||
|
||||
log.info(f"Successfully generated {target}")
|
||||
log.info(f"Successfully generated {args.output}")
|
||||
|
||||
|
||||
main()
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# Usage: ./clone-all-apps.py
|
||||
#
|
||||
# Clone all available apps into ~/.abra/apps using ssh:// URLs
|
||||
|
||||
from abralib import clone_all_apps, get_repos_json
|
||||
|
||||
|
||||
def main():
|
||||
"""Run the script."""
|
||||
repos_json = get_repos_json()
|
||||
clone_all_apps(repos_json, ssh=True)
|
||||
|
||||
|
||||
main()
|
|
@ -0,0 +1,49 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# Usage: ./github-sync.py
|
||||
#
|
||||
# Mirror repositories to Github (Fuck M$, get it straight)
|
||||
|
||||
from os import chdir, environ, listdir
|
||||
|
||||
from abralib import CLONES_PATH, _run_cmd, clone_all_apps, get_repos_json, log
|
||||
|
||||
REPOS_TO_SKIP = (
|
||||
"apps",
|
||||
"backup-bot",
|
||||
"docker-dind-bats-kcov",
|
||||
"docs.coopcloud.tech",
|
||||
"pyabra",
|
||||
"radicle-seed-node",
|
||||
"swarm-cronjob",
|
||||
"tyop",
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
"""Run the script."""
|
||||
repos_json = get_repos_json()
|
||||
clone_all_apps(repos_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"Mirroring {app}...")
|
||||
|
||||
token = environ.get("GITHUB_ACCESS_TOKEN")
|
||||
remote = f"https://coopcloudbot:{token}@github.com/Coop-Cloud/{app}.git"
|
||||
|
||||
_run_cmd(
|
||||
f"git remote add github {remote} || true",
|
||||
shell=True,
|
||||
)
|
||||
|
||||
_run_cmd("git push github --all")
|
||||
|
||||
|
||||
main()
|
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# Usage: ./renovate-ls-apps.py
|
||||
#
|
||||
# Output list of apps for Renovate bot configuration
|
||||
|
||||
from abralib import REPOS_TO_SKIP, get_repos_json
|
||||
|
||||
|
||||
def main():
|
||||
"""Run the script."""
|
||||
repos = [p["full_name"] for p in get_repos_json()]
|
||||
repos.sort()
|
||||
for repo in repos:
|
||||
if repo.split("/")[-1] in REPOS_TO_SKIP:
|
||||
continue
|
||||
print(f'"{repo}",')
|
||||
|
||||
|
||||
main()
|
File diff suppressed because it is too large
Load Diff
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
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/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(`apps.coopcloud.tech`, `abra-apps.cloud.autonomic.zone`)"
|
||||
- "traefik.http.routers.abra-apps.entrypoints=web-secure"
|
||||
- "traefik.http.routers.abra-apps.tls.certresolver=production"
|
||||
- "traefik.http.routers.abra-apps.middlewares=abra-apps-redirect"
|
||||
- "traefik.http.middlewares.abra-apps-redirect.headers.SSLForceHost=true"
|
||||
- "traefik.http.middlewares.abra-apps-redirect.headers.SSLHost=apps.coopcloud.tech"
|
||||
|
||||
configs:
|
||||
abra_apps_json:
|
||||
file: apps.json
|
||||
abra_conf:
|
||||
file: nginx.conf
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
public:
|
|
@ -1,10 +0,0 @@
|
|||
server {
|
||||
listen 80 default_server;
|
||||
server_name apps.coopcloud.tech;
|
||||
|
||||
location / {
|
||||
root /var/www/abra-apps;
|
||||
add_header Content-Type application/json;
|
||||
index apps.json;
|
||||
}
|
||||
}
|
|
@ -1,9 +1,178 @@
|
|||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
ABRA_VERSION="8.0.1"
|
||||
GIT_URL="https://git.autonomic.zone/coop-cloud/abra"
|
||||
# shellcheck disable=SC2154,SC2034
|
||||
|
||||
ABRA_VERSION="10.0.5"
|
||||
GIT_URL="https://git.coopcloud.tech/coop-cloud/abra"
|
||||
ABRA_SRC="$GIT_URL/raw/tag/$ABRA_VERSION/abra"
|
||||
ABRA_DIR="${ABRA_DIR:-$HOME/.abra/}"
|
||||
ABRA_DIR="${ABRA_DIR:-$HOME/.abra}"
|
||||
|
||||
DOC="
|
||||
abra command-line installer script
|
||||
|
||||
Usage:
|
||||
installer [options]
|
||||
|
||||
Options:
|
||||
-h, --help Show this message and exit
|
||||
-d, --dev Install bleeding edge development version
|
||||
-n, --no-prompt Don't prompt for input and run non-interactively
|
||||
-p, --no-deps Don't attempt to install system dependencies
|
||||
"
|
||||
|
||||
# docopt parser below, refresh this parser with `docopt.sh installer`
|
||||
# shellcheck disable=2016,1075
|
||||
docopt() { parse() { if ${DOCOPT_DOC_CHECK:-true}; then local doc_hash
|
||||
if doc_hash=$(printf "%s" "$DOC" | (sha256sum 2>/dev/null || shasum -a 256)); then
|
||||
if [[ ${doc_hash:0:5} != "$digest" ]]; then
|
||||
stderr "The current usage doc (${doc_hash:0:5}) does not match \
|
||||
what the parser was generated with (${digest})
|
||||
Run \`docopt.sh\` to refresh the parser."; _return 70; fi; fi; fi
|
||||
local root_idx=$1; shift; argv=("$@"); parsed_params=(); parsed_values=()
|
||||
left=(); testdepth=0; local arg; while [[ ${#argv[@]} -gt 0 ]]; do
|
||||
if [[ ${argv[0]} = "--" ]]; then for arg in "${argv[@]}"; do
|
||||
parsed_params+=('a'); parsed_values+=("$arg"); done; break
|
||||
elif [[ ${argv[0]} = --* ]]; then parse_long
|
||||
elif [[ ${argv[0]} = -* && ${argv[0]} != "-" ]]; then parse_shorts
|
||||
elif ${DOCOPT_OPTIONS_FIRST:-false}; then for arg in "${argv[@]}"; do
|
||||
parsed_params+=('a'); parsed_values+=("$arg"); done; break; else
|
||||
parsed_params+=('a'); parsed_values+=("${argv[0]}"); argv=("${argv[@]:1}"); fi
|
||||
done; local idx; if ${DOCOPT_ADD_HELP:-true}; then
|
||||
for idx in "${parsed_params[@]}"; do [[ $idx = 'a' ]] && continue
|
||||
if [[ ${shorts[$idx]} = "-h" || ${longs[$idx]} = "--help" ]]; then
|
||||
stdout "$trimmed_doc"; _return 0; fi; done; fi
|
||||
if [[ ${DOCOPT_PROGRAM_VERSION:-false} != 'false' ]]; then
|
||||
for idx in "${parsed_params[@]}"; do [[ $idx = 'a' ]] && continue
|
||||
if [[ ${longs[$idx]} = "--version" ]]; then stdout "$DOCOPT_PROGRAM_VERSION"
|
||||
_return 0; fi; done; fi; local i=0; while [[ $i -lt ${#parsed_params[@]} ]]; do
|
||||
left+=("$i"); ((i++)) || true; done
|
||||
if ! required "$root_idx" || [ ${#left[@]} -gt 0 ]; then error; fi; return 0; }
|
||||
parse_shorts() { local token=${argv[0]}; local value; argv=("${argv[@]:1}")
|
||||
[[ $token = -* && $token != --* ]] || _return 88; local remaining=${token#-}
|
||||
while [[ -n $remaining ]]; do local short="-${remaining:0:1}"
|
||||
remaining="${remaining:1}"; local i=0; local similar=(); local match=false
|
||||
for o in "${shorts[@]}"; do if [[ $o = "$short" ]]; then similar+=("$short")
|
||||
[[ $match = false ]] && match=$i; fi; ((i++)) || true; done
|
||||
if [[ ${#similar[@]} -gt 1 ]]; then
|
||||
error "${short} is specified ambiguously ${#similar[@]} times"
|
||||
elif [[ ${#similar[@]} -lt 1 ]]; then match=${#shorts[@]}; value=true
|
||||
shorts+=("$short"); longs+=(''); argcounts+=(0); else value=false
|
||||
if [[ ${argcounts[$match]} -ne 0 ]]; then if [[ $remaining = '' ]]; then
|
||||
if [[ ${#argv[@]} -eq 0 || ${argv[0]} = '--' ]]; then
|
||||
error "${short} requires argument"; fi; value=${argv[0]}; argv=("${argv[@]:1}")
|
||||
else value=$remaining; remaining=''; fi; fi; if [[ $value = false ]]; then
|
||||
value=true; fi; fi; parsed_params+=("$match"); parsed_values+=("$value"); done
|
||||
}; parse_long() { local token=${argv[0]}; local long=${token%%=*}
|
||||
local value=${token#*=}; local argcount; argv=("${argv[@]:1}")
|
||||
[[ $token = --* ]] || _return 88; if [[ $token = *=* ]]; then eq='='; else eq=''
|
||||
value=false; fi; local i=0; local similar=(); local match=false
|
||||
for o in "${longs[@]}"; do if [[ $o = "$long" ]]; then similar+=("$long")
|
||||
[[ $match = false ]] && match=$i; fi; ((i++)) || true; done
|
||||
if [[ $match = false ]]; then i=0; for o in "${longs[@]}"; do
|
||||
if [[ $o = $long* ]]; then similar+=("$long"); [[ $match = false ]] && match=$i
|
||||
fi; ((i++)) || true; done; fi; if [[ ${#similar[@]} -gt 1 ]]; then
|
||||
error "${long} is not a unique prefix: ${similar[*]}?"
|
||||
elif [[ ${#similar[@]} -lt 1 ]]; then
|
||||
[[ $eq = '=' ]] && argcount=1 || argcount=0; match=${#shorts[@]}
|
||||
[[ $argcount -eq 0 ]] && value=true; shorts+=(''); longs+=("$long")
|
||||
argcounts+=("$argcount"); else if [[ ${argcounts[$match]} -eq 0 ]]; then
|
||||
if [[ $value != false ]]; then
|
||||
error "${longs[$match]} must not have an argument"; fi
|
||||
elif [[ $value = false ]]; then
|
||||
if [[ ${#argv[@]} -eq 0 || ${argv[0]} = '--' ]]; then
|
||||
error "${long} requires argument"; fi; value=${argv[0]}; argv=("${argv[@]:1}")
|
||||
fi; if [[ $value = false ]]; then value=true; fi; fi; parsed_params+=("$match")
|
||||
parsed_values+=("$value"); }; required() { local initial_left=("${left[@]}")
|
||||
local node_idx; ((testdepth++)) || true; for node_idx in "$@"; do
|
||||
if ! "node_$node_idx"; then left=("${initial_left[@]}"); ((testdepth--)) || true
|
||||
return 1; fi; done; if [[ $((--testdepth)) -eq 0 ]]; then
|
||||
left=("${initial_left[@]}"); for node_idx in "$@"; do "node_$node_idx"; done; fi
|
||||
return 0; }; optional() { local node_idx; for node_idx in "$@"; do
|
||||
"node_$node_idx"; done; return 0; }; switch() { local i
|
||||
for i in "${!left[@]}"; do local l=${left[$i]}
|
||||
if [[ ${parsed_params[$l]} = "$2" ]]; then
|
||||
left=("${left[@]:0:$i}" "${left[@]:((i+1))}")
|
||||
[[ $testdepth -gt 0 ]] && return 0; if [[ $3 = true ]]; then
|
||||
eval "((var_$1++))" || true; else eval "var_$1=true"; fi; return 0; fi; done
|
||||
return 1; }; stdout() { printf -- "cat <<'EOM'\n%s\nEOM\n" "$1"; }; stderr() {
|
||||
printf -- "cat <<'EOM' >&2\n%s\nEOM\n" "$1"; }; error() {
|
||||
[[ -n $1 ]] && stderr "$1"; stderr "$usage"; _return 1; }; _return() {
|
||||
printf -- "exit %d\n" "$1"; exit "$1"; }; set -e; trimmed_doc=${DOC:1:333}
|
||||
usage=${DOC:37:28}; digest=36916; shorts=(-h -d -n -p)
|
||||
longs=(--help --dev --no-prompt --no-deps); argcounts=(0 0 0 0); node_0(){
|
||||
switch __help 0; }; node_1(){ switch __dev 1; }; node_2(){ switch __no_prompt 2
|
||||
}; node_3(){ switch __no_deps 3; }; node_4(){ optional 0 1 2 3; }; node_5(){
|
||||
optional 4; }; node_6(){ required 5; }; node_7(){ required 6; }
|
||||
cat <<<' docopt_exit() { [[ -n $1 ]] && printf "%s\n" "$1" >&2
|
||||
printf "%s\n" "${DOC:37:28}" >&2; exit 1; }'; unset var___help var___dev \
|
||||
var___no_prompt var___no_deps; parse 7 "$@"; local prefix=${DOCOPT_PREFIX:-''}
|
||||
unset "${prefix}__help" "${prefix}__dev" "${prefix}__no_prompt" \
|
||||
"${prefix}__no_deps"; eval "${prefix}"'__help=${var___help:-false}'
|
||||
eval "${prefix}"'__dev=${var___dev:-false}'
|
||||
eval "${prefix}"'__no_prompt=${var___no_prompt:-false}'
|
||||
eval "${prefix}"'__no_deps=${var___no_deps:-false}'; local docopt_i=1
|
||||
[[ $BASH_VERSION =~ ^4.3 ]] && docopt_i=2; for ((;docopt_i>0;docopt_i--)); do
|
||||
declare -p "${prefix}__help" "${prefix}__dev" "${prefix}__no_prompt" \
|
||||
"${prefix}__no_deps"; done; }
|
||||
# docopt parser above, complete command for generating this parser is `docopt.sh installer`
|
||||
|
||||
function prompt_confirm {
|
||||
if [ "$no_prompt" == "true" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
read -rp "Continue? [y/N]? " choice
|
||||
|
||||
case "$choice" in
|
||||
y|Y ) return ;;
|
||||
* ) exit;;
|
||||
esac
|
||||
}
|
||||
|
||||
function show_banner {
|
||||
echo ""
|
||||
echo " ____ ____ _ _ "
|
||||
echo " / ___|___ ___ _ __ / ___| | ___ _ _ __| |"
|
||||
echo " | | / _ \ _____ / _ \| '_ \ | | | |/ _ \| | | |/ _' |"
|
||||
echo " | |__| (_) |_____| (_) | |_) | | |___| | (_) | |_| | (_| |"
|
||||
echo " \____\___/ \___/| .__/ \____|_|\___/ \__,_|\__,_|"
|
||||
echo " |_|"
|
||||
echo ""
|
||||
}
|
||||
|
||||
function install_docker {
|
||||
sudo apt-get remove docker docker-engine docker.io containerd runc
|
||||
sudo apt-get install -yq \
|
||||
apt-transport-https \
|
||||
ca-certificates \
|
||||
gnupg \
|
||||
lsb-release
|
||||
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
echo \
|
||||
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
|
||||
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
sudo apt-get update
|
||||
sudo apt-get install -yq docker-ce docker-ce-cli containerd.io
|
||||
}
|
||||
|
||||
function install_requirements {
|
||||
if [ -f "/etc/debian_version" ]; then
|
||||
echo "Detected Debian based distribution, attempting to install system requirements..."
|
||||
|
||||
sudo apt update && sudo apt install -y \
|
||||
passwdqc \
|
||||
pwgen \
|
||||
git
|
||||
|
||||
echo "Install Docker (https://docs.docker.com/engine/install/debian/)?"
|
||||
prompt_confirm
|
||||
install_docker
|
||||
else
|
||||
echo "Sorry, we only support Debian based distributions at the moment"
|
||||
echo "You'll have to install the requirements manually for your distribution"
|
||||
echo "See https://git.coopcloud.tech/coop-cloud/abra#requirements for more"
|
||||
fi
|
||||
}
|
||||
|
||||
function install_abra_release {
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
|
@ -24,7 +193,21 @@ function install_abra_dev {
|
|||
}
|
||||
|
||||
function run_installation {
|
||||
if [ "$1" = "--dev" ]; then
|
||||
show_banner
|
||||
|
||||
DOCOPT_PREFIX=installer_
|
||||
DOCOPT_ADD_HELP=false
|
||||
eval "$(docopt "$@")"
|
||||
|
||||
dev="$installer___dev"
|
||||
no_prompt="$installer___no_prompt"
|
||||
no_deps="$installer___no_deps"
|
||||
|
||||
if [ "$no_deps" == "false" ]; then
|
||||
install_requirements
|
||||
fi
|
||||
|
||||
if [ "$dev" == "true" ]; then
|
||||
install_abra_dev
|
||||
else
|
||||
install_abra_release
|
||||
|
|
43
makefile
43
makefile
|
@ -1,4 +1,4 @@
|
|||
.PHONY: test shellcheck docopt kcov codecov release-installer
|
||||
.PHONY: test shellcheck docopt release-installer build push deploy-docopt symlink
|
||||
|
||||
test:
|
||||
@sudo DOCKER_CONTEXT=default docker run \
|
||||
|
@ -7,7 +7,7 @@ test:
|
|||
-d \
|
||||
--name=abra-test-dind \
|
||||
-e DOCKER_TLS_CERTDIR="" \
|
||||
decentral1se/docker-dind-bats-kcov
|
||||
decentral1se/docker-dind-bats-kcov \
|
||||
@DOCKER_CONTEXT=default sudo docker exec \
|
||||
-it \
|
||||
abra-test-dind \
|
||||
|
@ -21,8 +21,9 @@ shellcheck:
|
|||
--rm \
|
||||
-v $$(pwd):/workdir \
|
||||
koalaman/shellcheck-alpine \
|
||||
shellcheck /workdir/abra && \
|
||||
shellcheck /workdir/bin/*.sh
|
||||
sh -c "shellcheck /workdir/abra && \
|
||||
shellcheck /workdir/bin/*.sh && \
|
||||
shellcheck /workdir/deploy/install.abra.coopcloud.tech/installer"
|
||||
|
||||
docopt:
|
||||
@if [ ! -d ".venv" ]; then \
|
||||
|
@ -32,18 +33,13 @@ docopt:
|
|||
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)
|
||||
deploy-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 deploy/install.abra.coopcloud.tech/installer
|
||||
|
||||
release-installer:
|
||||
@DOCKER_CONTEXT=swarm.autonomic.zone \
|
||||
|
@ -51,8 +47,13 @@ release-installer:
|
|||
cd deploy/install.abra.coopcloud.tech && \
|
||||
DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-installer-script
|
||||
|
||||
release-apps:
|
||||
@DOCKER_CONTEXT=swarm.autonomic.zone \
|
||||
docker stack rm abra-apps-json && \
|
||||
cd deploy/apps.coopcloud.tech && \
|
||||
DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-apps-json
|
||||
build:
|
||||
@docker build -t thecoopcloud/abra .
|
||||
|
||||
push: build
|
||||
@docker push thecoopcloud/abra
|
||||
|
||||
symlink:
|
||||
@mkdir -p ~/.abra/servers/ && \
|
||||
ln -srf tests/default ~/.abra/servers && \
|
||||
ln -srf tests/apps/* ~/.abra/apps
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
|
||||
# The goal of this compose file is to have a testing ground for understanding
|
||||
# what cases we need to handle to get stable deployments. For that, we need to
|
||||
# work with healthchecks and deploy configurations quite closely. If you run
|
||||
# the `make symlink` target then this will be loaded into a "fake" app on your
|
||||
# local machine which you can deploy with `abra`.
|
||||
|
||||
version: "3.8"
|
||||
services:
|
||||
r1_should_work:
|
||||
image: redis:alpine
|
||||
deploy:
|
||||
update_config:
|
||||
failure_action: rollback
|
||||
order: start-first
|
||||
rollback_config:
|
||||
order: start-first
|
||||
restart_policy:
|
||||
max_attempts: 1
|
||||
healthcheck:
|
||||
test: redis-cli ping
|
||||
interval: 2s
|
||||
retries: 3
|
||||
start_period: 1s
|
||||
timeout: 3s
|
||||
|
||||
r2_broken_health_check:
|
||||
image: redis:alpine
|
||||
deploy:
|
||||
update_config:
|
||||
failure_action: rollback
|
||||
order: start-first
|
||||
rollback_config:
|
||||
order: start-first
|
||||
restart_policy:
|
||||
max_attempts: 3
|
||||
healthcheck:
|
||||
test: foobar
|
||||
interval: 2s
|
||||
retries: 3
|
||||
start_period: 1s
|
||||
timeout: 3s
|
||||
|
||||
r3_no_health_check:
|
||||
image: redis:alpine
|
||||
deploy:
|
||||
update_config:
|
||||
failure_action: rollback
|
||||
order: start-first
|
||||
rollback_config:
|
||||
order: start-first
|
||||
restart_policy:
|
||||
max_attempts: 3
|
||||
|
||||
r4_disabled_health_check:
|
||||
image: redis:alpine
|
||||
deploy:
|
||||
update_config:
|
||||
failure_action: rollback
|
||||
order: start-first
|
||||
rollback_config:
|
||||
order: start-first
|
||||
restart_policy:
|
||||
max_attempts: 3
|
||||
healthcheck:
|
||||
disable: true
|
||||
|
||||
r5_should_also_work:
|
||||
image: redis:alpine
|
||||
deploy:
|
||||
update_config:
|
||||
failure_action: rollback
|
||||
order: start-first
|
||||
rollback_config:
|
||||
order: start-first
|
||||
restart_policy:
|
||||
max_attempts: 1
|
||||
healthcheck:
|
||||
test: redis-cli ping
|
||||
interval: 2s
|
||||
retries: 3
|
||||
start_period: 1s
|
||||
timeout: 3s
|
|
@ -0,0 +1 @@
|
|||
TYPE=works
|
Loading…
Reference in New Issue