Compare commits
	
		
			141 Commits
		
	
	
		
			prompt-cle
			...
			version_ch
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5b2e37a7b2 | |||
| 9f835318d2 | |||
| 8f7997a70b | |||
| 035b05ca86 | |||
| 98cf63f7aa | |||
| 672df64011 | |||
| 0581559783 | |||
| cdd196346a | |||
| 78287fec37 | |||
| 4b820457de | |||
| 8519cb8661 | |||
| 3c30d3621b | |||
| 76a0badc5a | |||
| b2e0a95a11 | |||
| ace854e1d7 | |||
| bd7688f9e7 | |||
| d7a4c2cebe | |||
| d9a0922b2c | |||
| 32a86e0317 | |||
| b1c5391a91 | |||
| b813f6b90e | |||
| 73de76fc04 | |||
| 5c5cbbf20f | |||
| 19498d9494 | |||
| 6f6a9ab413 | |||
| aa81d26d08 | |||
| cc4efe69bf | |||
| 6c7b53f585 | |||
| 32bf28e7a9 | |||
| 624815e5b1 | |||
| e9fb9e56ad | |||
| 283eb21e29 | |||
| 92f49d56dd | |||
| d9ff48b55b | |||
| 3d8ce3492e | |||
| 07696760b7 | |||
| 43b4a01f8a | |||
| bb3b324e07 | |||
| eb9d1b883b | |||
| 6f6140ced2 | |||
| cb225908d0 | |||
| f2892bad6f | |||
| 480b1453ec | |||
| 0ab2b3a652 | |||
| 93714a593b | |||
| 57f3f96bbc | |||
| e1959506c7 | |||
| 7482362af1 | |||
| e8510c8aeb | |||
| 4042e10985 | |||
| f7cd0eb54c | |||
| a571b839a8 | |||
| fae13d9af8 | |||
| 9c9f7225e7 | |||
| 352cc0939b | |||
| 2ca7884bbe | |||
| fa54705f79 | |||
| 8d802c78aa | |||
| 1c022fb616 | |||
| 0655c03434 | |||
| f6bdf596f5 | |||
| 6c6e6808c9 | |||
| a3ffd7f239 | |||
| a019417fd2 | |||
| 743600b94e | |||
| f4c2da894b | |||
| 4ef433312d | |||
| 9f69532dca | |||
| 3a97358f30 | |||
| 1e19805757 | |||
| 389ad9d049 | |||
| 93ffc633f3 | |||
| b61c9410a0 | |||
| bbab900ebc | |||
| 36d4dbc5cf | |||
| a4ade1463f | |||
| 20af4666c6 | |||
| d15b031f33 | |||
| a7f0bbde62 | |||
| 76d5a1026a | |||
| 7b0fb50e7f | |||
| f92364af80 | |||
| ca2a3c8b58 | |||
| a5c5526948 | |||
| d16eb0e309 | |||
| 3cff8aaada | |||
| 4ff4c83154 | |||
| f953743a7c | |||
| e84062e67c | |||
| e573794367 | |||
| 87f9c16db4 | |||
| 9fadc430a7 | |||
| 53cec2469b | |||
| a1de7f10cb | |||
| ece968478d | |||
| 3759bcd641 | |||
| 0ff08b5d34 | |||
| 8b541623ad | |||
| f24259dbfc | |||
| 40259f5e97 | |||
| fd471eb3f1 | |||
| a4633f06bd | |||
| 0d6031fef9 | |||
| 64d578cf91 | |||
| e216fe290b | |||
| 207278af75 | |||
| ff309182ea | |||
| 542cf793d2 | |||
| ad1fe2b8d7 | |||
| 0771d58b69 | |||
| b24cdce354 | |||
| 499cc46583 | |||
| 0af0ea096f | |||
| 925df196fc | |||
| efad71c470 | |||
| cac13fb64e | |||
| 42923ced55 | |||
| 6a12955649 | |||
| ceccb28380 | |||
| b033fe9450 | |||
| 0e29e78144 | |||
| c92f80cf7e | |||
| a7f7c965c4 | |||
| e04c5228de | |||
| 6c9dff0eed | |||
| c45598d7b4 | |||
| 4e1c3bfe2f | |||
| 615c6b0614 | |||
| b14219b492 | |||
| 8c93d1ae88 | |||
| cf2ae05dfd | |||
| 70974690f9 | |||
| a4f3fc5ce2 | |||
| 8a4f82ba84 | |||
| a1534a244a | |||
| fccd7865f5 | |||
| 4e84664310 | |||
| 047c0e6d47 | |||
| fc2d770099 | |||
| 1b85bf3d37 | |||
| 2d6a08a671 | 
							
								
								
									
										79
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								.drone.yml
									
									
									
									
									
								
							| @ -3,47 +3,86 @@ kind: pipeline | |||||||
| name: linters | name: linters | ||||||
| steps: | steps: | ||||||
|   - name: run shellcheck |   - name: run shellcheck | ||||||
|     image: koalaman/shellcheck-alpine:v0.7.1 |     image: koalaman/shellcheck-alpine | ||||||
|     commands: |     commands: | ||||||
|       - shellcheck abra |       - shellcheck abra | ||||||
|       - shellcheck bin/*.sh |       - shellcheck bin/*.sh | ||||||
|  |       - shellcheck deploy/install.abra.coopcloud.tech/installer | ||||||
|  |  | ||||||
|   - name: run flake8 |   - name: run flake8 | ||||||
|     image: alpine/flake8:3.9.0 |     image: alpine/flake8 | ||||||
|     commands: |     commands: | ||||||
|       - flake8 --max-line-length 100 bin/app-json.py |       - flake8 --max-line-length 100 bin/*.py | ||||||
|  |  | ||||||
|   - name: run unit tests |   - name: run unit tests | ||||||
|     image: decentral1se/docker-dind-bats-kcov |     image: decentral1se/docker-dind-bats-kcov | ||||||
|     commands: |     commands: | ||||||
|       - bats tests |       - bats tests | ||||||
|  |  | ||||||
|   - name: collect code coverage |   - name: test installation script | ||||||
|     failure: ignore # until we fix this |     image: debian:buster | ||||||
|     image: decentral1se/docker-dind-bats-kcov |  | ||||||
|     commands: |     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 |   - name: publish image | ||||||
|     failure: ignore # until we fix this |     image: plugins/docker | ||||||
|     image: plugins/codecov |  | ||||||
|     settings: |     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://drone.autonomic.zone | ||||||
|       token: |       token: | ||||||
|         from_secret: codecov_token |         from_secret: decentral1se_token | ||||||
|         required: true |       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 |   - name: notify on failure | ||||||
|     image: plugins/slack |     image: plugins/matrix | ||||||
|     settings: |     settings: | ||||||
|       webhook: |       homeserver: https://matrix.autonomic.zone | ||||||
|         from_secret: rc_builds_url |       roomid: "IFazIpLtxiScqbHqoa:autonomic.zone" | ||||||
|       username: comradebritney |       userid: "@autono-bot:autonomic.zone" | ||||||
|       channel: "internal.builds" |       accesstoken: | ||||||
|       template: "{{repo.owner}}/{{repo.name}} build failed: {{build.link}}" |         from_secret: autono_bot_access_token | ||||||
|  |     depends_on: | ||||||
|  |       - run shellcheck | ||||||
|  |       - run flake8 | ||||||
|  |       - run unit tests | ||||||
|  |       - test installation script | ||||||
|  |       - publish image | ||||||
|  |       - trigger downstream builds | ||||||
|     when: |     when: | ||||||
|       status: |       status: | ||||||
|         - failure |         - failure | ||||||
|  |  | ||||||
| trigger: | trigger: | ||||||
|   branch: |   branch: | ||||||
|     - main |     - main | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,5 @@ | |||||||
|  | *.json | ||||||
|  | *.pyc | ||||||
| /.venv | /.venv | ||||||
|  | __pycache__ | ||||||
| coverage/ | coverage/ | ||||||
|  | |||||||
							
								
								
									
										101
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @ -9,34 +9,83 @@ | |||||||
|  |  | ||||||
| # abra x.x.x (UNRELEASED) | # abra x.x.x (UNRELEASED) | ||||||
|  |  | ||||||
|  | # 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` ([`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 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)) | ||||||
|  | - 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 `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) | # abra 0.7.4 (2021-05-10) | ||||||
|  |  | ||||||
| - Sort `apps.json` when publishing ([39a7fc0](https://git.autonomic.zone/coop-cloud/abra/commit/39a7fc04fb5df1a6d78b84f51838530ab3eb76db)) | - 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)) | - 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)) | - 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)) | - Fix secret generation when specifying length ([`3a353f4`](https://git.autonomic.zone/coop-cloud/abra/commit/3a353f4062baccde2c9f175b03afb2db6d462ae4)) | ||||||
|  |  | ||||||
| # abra 0.7.3 (2021-04-28) | # 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)) | - 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)) | - 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)) | - 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) | # 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) | # 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) | # 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - Show correct status for apps deployed on servers with missing context ([#99](https://git.autonomic.zone/coop-cloud/abra/issues/99)) | ||||||
| @ -51,53 +100,53 @@ | |||||||
| - Recognise when apps are already undeployed with `abra app <app> undeploy` ([#123](https://git.autonomic.zone/coop-cloud/abra/issues/123)) | - 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 `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)) | - 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)) | - 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)) | - 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)) | - 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) | # 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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)) | - 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 `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 git digest to `abra version` output ([`8b41416`](https://git.autonomic.zone/coop-cloud/abra/commit/8b41416)) | ||||||
|  |  | ||||||
| # abra 0.5.0 (2021-03-01) | # 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)) | - `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)) | - 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)) | - 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)) | - 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)) | - 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)) | - "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)) | - 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)) | - 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)) | - `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)) | - 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)) | - 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)) | - 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)) | - 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)) | - `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)) | - 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)) | - `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)) | - 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)) | - Show per-subcommand help by adding `-h/--help` to a command line ([#38](https://git.autonomic.zone/coop-cloud/abra/issues/78)) | ||||||
|  | |||||||
							
								
								
									
										33
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -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.autonomic.zone > ~/.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,10 @@ | |||||||
| # abra | # abra | ||||||
|  |  | ||||||
| [](https://drone.autonomic.zone/coop-cloud/abra) | [](https://drone.autonomic.zone/coop-cloud/abra) | ||||||
| [](undefined) |  | ||||||
|  |  | ||||||
| > https://coopcloud.tech | > 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. | `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,21 +25,40 @@ See [CHANGELOG.md](./CHANGELOG.md). | |||||||
|  |  | ||||||
| > [docs.coopcloud.tech](https://docs.coopcloud.tech) | > [docs.coopcloud.tech](https://docs.coopcloud.tech) | ||||||
|  |  | ||||||
|  | ## Requirements | ||||||
|  |  | ||||||
|  | - `curl` | ||||||
|  | - `docker` | ||||||
|  | - `bash` >= 4 | ||||||
|  |  | ||||||
| ## Install | ## Install | ||||||
|  |  | ||||||
| Install the latest stable release: | Install the latest stable release: | ||||||
|  |  | ||||||
| ```sh | ```sh | ||||||
| curl https://install.abra.autonomic.zone | bash | 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 | ```sh | ||||||
| curl https://install.abra.autonomic.zone | bash -s -- --dev | curl https://install.abra.coopcloud.tech | bash -s -- --dev | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| The source for this script is [here](./deploy/install.abra.autonomic.zone/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 | ## Update | ||||||
|  |  | ||||||
| @ -53,41 +71,22 @@ To update the development version, run `abra upgrade --dev`. | |||||||
|  |  | ||||||
| It's written in Bash version 4 or greater! | It's written in Bash version 4 or greater! | ||||||
|  |  | ||||||
| Install it via `curl https://install.abra.autonomic.zone | bash -s -- --dev`, then you can hack on the source in `~/.abra/src`. | Install it via `curl https://install.abra.coopcloud.tech | bash -s -- --dev`, then you can hack on the source in `~/.abra/src`. | ||||||
|  |  | ||||||
| The command-line interface is generated via [docopt](http://docopt.org/). If you add arguments then you need to run `make docopt` ro regenerate the parser. | The command-line interface is generated via [docopt](http://docopt.org/). If you add arguments then you need to run `make docopt` ro regenerate the parser. | ||||||
|  |  | ||||||
| Please remember to update the [CHANGELOG](./CHANGELOG.md) when you make a change. | 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 | ## Releasing | ||||||
|  |  | ||||||
| ### `abra` | ### `abra` | ||||||
|  |  | ||||||
| > [install.abra.autonomic.zone](https://install.abra.autonomic.zone) | > [install.abra.coopcloud.tech](https://install.abra.coopcloud.tech) | ||||||
|  |  | ||||||
| - Change the `x.x.x` header in [CHANGELOG.md](./CHANGELOG.md) to reflect new version and mark date | - Change the `x.x.x` header in [CHANGELOG.md](./CHANGELOG.md) to reflect new version and mark date | ||||||
| - Update the version in [abra](./abra) | - Update the version in [abra](./abra) | ||||||
| - Update the version in [deploy/install.abra.autonomic.zone/installer](./deploy/install.abra.autonomic.zone/installer) | - Update the version in [deploy/install.abra.coopcloud.tech/installer](./deploy/install.abra.coopcloud.tech/installer) | ||||||
| - `git commit` the above changes and then tag it with `git tag <your-new-version>` | - `git commit` the above changes and then tag it with `git tag <your-new-version>` | ||||||
| - `git push` and `git push --tags` | - `git push` and `git push --tags` | ||||||
| - Deploy a new installer script `make release-installer` | - Deploy a new installer script `make release-installer` | ||||||
| - Tell the world (CoTech forum, Matrix public channel, Autonomic mastodon, etc.) | - 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 |  | ||||||
| ``` |  | ||||||
|  | |||||||
							
								
								
									
										110
									
								
								bin/abralib.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								bin/abralib.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | |||||||
|  | """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-apps", | ||||||
|  |     "abra-gandi", | ||||||
|  |     "abra-hetzner", | ||||||
|  |     "apps", | ||||||
|  |     "auto-apps-json", | ||||||
|  |     "auto-mirror", | ||||||
|  |     "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", | ||||||
|  |     "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.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) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 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") | ||||||
							
								
								
									
										133
									
								
								bin/app-json.py
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								bin/app-json.py
									
									
									
									
									
								
							| @ -6,84 +6,44 @@ | |||||||
| # ~/.abra/apps), and format it as JSON so that it can be hosted here: | # ~/.abra/apps), and format it as JSON so that it can be hosted here: | ||||||
| # https://apps.coopcloud.tech | # https://apps.coopcloud.tech | ||||||
|  |  | ||||||
|  | import argparse | ||||||
| from json import dump | from json import dump | ||||||
| from logging import DEBUG, basicConfig, getLogger | from os import chdir, environ, getcwd, listdir | ||||||
| from os import chdir, listdir, mkdir | from os.path import basename | ||||||
| from os.path import basename, exists, expanduser |  | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
| from re import findall, search | from re import findall, search | ||||||
| from shlex import split | from subprocess import DEVNULL | ||||||
| from subprocess import DEVNULL, check_output |  | ||||||
| from sys import exit |  | ||||||
|  |  | ||||||
| from requests import get | from requests import get | ||||||
|  |  | ||||||
| HOME_PATH = expanduser("~/") | from abralib import ( | ||||||
| CLONES_PATH = Path(f"{HOME_PATH}/.abra/apps").absolute() |     CLONES_PATH, | ||||||
| YQ_PATH = Path(f"{HOME_PATH}/.abra/vendor/yq") |     JQ_PATH, | ||||||
| SCRIPT_PATH = Path(__file__).absolute().parent |     REPOS_TO_SKIP, | ||||||
| REPOS_TO_SKIP = ( |     YQ_PATH, | ||||||
|     "abra", |     _run_cmd, | ||||||
|     "abra-apps", |     clone_all_apps, | ||||||
|     "abra-gandi", |     get_repos_json, | ||||||
|     "abra-hetzner", |     log, | ||||||
|     "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", |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| log = getLogger(__name__) | parser = argparse.ArgumentParser(description="Generate a new apps.json") | ||||||
| basicConfig() | parser.add_argument("--output", type=Path, default=f"{getcwd()}/apps.json") | ||||||
| log.setLevel(DEBUG) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def _run_cmd(cmd, shell=False, **kwargs): | def skopeo_login(): | ||||||
|     """Run a shell command.""" |     """Log into the docker registry to avoid rate limits.""" | ||||||
|     args = [split(cmd)] |     user = environ.get("SKOPEO_USER") | ||||||
|  |     password = environ.get("SKOPEO_PASSWORD") | ||||||
|  |     registry = environ.get("SKOPEO_REGISTRY", "docker.io") | ||||||
|  |  | ||||||
|     if shell: |     if not user or not password: | ||||||
|         args = [cmd] |         log.info("Failed to log in via Skopeo due to missing env vars") | ||||||
|         kwargs = {"shell": shell} |         return | ||||||
|  |  | ||||||
|     try: |     login_cmd = f"skopeo login {registry} -u {user} -p {password}" | ||||||
|         return check_output(*args, **kwargs).decode("utf-8").strip() |     output = _run_cmd(login_cmd, shell=True) | ||||||
|     except Exception as exception: |     log.info(f"Skopeo login attempt: {output}") | ||||||
|         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) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def get_published_apps_json(): | def get_published_apps_json(): | ||||||
| @ -99,31 +59,6 @@ def get_published_apps_json(): | |||||||
|         return {} |         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): | def generate_apps_json(repos_json): | ||||||
|     """Generate the abra-apps.json application versions file.""" |     """Generate the abra-apps.json application versions file.""" | ||||||
|     apps_json = {} |     apps_json = {} | ||||||
| @ -140,7 +75,8 @@ def generate_apps_json(repos_json): | |||||||
|         chdir(app_path) |         chdir(app_path) | ||||||
|  |  | ||||||
|         metadata = get_app_metadata(app_path) |         metadata = get_app_metadata(app_path) | ||||||
|         name = metadata.pop("name", "") |  | ||||||
|  |         name = metadata.pop("name", app) | ||||||
|  |  | ||||||
|         log.info(f"Processing {app}") |         log.info(f"Processing {app}") | ||||||
|         apps_json[app] = { |         apps_json[app] = { | ||||||
| @ -173,7 +109,7 @@ def get_app_metadata(app_path): | |||||||
|         return {} |         return {} | ||||||
|  |  | ||||||
|     try: |     try: | ||||||
|         for match in findall(r"\*\*.*\s\*", contents): |         for match in findall(r"\*\*.*", contents): | ||||||
|             title = search(r"(?<=\*\*).*(?=\*\*)", match).group().lower() |             title = search(r"(?<=\*\*).*(?=\*\*)", match).group().lower() | ||||||
|  |  | ||||||
|             if title == "image": |             if title == "image": | ||||||
| @ -256,7 +192,7 @@ def get_app_versions(app_path, cached_apps_json): | |||||||
|                 if image in ("null", "---"): |                 if image in ("null", "---"): | ||||||
|                     continue |                     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) |                 output = _run_cmd(images_cmd, shell=True) | ||||||
|  |  | ||||||
|                 service_version_info = { |                 service_version_info = { | ||||||
| @ -279,11 +215,14 @@ def get_app_versions(app_path, cached_apps_json): | |||||||
|  |  | ||||||
| def main(): | def main(): | ||||||
|     """Run the script.""" |     """Run the script.""" | ||||||
|  |     args = parser.parse_args() | ||||||
|  |  | ||||||
|  |     skopeo_login() | ||||||
|  |  | ||||||
|     repos_json = get_repos_json() |     repos_json = get_repos_json() | ||||||
|     clone_all_apps(repos_json) |     clone_all_apps(repos_json) | ||||||
|  |  | ||||||
|     target = f"{SCRIPT_PATH}/../deploy/apps.coopcloud.tech/apps.json" |     with open(args.output, "w", encoding="utf-8") as handle: | ||||||
|     with open(target, "w", encoding="utf-8") as handle: |  | ||||||
|         dump( |         dump( | ||||||
|             generate_apps_json(repos_json), |             generate_apps_json(repos_json), | ||||||
|             handle, |             handle, | ||||||
| @ -292,7 +231,7 @@ def main(): | |||||||
|             sort_keys=True, |             sort_keys=True, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     log.info(f"Successfully generated {target}") |     log.info(f"Successfully generated {args.output}") | ||||||
|  |  | ||||||
|  |  | ||||||
| main() | main() | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								bin/clone-all-apps.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								bin/clone-all-apps.py
									
									
									
									
									
										Executable file
									
								
							| @ -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() | ||||||
							
								
								
									
										49
									
								
								bin/github-sync.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										49
									
								
								bin/github-sync.py
									
									
									
									
									
										Executable file
									
								
							| @ -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() | ||||||
							
								
								
									
										20
									
								
								bin/renovate-ls-apps.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								bin/renovate-ls-apps.py
									
									
									
									
									
										Executable file
									
								
							| @ -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() | ||||||
| @ -38,6 +38,22 @@ _abra_complete_apps() | |||||||
|     mapfile -t COMPREPLY < <(compgen -W "$(_abra_apps)" -- "$1") |     mapfile -t COMPREPLY < <(compgen -W "$(_abra_apps)" -- "$1") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | _abra_recipes() | ||||||
|  | { | ||||||
|  |     shopt -s nullglob dotglob | ||||||
|  |     local RECIPES=(~/.abra/apps/*) | ||||||
|  |     shopt -u nullglob dotglob | ||||||
|  |  | ||||||
|  |     for RECIPE in "${RECIPES[@]}"; do | ||||||
|  |         _abra_basename "${RECIPE%.env}" | ||||||
|  |     done | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _abra_complete_recipes() | ||||||
|  | { | ||||||
|  |     mapfile -t COMPREPLY < <(compgen -W "$(_abra_recipes)" -- "$1") | ||||||
|  | } | ||||||
|  |  | ||||||
| _abra_complete() | _abra_complete() | ||||||
| { | { | ||||||
|     compopt +o default +o nospace |     compopt +o default +o nospace | ||||||
| @ -46,6 +62,7 @@ _abra_complete() | |||||||
|     local -r cmds=' |     local -r cmds=' | ||||||
|         app |         app | ||||||
|         server |         server | ||||||
|  |         recipe | ||||||
|     ' |     ' | ||||||
|     local -r short_opts='-e      -h     -s      -v' |     local -r short_opts='-e      -h     -s      -v' | ||||||
|     local -r long_opts='--env --help --stack --version' |     local -r long_opts='--env --help --stack --version' | ||||||
| @ -101,6 +118,12 @@ _abra_complete() | |||||||
|                     _abra_complete_apps "$cur" |                     _abra_complete_apps "$cur" | ||||||
|                 fi |                 fi | ||||||
|                 ;; |                 ;; | ||||||
|  |             recipe) | ||||||
|  |                 # Offer exactly one app completion. | ||||||
|  |                 if (( COMP_CWORD == cmd_index + 1 )); then | ||||||
|  |                     _abra_complete_recipes "$cur" | ||||||
|  |                 fi | ||||||
|  |                 ;; | ||||||
|             #help) |             #help) | ||||||
|             #    # Offer exactly one command name completion. |             #    # Offer exactly one command name completion. | ||||||
|             #    if (( COMP_CWORD == cmd_index + 1 )); then |             #    if (( COMP_CWORD == cmd_index + 1 )); then | ||||||
|  | |||||||
										
											
												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,35 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| ABRA_VERSION="0.7.4" |  | ||||||
| GIT_URL="https://git.autonomic.zone/coop-cloud/abra" |  | ||||||
| ABRA_SRC="$GIT_URL/raw/tag/$ABRA_VERSION/abra" |  | ||||||
| ABRA_DIR="${ABRA_DIR:-$HOME/.abra/}" |  | ||||||
|  |  | ||||||
| function install_abra_release { |  | ||||||
|   mkdir -p "$HOME/.local/bin" |  | ||||||
|   curl "$ABRA_SRC" > "$HOME/.local/bin/abra" |  | ||||||
|   chmod +x "$HOME/.local/bin/abra" |  | ||||||
|   echo "abra installed to $HOME/.local/bin/abra" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function install_abra_dev { |  | ||||||
|   mkdir -p "$ABRA_DIR/" |  | ||||||
|   if [[ ! -d "$ABRA_DIR/src" ]]; then |  | ||||||
|     git clone "$GIT_URL" "$ABRA_DIR/src" |  | ||||||
|   fi |  | ||||||
|   (cd "$ABRA_DIR/src" && git pull origin main && cd - || exit) |  | ||||||
|   mkdir -p "$HOME/.local/bin" |  | ||||||
|   ln -sf "$ABRA_DIR/src/abra" "$HOME/.local/bin/abra" |  | ||||||
|   echo "abra installed to $HOME/.local/bin/abra (development bleeding edge)" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function run_installation { |  | ||||||
|   if [ "$1" = "--dev" ]; then |  | ||||||
|     install_abra_dev |  | ||||||
|   else |  | ||||||
|     install_abra_release |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
|  |  | ||||||
| run_installation "$@" |  | ||||||
| exit 0 |  | ||||||
| @ -20,7 +20,7 @@ services: | |||||||
|       labels: |       labels: | ||||||
|         - "traefik.enable=true" |         - "traefik.enable=true" | ||||||
|         - "traefik.http.services.abra-installer.loadbalancer.server.port=80" |         - "traefik.http.services.abra-installer.loadbalancer.server.port=80" | ||||||
|         - "traefik.http.routers.abra-installer.rule=Host(`install.abra.autonomic.zone`)" |         - "traefik.http.routers.abra-installer.rule=Host(`install.abra.autonomic.zone`,`install.abra.coopcloud.tech`)" | ||||||
|         - "traefik.http.routers.abra-installer.entrypoints=web-secure" |         - "traefik.http.routers.abra-installer.entrypoints=web-secure" | ||||||
|         - "traefik.http.routers.abra-installer.tls.certresolver=production" |         - "traefik.http.routers.abra-installer.tls.certresolver=production" | ||||||
| 
 | 
 | ||||||
							
								
								
									
										217
									
								
								deploy/install.abra.coopcloud.tech/installer
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										217
									
								
								deploy/install.abra.coopcloud.tech/installer
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,217 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  |  | ||||||
|  | # shellcheck disable=SC2154,SC2034 | ||||||
|  |  | ||||||
|  | ABRA_VERSION="10.0.0" | ||||||
|  | GIT_URL="https://git.autonomic.zone/coop-cloud/abra" | ||||||
|  | ABRA_SRC="$GIT_URL/raw/tag/$ABRA_VERSION/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 | ||||||
|  |  | ||||||
|  |     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.autonomic.zone/coop-cloud/abra#requirements for more" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function install_abra_release { | ||||||
|  |   mkdir -p "$HOME/.local/bin" | ||||||
|  |   curl "$ABRA_SRC" > "$HOME/.local/bin/abra" | ||||||
|  |   chmod +x "$HOME/.local/bin/abra" | ||||||
|  |   echo "abra installed to $HOME/.local/bin/abra" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function install_abra_dev { | ||||||
|  |   mkdir -p "$ABRA_DIR/" | ||||||
|  |   if [[ ! -d "$ABRA_DIR/src" ]]; then | ||||||
|  |     git clone "$GIT_URL" "$ABRA_DIR/src" | ||||||
|  |   fi | ||||||
|  |   (cd "$ABRA_DIR/src" && git pull origin main && cd - || exit) | ||||||
|  |   mkdir -p "$HOME/.local/bin" | ||||||
|  |   ln -sf "$ABRA_DIR/src/abra" "$HOME/.local/bin/abra" | ||||||
|  |   echo "abra installed to $HOME/.local/bin/abra (development bleeding edge)" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function run_installation { | ||||||
|  |   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 | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | run_installation "$@" | ||||||
|  | exit 0 | ||||||
| @ -1,6 +1,6 @@ | |||||||
| server { | server { | ||||||
|   listen         80 default_server; |   listen         80 default_server; | ||||||
|   server_name    install.abra.autonomic.zone; |   server_name    install.abra.autonomic.zone install.abra.coopcloud.tech; | ||||||
| 
 | 
 | ||||||
|   location / { |   location / { | ||||||
|     root /var/www/abra-installer; |     root /var/www/abra-installer; | ||||||
							
								
								
									
										51
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								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: | test: | ||||||
| 	@sudo DOCKER_CONTEXT=default docker run \ | 	@sudo DOCKER_CONTEXT=default docker run \ | ||||||
| @ -7,13 +7,13 @@ test: | |||||||
| 		-d \ | 		-d \ | ||||||
| 		--name=abra-test-dind \ | 		--name=abra-test-dind \ | ||||||
| 		-e DOCKER_TLS_CERTDIR="" \ | 		-e DOCKER_TLS_CERTDIR="" \ | ||||||
| 		decentral1se/docker-dind-bats-kcov | 		decentral1se/docker-dind-bats-kcov \ | ||||||
| 	@DOCKER_CONTEXT=default docker exec \ | 	@DOCKER_CONTEXT=default sudo docker exec \ | ||||||
| 		-it \ | 		-it \ | ||||||
| 		abra-test-dind \ | 		abra-test-dind \ | ||||||
| 		sh -c "cd /workdir && bats /workdir/tests" | 		sh -c "cd /workdir && bats /workdir/tests" | ||||||
| 	@DOCKER_CONTEXT=default docker stop abra-test-dind | 	@DOCKER_CONTEXT=default sudo docker stop abra-test-dind | ||||||
| 	@DOCKER_CONTEXT=default docker rm abra-test-dind | 	@DOCKER_CONTEXT=default sudo docker rm abra-test-dind | ||||||
|  |  | ||||||
| shellcheck: | shellcheck: | ||||||
| 	@docker run \ | 	@docker run \ | ||||||
| @ -21,8 +21,9 @@ shellcheck: | |||||||
| 		--rm \ | 		--rm \ | ||||||
| 		-v $$(pwd):/workdir \ | 		-v $$(pwd):/workdir \ | ||||||
| 		koalaman/shellcheck-alpine \ | 		koalaman/shellcheck-alpine \ | ||||||
| 		shellcheck /workdir/abra && \ | 		sh -c "shellcheck /workdir/abra && \ | ||||||
| 		shellcheck /workdir/bin/*.sh | 		       shellcheck /workdir/bin/*.sh && \ | ||||||
|  | 		       shellcheck /workdir/deploy/install.abra.coopcloud.tech/installer" | ||||||
|  |  | ||||||
| docopt: | docopt: | ||||||
| 	@if [ ! -d ".venv" ]; then \ | 	@if [ ! -d ".venv" ]; then \ | ||||||
| @ -32,27 +33,27 @@ docopt: | |||||||
| 	fi | 	fi | ||||||
| 	.venv/bin/docopt.sh abra | 	.venv/bin/docopt.sh abra | ||||||
|  |  | ||||||
| kcov: | deploy-docopt: | ||||||
| 	@docker run \ | 	@if [ ! -d ".venv" ]; then \ | ||||||
| 		-it \ | 		python3 -m venv .venv && \ | ||||||
| 		--rm \ | 		.venv/bin/pip install -U pip setuptools wheel && \ | ||||||
| 		-v $$(pwd):/workdir \ | 		.venv/bin/pip install docopt-sh; \ | ||||||
| 		kcov/kcov:latest \ | 	fi | ||||||
| 		sh -c "kcov /workdir/coverage /workdir/abra || true" | 	.venv/bin/docopt.sh deploy/install.abra.coopcloud.tech/installer | ||||||
|  |  | ||||||
| codecov: SHELL:=/bin/bash |  | ||||||
| codecov: |  | ||||||
| 	@bash <(curl -s https://codecov.io/bash) \ |  | ||||||
| 		-s coverage -t $$(pass show hosts/swarm.autonomic.zone/drone/codecov/token) |  | ||||||
|  |  | ||||||
| release-installer: | release-installer: | ||||||
| 	@DOCKER_CONTEXT=swarm.autonomic.zone \ | 	@DOCKER_CONTEXT=swarm.autonomic.zone \ | ||||||
| 		docker stack rm abra-installer-script && \ | 		docker stack rm abra-installer-script && \ | ||||||
| 		cd deploy/install.abra.autonomic.zone && \ | 		cd deploy/install.abra.coopcloud.tech && \ | ||||||
| 		DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-installer-script | 		DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-installer-script | ||||||
|  |  | ||||||
| release-apps: | build: | ||||||
| 	@DOCKER_CONTEXT=swarm.autonomic.zone \ | 	@docker build -t thecoopcloud/abra . | ||||||
| 		docker stack rm abra-apps-json && \ |  | ||||||
| 		cd deploy/apps.coopcloud.tech && \ | push: build | ||||||
| 		DOCKER_CONTEXT=swarm.autonomic.zone docker stack deploy -c compose.yml abra-apps-json | 	@docker push thecoopcloud/abra | ||||||
|  |  | ||||||
|  | symlink: | ||||||
|  | 	@mkdir -p ~/.abra/servers/ && \ | ||||||
|  | 	ln -srf tests/default ~/.abra/servers && \ | ||||||
|  | 	ln -srf tests/apps/* ~/.abra/apps | ||||||
|  | |||||||
							
								
								
									
										84
									
								
								tests/apps/works/compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								tests/apps/works/compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||||
							
								
								
									
										1
									
								
								tests/default/works.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/default/works.env
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | TYPE=works | ||||||
		Reference in New Issue
	
	Block a user
	