Compare commits

...
513 Commits
Author SHA1 Message Date
renovate-bot 5d00b3c932 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-09-08 19:01:07 +00:00
renovate-bot a380b5e8ae chore(deps): update module golang.org/x/term to v0.46.0
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build was killed
2026-09-08 18:03:14 +00:00
renovate-bot 9ff5024a58 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2026-09-08 15:04:36 +00:00
renovate-bot d6dd082e59 chore(deps): update module golang.org/x/sys to v0.48.0
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-09-08 14:02:32 +00:00
Weblate 0531f30590 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-09-07 14:34:36 +00:00
moritz 27ca0cd21e test(app new): cover a commit that only exists on another branch
continuous-integration/drone/push Build is passing
2026-09-07 14:34:27 +00:00
moritz 920a898955 fix(git): clone every branch so commits outside the default branch resolve 2026-09-07 14:34:27 +00:00
sixsmith 7cbc974763 chore: mark vendor directory as generated
continuous-integration/drone/push Build is passing
2026-09-03 05:30:34 +00:00
renovate-bot c71b764546 chore(deps): update otel/weaver docker tag to v0.26.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-09-03 02:01:10 +00:00
renovate-bot 5db8430a73 chore(deps): update nginx docker tag to v1.31.5
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-09-02 23:01:08 +00:00
renovate-bot 091c4a2ac1 chore(deps): update otel/weaver docker tag to v0.26.0
continuous-integration/drone/push Build is passing
2026-09-02 19:01:09 +00:00
ChasquiLabo 8e935d08a6 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 22:35:20 +00:00
ChasquiLabo b959c55852 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 21:54:01 +00:00
ChasquiLabo bab9b21882 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 21:42:51 +00:00
ChasquiLabo 703fbf5c8a chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 21:41:22 +00:00
ChasquiLabo aaaf855a6e chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 21:39:07 +00:00
ChasquiLabo a6666be477 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 19:30:19 +00:00
ChasquiLabo ba90b04624 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 19:03:00 +00:00
ChasquiLabo debbdde5d1 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 19:00:21 +00:00
ChasquiLabo 48f62f541f chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 18:56:40 +00:00
ChasquiLabo e6296e4ce4 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 18:53:08 +00:00
ChasquiLabo 423650e8b5 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 18:50:14 +00:00
ChasquiLabo d0c42e37a7 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is failing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:56:31 +00:00
ChasquiLabo 6afd17f1ed chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is running
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:53:56 +00:00
ChasquiLabo cb0eec2203 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:52:45 +00:00
ChasquiLabo f5900b726b chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is failing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:50:52 +00:00
ChasquiLabo 0d9e777c18 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:39:47 +00:00
ChasquiLabo f5cc61c211 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:27:24 +00:00
ChasquiLabo 786ba43b83 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is running
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:24:37 +00:00
ChasquiLabo ee80cfa27f chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is failing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 16:00:49 +00:00
ChasquiLabo bbaca64d36 chore: translation using Weblate (Spanish)
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 15:56:33 +00:00
ChasquiLabo b608ee3985 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is pending
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 15:44:56 +00:00
ChasquiLabo 5e72e28ba6 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is running
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 15:37:17 +00:00
ChasquiLabo 84b18c1a7b chore: translation using Weblate (Spanish)
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 15:26:49 +00:00
ChasquiLabo 249851a556 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is failing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 14:16:43 +00:00
ChasquiLabo 344b4c8d3d chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-09-01 13:12:53 +00:00
renovate-bot 0dd314b53c chore(deps): update nginx docker tag to v1.31.4
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-08-19 21:01:10 +00:00
renovate-bot e9f51526f6 chore(deps): update golang docker tag
continuous-integration/drone/pr Build encountered an error
continuous-integration/drone/push Build encountered an error
2026-08-19 20:01:03 +00:00
renovate-bot ae2080fd9d chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-08-19 15:01:28 +00:00
renovate-bot 8f6ebac2ce chore(deps): update module github.com/stretchr/testify to v1.12.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-08-19 14:01:40 +00:00
renovate-bot 23d67677c6 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-08-17 10:01:49 +00:00
renovate-bot 00d64556bc chore(deps): update module github.com/stretchr/testify to v1.12.0
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2026-08-17 09:04:16 +00:00
ChasquiLabo 70c0accf7f chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-08-11 06:51:47 +00:00
ChasquiLabo 82ae4cb10f chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-08-10 22:00:01 +00:00
ChasquiLabo 99d3cc87b2 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-08-10 02:00:46 +00:00
ChasquiLabo 232d6f39e4 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.6% (1046 of 1154 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-08-09 21:49:50 +00:00
renovate-bot 26089f0886 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-29 14:00:59 +00:00
renovate-bot a1de95a8ce chore(deps): update module github.com/go-git/go-git/v5 to v5.19.2
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-29 12:02:00 +00:00
renovate-bot f4861bf3c1 chore(deps): update otel/weaver docker tag to v0.25.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-29 02:00:47 +00:00
renovate-bot 7fb3b2f591 chore(deps): update otel/weaver docker tag to v0.25.0
continuous-integration/drone/push Build is passing
2026-07-24 20:01:06 +00:00
renovate-bot 0dec68294f chore(deps): update nginx docker tag to v1.31.3
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-16 02:01:04 +00:00
renovate-bot 69ba548dab chore(deps): update dependency codespell to v2.4.3
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-15 12:00:52 +00:00
renovate-bot cfa9ff15bb chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-08 18:01:07 +00:00
renovate-bot ddf7441152 chore(deps): update module golang.org/x/term to v0.45.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-08 17:01:50 +00:00
renovate-bot 20b4a3fb84 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-08 14:01:06 +00:00
renovate-bot 81f4420a67 chore(deps): update module golang.org/x/sys to v0.47.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-07-08 13:01:44 +00:00
renovate-bot b13b10be9a chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-30 21:00:55 +00:00
renovate-bot 8137e56d1e chore(deps): update module github.com/schollz/progressbar/v3 to v3.19.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-30 19:01:51 +00:00
renovate-bot f3943d25d1 chore(deps): update otel/weaver docker tag to v0.24.2
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-23 18:00:57 +00:00
renovate-bot 9859ff46f5 chore(deps): update otel/weaver docker tag to v0.24.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-21 21:01:00 +00:00
renovate-bot 3109a0da82 chore(deps): update otel/weaver docker tag to v0.24.0
continuous-integration/drone/push Build is passing
2026-06-20 00:01:07 +00:00
renovate-bot b1146a707e chore(deps): update nginx docker tag to v1.31.2
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-17 23:01:19 +00:00
Weblate 6d13d14d75 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-06-16 17:41:06 +00:00
Linus Gasser 427ec22cab Running i18n
continuous-integration/drone/push Build is passing
2026-06-16 17:40:58 +00:00
Linus Gasser 1111b69f12 Use docker login credentials from host
I had a lot of failures for pulling the docker images lately,
so I was looking for a way to connect using docker login.
This PR sends the docker login credentials from the host to
the swarm server.
2026-06-16 17:40:58 +00:00
Linus Gasser 1541e6aa6a Also use xgettext-go@latest for .drone.yml
continuous-integration/drone/push Build is passing
2026-06-14 18:37:34 +02:00
Linus Gasser 14ee80582a Use go run for xgettext-go
continuous-integration/drone/pr Build is passing
Before: on a mac, the Makefile downloaded a linux file, which did not work
for updating the i18n.

Now: use 'go run' to run the xgettext-go file. go caches it, so it compiles only
once.
2026-06-14 18:28:45 +02:00
renovate-bot e5c65b8fa0 chore(deps): update alpine docker tag to v3.24
continuous-integration/drone/push Build is passing
2026-06-09 21:00:57 +00:00
Weblate e1b10f6020 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-06-09 14:36:32 +00:00
moritz 8e4ed7b689 chore: make i18n
continuous-integration/drone/push Build is passing
2026-06-09 16:30:08 +02:00
moritz a44fde2df2 fix(new): checkout given recipeVersion before generating env closes #862
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-06-09 16:09:58 +02:00
renovate-bot e623f55852 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-08 17:01:04 +00:00
renovate-bot 11e6f28a60 chore(deps): update module golang.org/x/term to v0.44.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-08 16:01:46 +00:00
renovate-bot acec067d76 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-08 14:01:12 +00:00
renovate-bot f50a57af7a chore(deps): update module golang.org/x/sys to v0.46.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-06-08 13:01:32 +00:00
renovate-bot 776693acc0 chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-22 23:01:07 +00:00
renovate-bot 5dea5f7746 chore(deps): update module golang.org/x/sys to v0.45.0
continuous-integration/drone/push Build is passing
2026-05-22 22:01:49 +00:00
renovate-bot 1d9a289888 chore(deps): update nginx docker tag to v1.31.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-22 21:00:50 +00:00
devydave c7bd55e371 feat: adds nix flake
continuous-integration/drone/push Build is passing
2026-05-20 22:29:47 +00:00
renovate-bot 4276337b0f chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-18 22:01:06 +00:00
renovate-bot 90ca856b64 chore(deps): update module github.com/go-git/go-git/v5 to v5.19.1
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-18 21:01:33 +00:00
renovate-bot f2dd65491d chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-15 16:01:27 +00:00
renovate-bot 0e902ed897 chore(deps): update coopcloud.tech/tagcmp digest to c26951b
continuous-integration/drone/push Build is passing
2026-05-15 14:01:42 +00:00
renovate-bot db001c1ba4 chore(deps): update tonistiigi/xx docker tag to v1.9.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-15 00:00:59 +00:00
renovate-bot e4215c09aa chore(deps): update nginx docker tag to v1.31.0
continuous-integration/drone/push Build is passing
2026-05-14 23:04:17 +00:00
renovate-bot e0e6dcb710 chore(deps): update otel/weaver docker tag to v0.23.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-14 23:00:58 +00:00
renovate-bot e7ddb74a08 chore(deps): update module golang.org/x/term to v0.43.0
continuous-integration/drone/push Build is passing
2026-05-14 22:04:37 +00:00
renovate-bot 24a5e6334f chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-14 22:00:58 +00:00
renovate-bot 9d8eb2317e chore(deps): update module golang.org/x/sys to v0.44.0
continuous-integration/drone/push Build is passing
2026-05-14 21:01:45 +00:00
renovate-bot 5945ea8e1b chore(deps): update module github.com/go-git/go-git/v5 to v5.19.0
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-14 20:01:30 +00:00
renovate-bot e170d1c971 chore(deps): update alpine docker tag to v3.23
continuous-integration/drone/push Build is passing
2026-05-14 19:04:12 +00:00
renovate-bot 5eba3abb1b chore(deps): update golang docker tag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-14 19:01:12 +00:00
renovate-bot df5a38e887 chore(deps): update module github.com/decentral1se/cobra to v1.10.2
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-05-14 18:01:50 +00:00
decentral1se 1e80d111e6 test: less flaky test
continuous-integration/drone/push Build is passing
2026-05-02 09:56:40 +02:00
Weblate 7a079b78de chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-04-11 13:54:52 +00:00
iexos 7524a785ce chore: make i18n
continuous-integration/drone/push Build is failing
2026-04-11 11:36:14 +02:00
iexos 1013f669bb fix: i18n & clarify no release notes msg
continuous-integration/drone/pr Build is failing
2026-04-10 23:22:40 +02:00
decentral1se aae20f07cc fix: general golang path [ci skip] 2026-04-03 22:59:21 +02:00
decentral1se 6ef8e1ff52 test: temporarily skip flaky test
continuous-integration/drone/push Build is passing
See #814
2026-04-01 11:37:07 +02:00
decentral1se 7fb9675b1e chore: golang 1.26 && make deps
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2026-04-01 11:25:57 +02:00
decentral1se d88b478503 test: unit tests clean up themselves
continuous-integration/drone/push Build is passing
See #792
2026-04-01 10:47:32 +02:00
decentral1se 7a735043cd fix: unbork json [ci skip] 2026-03-30 09:40:13 +02:00
decentral1se e610f32c35 fix: ignore new forked deps [ci skip] 2026-03-29 18:15:47 +02:00
p4u1 e04a1e15c4 feat: add filename to error message when yaml file is invalid
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Before:
FATA <internal/validate.go:84> unable to validate recipe: yaml: line 3: did not find expected key

After:
FATA <internal/validate.go:84> unable to validate recipe: <redacted>/recipes/monitoring-ng/compose.grafana-oidc.yml: yaml: line 3: did not find expected key
2026-03-20 14:42:14 +01:00
decentral1se 9d401202b4 test: ensure "release, fail, release" works
continuous-integration/drone/push Build is passing
See #794
2026-03-05 11:28:34 +01:00
decentral1se 6504be6403 test: ensure reproducible version 2026-03-05 11:28:33 +01:00
Weblate d4944dbf35 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-03-03 00:03:00 +00:00
decentral1se 8d8d4f799d chore: i18n
continuous-integration/drone/push Build is passing
2026-03-03 01:02:49 +01:00
iexos 0633f24d1b feat: recipe release reverts completely on failure
continuous-integration/drone/push Build is failing
2026-03-03 00:02:15 +00:00
decentral1se 2e062899c7 feat: release make target
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-03-01 09:42:59 +01:00
decentral1se fbd7275f03 build: remove broken goreleaser automagic
continuous-integration/drone/push Build is passing
See #780
2026-03-01 09:40:29 +01:00
ChasquiLabo cedf185e97 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 91.1% (1048 of 1150 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-28 13:52:56 +00:00
decentral1se 06a57ded02 chore: 0.13.0-beta
continuous-integration/drone/tag Build was killed
continuous-integration/drone/push Build is passing
2026-02-23 17:26:42 +01:00
ChasquiLabo 6f92ba0deb chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 91.1% (1048 of 1150 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-21 20:37:47 +00:00
ChasquiLabo dcd830e3f8 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 91.1% (1048 of 1150 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-21 01:44:54 +00:00
Weblate 8056703d59 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-20 16:25:39 +00:00
decentral1se 566bdf2bd8 Merge remote-tracking branch 'weblate/main'
continuous-integration/drone/push Build is passing
2026-02-20 17:25:15 +01:00
decentral1se 24288c81d3 fix: missing i18n
continuous-integration/drone/push Build is passing
2026-02-20 14:49:02 +01:00
decentral1se 2ef2a7ed2c chore: 0.13.0-rc2-beta
continuous-integration/drone/push Build was killed
continuous-integration/drone/tag Build was killed
2026-02-20 11:05:39 +01:00
decentral1se cf8cd7423d build: trimpath
continuous-integration/drone/push Build is passing
2026-02-20 11:03:16 +01:00
ChasquiLabo a18f57488f chore: translation using Weblate (Spanish)
Currently translated at 91.2% (1043 of 1143 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-20 09:50:31 +00:00
decentral1se b2e691265a fix: consistent i18n usage on rootCmd
continuous-integration/drone/push Build is passing
2026-02-20 10:49:04 +01:00
decentral1se bff23f0ae6 fix: translated help
continuous-integration/drone/push Build is passing
Follows #785
2026-02-20 10:46:52 +01:00
Weblate 403c7a3e5b chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-19 13:36:14 +00:00
3wordchant 66b932a553 Merge remote-tracking branch 'weblate/main'
continuous-integration/drone/push Build is passing
2026-02-19 08:35:59 -05:00
3wordchant f64e4b62cf chore: Re-run make i18n
continuous-integration/drone/push Build is passing
2026-02-19 08:28:14 -05:00
ChasquiLabo e80ecbc332 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.9% (1041 of 1144 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-19 08:27:33 -05:00
iexos abcbdf57f1 test: remove recipe sync dependency
continuous-integration/drone/push Build is passing
2026-02-19 11:04:47 +00:00
decentral1se 78899f173c fix: remove double help flag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-02-19 00:42:56 +01:00
ChasquiLabo 90142cb783 chore: translation using Weblate (Spanish)
Currently translated at 90.9% (1041 of 1144 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-18 23:08:37 +00:00
decentral1se 8dbde3d158 fix: wrap string (i18n)
continuous-integration/drone/push Build is passing
2026-02-19 00:07:18 +01:00
Apfelwurm 8f42e36302 feat: bytes/base64 secret generation
continuous-integration/drone/push Build is failing
2026-02-18 20:41:45 +01:00
ChasquiLabo c2552ec2f6 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.9% (1041 of 1144 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-18 13:52:56 +00:00
decentral1se 8c64a8049d chore: 0.13.0-rc1-beta x 3 [ci skip]
continuous-integration/drone/tag Build is failing
That didn't work. Doing it manually *again*.
2026-02-18 09:28:30 +01:00
decentral1se b073072489 chore: 0.13.0-rc1-beta x 2
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is passing
2026-02-18 09:14:11 +01:00
decentral1se 9daa4fee48 chore: 0.13.0-rc1-beta
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is passing
2026-02-18 09:04:29 +01:00
decentral1se ea48917e6c test: ensure ssh-agent is configured
continuous-integration/drone/push Build is passing
See https://build.coopcloud.tech/toolshed/abra/3594/1/7
2026-02-17 12:54:40 +00:00
ChasquiLabo 728f873a3e chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 90.0% (1030 of 1144 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-17 10:40:21 +00:00
decentral1se ddb90dd44d docs: woops, remove that [ci skip] 2026-02-16 17:35:27 +01:00
decentral1se 7a8485492e test: give more space to CI machine for these tests [ci skip] 2026-02-16 17:28:44 +01:00
Weblate 32bb05abba chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-16 11:06:33 +00:00
decentral1se 3d2006a696 chore: i18n
continuous-integration/drone/push Build is passing
2026-02-16 12:06:24 +01:00
iexos 521f5c1647 feat: optionally commit changes with recipe upgrade
continuous-integration/drone/push Build is failing
2026-02-16 09:18:41 +00:00
iexos 5eb41bc803 feat!: require clean working copy for recipe release cmd 2026-02-16 09:18:41 +00:00
iexos fc39721501 feat!: merge recipe sync into recipe release 2026-02-16 09:18:41 +00:00
iexos 44bacc582b feat!: always publish on recipe release 2026-02-16 09:18:41 +00:00
decentral1se 53e8b52717 docs: more authors [ci skip] 2026-02-15 19:40:24 +01:00
decentral1se 0aba922dda test: fix error [ci skip] 2026-02-15 18:58:23 +01:00
decentral1se 4e0eb739b4 feat: ls requires --chaos due to Ensure logic
continuous-integration/drone/push Build is passing
Follows #771
2026-02-15 17:57:31 +00:00
Weblate 6b661dd7a7 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-15 17:57:28 +00:00
decentral1se 39102752c0 fix: more graceful bailing if borked .env.sample
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-02-15 18:26:05 +01:00
decentral1se 5cfc1c076c fix: remove timeout
continuous-integration/drone/push Build is failing
2026-02-15 16:34:18 +00:00
Weblate 10f7ed74b0 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-15 16:34:05 +00:00
decentral1se 227d37dc26 chore: i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-02-15 17:08:14 +01:00
decentral1se 0ccf3d2b12 fix: ensure and fail for updated recipes
continuous-integration/drone/push Build is failing
2026-02-15 17:07:46 +01:00
decentral1se f87ce74027 fix: ensure borked tag handled for deploy/ls 2026-02-15 17:07:45 +01:00
Weblate 4349ee82bc chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-15 13:47:09 +00:00
decentral1se f9ea7506d0 test: #761
continuous-integration/drone/push Build is passing
2026-02-15 14:46:54 +01:00
decentral1se 1fe2d0421b chore: i18n 2026-02-15 14:41:03 +01:00
ammaratef45 59c0d1f4c5 ensure recipe is up to date before creating new app
continuous-integration/drone/push Build is failing
2026-02-15 13:40:34 +00:00
decentral1se 7c3364f87a test: do not wait for converge checks
continuous-integration/drone/push Build is passing
See #750 (comment)
2026-02-15 14:39:07 +01:00
Weblate 2c5a273fa7 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-02-15 13:08:19 +00:00
decentral1se c54fe3ef85 chore: i18n
continuous-integration/drone/push Build is passing
2026-02-15 14:08:08 +01:00
ChasquiLabo bda0d23d39 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is failing
Currently translated at 87.8% (1002 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-15 09:40:56 +00:00
ChasquiLabo b9dc7b8437 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is failing
Currently translated at 87.7% (1001 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-14 13:52:56 +00:00
Apfelwurm 8f7dbfedbc add integration test that does not use old recipe version when recipe is broken
continuous-integration/drone/push Build is failing
2026-02-13 21:51:46 +00:00
Apfelwurm 4b863f1e15 change usage of tags to recipe versions in deploy.go 2026-02-13 21:51:46 +00:00
Apfelwurm 064c9f5d65 fix: breaking GetRecipeVersions when an invalid recipe version exists 2026-02-13 21:51:46 +00:00
iexos 98e48c95c7 fix: duplicate R015 rule number
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2026-02-13 15:57:21 +01:00
iexos c85d8ee6d1 small fixes 2026-02-13 12:13:50 +01:00
p4u1 23268a0e92 fix: Does not crash when an image has no tag
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2026-02-13 11:24:22 +01:00
p4u1 d60d426752 moved fork
continuous-integration/drone/push Build is passing
2026-02-13 09:29:01 +00:00
p4u1 0e273de8f6 fix: Allows multiple protocols on one port 2026-02-13 09:29:01 +00:00
ChasquiLabo ab32118bfe chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 75.0% (856 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-13 05:52:56 +00:00
ChasquiLabo 683396d75a chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 58.7% (670 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-12 05:13:22 +00:00
ChasquiLabo 4db6755f0d chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 30.2% (345 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-05 14:52:56 +00:00
ChasquiLabo 4c132e30f6 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 29.8% (341 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-02-01 03:52:59 +00:00
ChasquiLabo f5aeae30c7 chore: translation using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 23.3% (266 of 1141 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2026-01-30 16:52:56 +00:00
ammaratef45 1d24107956 fix regexp for _remove_tags bats output
continuous-integration/drone/push Build is passing
2026-01-26 07:05:51 +00:00
Weblate f835b87255 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2026-01-16 23:45:14 +00:00
decentral1se dba21d6a29 chore: lowercase, i18n
continuous-integration/drone/push Build is passing
2026-01-17 00:44:55 +01:00
ammaratef45 182fc41c58 added integration test
continuous-integration/drone/push Build is failing
2026-01-16 14:27:27 -08:00
ammaratef45 304ac87cec ensure repo is up to date before printing status
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2026-01-14 16:58:21 -08:00
namnatulco 5b3929d885 modified install script to output a safe PATH-update (fixes #735)
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2026-01-02 10:19:10 +01:00
Weblate c41df874d1 chore: update translation files
continuous-integration/drone/push Build is failing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-12-21 15:39:13 +00:00
decentral1se b721adbf9c chore: i18n
continuous-integration/drone/push Build is failing
2025-12-21 16:39:02 +01:00
ammaratef45 42f9e6d458 return error instead of handling it inside getLatestVersion
continuous-integration/drone/push Build is failing
2025-12-19 06:50:35 -08:00
ammaratef45 9e7bc31d4d avoiding #732 by checking for empty versions list for recipe sync
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-12-18 14:41:58 -08:00
Weblate b79c4f33b6 chore: update translation files
continuous-integration/drone/push Build is failing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-12-14 15:02:41 +00:00
jade cc87d5b3da chore: remove reference to wizard mode from recipe upgrade cli docs
continuous-integration/drone/push Build is failing
2025-12-13 15:26:12 +11:00
ChasquiLabo 8b5e3f3c78 chore: translation using Weblate (Spanish)
Currently translated at 9.5% (109 of 1140 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-12-10 01:43:58 +00:00
decentral1se db7c4042d0 chore: go mod vendor 2025-11-09 11:52:00 +01:00
decentral1se ed1a66dc5f chore: publish next tag 0.12.0-beta
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is passing
2025-11-09 11:46:38 +01:00
decentral1se bb93e4266a fix: show domain with https (clickable)
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #643
2025-11-09 10:56:21 +01:00
decentral1se a2cc70b2f5 test: reinstate debug
continuous-integration/drone/push Build is failing
2025-11-09 10:43:09 +01:00
decentral1se ce1aa3d870 test: ensure recipe sync is robust
continuous-integration/drone/push Build is passing
2025-11-09 10:41:32 +01:00
decentral1se d75700c8a9 test: ensure env vars updated
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #723
2025-11-09 09:32:52 +01:00
decentral1se 0ccc4aae72 chore: remove --debug 2025-11-09 09:32:42 +01:00
decentral1se ec22d5d51d test: remove old tests
continuous-integration/drone/push Build is passing
See #716
2025-11-05 09:52:28 +01:00
decentral1se ab42584d05 docs: update var name 2025-11-05 09:52:28 +01:00
fauno 40eb6e9a18 fix: shorter hyphen
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-11-04 11:49:44 -03:00
Weblate 35eb9d4a89 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-11-04 14:34:39 +00:00
decentral1se 08cc63d523 chore: make i18n
continuous-integration/drone/push Build is passing
2025-11-04 15:34:27 +01:00
Weblate 797b8d899b chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-11-04 13:53:26 +00:00
decentral1se fb786306b5 chore: make i18n
continuous-integration/drone/push Build is passing
2025-11-04 14:53:15 +01:00
decentral1se c3a2048eba fix: throw away unknown version
continuous-integration/drone/push Build is failing
See #715
2025-11-04 13:52:49 +00:00
Apfelwurm 1bdc11ba62 fix no-input app deployment when no tty is present
continuous-integration/drone/push Build is failing
2025-11-04 13:52:28 +00:00
Weblate cc8703310c chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-11-04 07:35:14 +00:00
decentral1se fcd5bd863d chore: make i18n
continuous-integration/drone/push Build is failing
2025-11-04 08:35:04 +01:00
decentral1se e6af2da9dd refactor: named note, merge if clause 2025-11-04 08:34:49 +01:00
p4u1 4b688825e0 feat: create docker context when server folder does exist
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-11-03 17:29:04 +01:00
decentral1se b0cf2a1f8e chore: make i18n
continuous-integration/drone/push Build is passing
2025-11-02 10:44:34 +00:00
decentral1se 6b7020d457 test: env version to .config.env 2025-11-02 10:44:34 +00:00
decentral1se efdac610bd fix: skip local server on it's own 2025-11-02 10:44:34 +00:00
decentral1se cd6021f116 fix: expose new version
See #713
2025-11-02 10:44:34 +00:00
Weblate ee8de8ef5c chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-31 20:38:18 +00:00
decentral1se e5a653c002 chore: make i18n
continuous-integration/drone/push Build is passing
2025-10-31 21:38:01 +01:00
decentral1se 2cca04de90 fix(move): does not error when secret already exists on new server
See #709
2025-10-31 21:37:55 +01:00
Weblate f2f79e2df8 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-31 20:33:36 +00:00
decentral1se dd83741a9f chore: i18n
continuous-integration/drone/push Build is passing
2025-10-31 21:31:49 +01:00
decentral1se dc2cd85d91 feat!: abra app env pull
`abra app env` -> `abra app env list`.

See #497
2025-10-31 21:31:43 +01:00
decentral1se 96e59cf196 test: adjust to match new reality [ci skip] 2025-10-31 14:35:57 +01:00
decentral1se 11656c009d test: don't wat to converge [ci skip] 2025-10-26 11:49:57 +01:00
decentral1se e4e1b58501 test: update matches in old tests [ci skip] 2025-10-26 11:40:25 +01:00
decentral1se 3b8f12643c test: use new target
continuous-integration/drone/push Build is passing
2025-10-25 20:01:23 +02:00
decentral1se e5f5154197 test: kadabra is gone
continuous-integration/drone/push Build is passing
2025-10-23 20:58:08 +02:00
decentral1se 6c1c0a8a8a refactor: use xgettext-go from makefile variable
continuous-integration/drone/push Build is passing
Easier to hack when customising xgettext-go.
2025-10-23 09:26:51 +02:00
Weblate 662f45008c chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-23 07:14:28 +00:00
decentral1se 708c5f5223 chore: make i18n
continuous-integration/drone/push Build is passing
See #688
2025-10-23 09:14:15 +02:00
Weblate d58552b748 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-23 07:10:59 +00:00
decentral1se 51fe809851 chore: make i18n
continuous-integration/drone/push Build is passing
See #688
2025-10-23 09:10:36 +02:00
Weblate 3f6a22747f chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-23 07:09:11 +00:00
decentral1se 4e75b96914 chore: make i18n
continuous-integration/drone/push Build is passing
See #688
2025-10-23 09:08:50 +02:00
Weblate fd4ee75ab7 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-19 13:47:17 +00:00
decentral1se 964ed834ee refactor!: remove autoupdate (kadabra)
continuous-integration/drone/push Build is passing
2025-10-19 15:46:18 +02:00
Weblate fcb3167394 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-19 13:36:39 +00:00
decentral1se 3845b40aa3 refactor!: archive kadabra
continuous-integration/drone/push Build is passing
2025-10-19 15:32:38 +02:00
3wordchant 0dc5c307af chore: update i18n
continuous-integration/drone/push Build is passing
2025-10-18 16:03:11 -04:00
3wordchant fc5855ff28 feat: Add hexadecimal secret generation
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
Closes #695
2025-10-18 15:03:02 -04:00
decentral1se 5b504a1550 Revert "feat: cctuip lands in main"
continuous-integration/drone/push Build is passing
See #691 (comment)
2025-10-17 19:27:23 +02:00
Weblate fc16a21f1c chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-03 18:39:54 +00:00
decentral1se 7b4d2d7230 chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-10-03 20:35:47 +02:00
decentral1se d0ccb805c6 refactor: isolate expensive IsDirty() call
continuous-integration/drone/push Build is failing
See #689
2025-10-03 20:35:09 +02:00
decentral1se 2460dd9438 fix: pagination with multiline(true)
See #689
2025-10-03 20:13:35 +02:00
Weblate 9c648a2566 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-02 09:05:45 +00:00
decentral1se 22ecfb9c4c test: remove old non-tui tests
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-10-02 10:58:53 +02:00
decentral1se 9f3cf718be chore: make i18n 2025-10-02 10:54:07 +02:00
decentral1se b737ce2107 feat: cctuip lands in main
See toolshed/organising#657
2025-10-02 10:53:44 +02:00
decentral1se a3d0ece7cb refactor: single missing value 2025-10-02 10:53:31 +02:00
decentral1se d63a1c28ea chore: go mod tidy / vendor / make deps 2025-10-02 10:35:46 +02:00
Weblate 1c10e64c58 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-01 19:16:08 +00:00
decentral1se 21826ec555 chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-10-01 21:13:41 +02:00
decentral1se 4b4c56d406 fix: skip borked tags on app list
See #656
2025-10-01 21:13:18 +02:00
decentral1se 4314195dd7 test: dont run xgettext-go on release
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #663
2025-10-01 12:20:16 +02:00
Weblate df4447b038 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-01 10:12:54 +00:00
decentral1se 3fa660e579 chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-10-01 12:12:07 +02:00
decentral1se a430b1e4fd fix: dont show unchanged images/tags
See #677
2025-10-01 12:11:29 +02:00
Weblate 896c434f38 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-01 09:50:52 +00:00
decentral1se 847b7238c5 chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-10-01 11:49:19 +02:00
decentral1se 89d5fc91b0 fix: gracefully explode of missing context
See #675
2025-10-01 11:48:51 +02:00
Weblate 5af3c5f56e chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-01 09:20:19 +00:00
decentral1se beb3864b2d chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-10-01 11:18:51 +02:00
decentral1se 581e6ef538 chore: lowercase 2025-10-01 11:18:42 +02:00
decentral1se fd642ddb84 fix: fail if release conflicts
See toolshed/organising#638
2025-10-01 11:18:30 +02:00
decentral1se 1ad8c127d9 fix: point to the catalogue
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #669
2025-10-01 09:09:40 +02:00
Weblate 40aab6a6c1 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-10-01 07:01:05 +00:00
decentral1se 4d33a24a07 refactor: less EN specific value
continuous-integration/drone/push Build is passing
2025-10-01 08:54:09 +02:00
decentral1se ee59eb350b chore: make i18n 2025-10-01 08:54:08 +02:00
decentral1se 5da13ff15a test: adjust integration suite 2025-10-01 08:54:05 +02:00
decentral1se 491c594ad3 fix: better message for redeploying chaos version
See #668
2025-10-01 08:19:47 +02:00
decentral1se c794d533be fix: avoid hanging when tasks randomly surge
See #557
2025-10-01 08:19:46 +02:00
decentral1se a6daf7030e fix: show chaos version on upgrade 2025-10-01 08:19:45 +02:00
decentral1se fe3b7ffa9c fix: write correct undeploy version 2025-10-01 08:19:44 +02:00
decentral1se 4c066a92d8 fix: show chaos version on rollback overview 2025-10-01 08:19:43 +02:00
decentral1se 7899b57781 fix: show chaos version on deploy overview 2025-10-01 08:19:42 +02:00
decentral1se 6e0a901887 chore: spacing for readability 2025-10-01 08:19:41 +02:00
decentral1se 713fdebc90 fix: show chaos version on undeploy 2025-10-01 08:19:40 +02:00
decentral1se 6944d138c6 refactor: chaos-y handling
See #659
2025-10-01 08:19:39 +02:00
decentral1se fbb1f16470 fix: dont overwrite label when chaos
See #668
2025-10-01 08:19:38 +02:00
decentral1se 2473cafdf5 test: use new CI option for xgettext-go
continuous-integration/drone/push Build is passing
2025-09-30 19:23:23 +02:00
Weblate 0ccfbd253e chore: update translation files
continuous-integration/drone/push Build is failing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-09-30 17:20:47 +00:00
decentral1se 6c4bee0ac7 chore: make i18n
continuous-integration/drone/push Build is failing
2025-09-30 19:20:35 +02:00
Weblate 4fa9f536eb chore: update translation files
continuous-integration/drone/push Build is failing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-09-30 17:10:26 +00:00
decentral1se 033c9bfc13 feat: msgctxt support
continuous-integration/drone/push Build is failing
See #647
See toolshed/xgettext-go#1
2025-09-30 19:08:52 +02:00
Weblate 0db1ee87fc chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-09-30 17:03:14 +00:00
decentral1se d180bb924f chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-09-29 10:33:56 +02:00
decentral1se d50d68d95a test: further generate=false secre tests 2025-09-29 10:33:40 +02:00
decentral1se f468bc7443 fix: collect local name also 2025-09-29 10:33:26 +02:00
decentral1se dee2d9d104 fix: nuance of generate=false for app deploy 2025-09-29 10:32:29 +02:00
decentral1se 5c892b1d6a fix: nuance of generate=false for app new 2025-09-29 10:32:04 +02:00
decentral1se 81b96fc7b1 docs: better wording 2025-09-29 10:31:46 +02:00
cyrnel c92a0d0703 feat: Add cloud-init file
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-09-14 13:02:21 -04:00
decentral1se 1c4abcf12f chore: bump installer
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is passing
2025-09-10 22:06:12 +02:00
decentral1se f590870672 chore: make i18n
continuous-integration/drone/push Build is passing
2025-09-10 21:46:43 +02:00
decentral1se a31a25cfa1 fix: show no images if no diff required 2025-09-10 21:46:42 +02:00
Weblate 870dcfb342 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-09-09 22:07:29 +00:00
3wordchant f53ba48efa docs: update comment
continuous-integration/drone/push Build is passing
2025-09-09 17:37:36 -04:00
3wordchant 26c920e570 chore: i18n.G, update POT
continuous-integration/drone/push Build is passing
2025-09-09 17:37:12 -04:00
3wordchant c67fc57902 feat: show proposed secret version changes during deploy 2025-09-09 17:37:12 -04:00
3wordchant 07cafd371c fix: top-align table cells in horizontal()
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-09-09 16:55:23 -04:00
3wordchant 5bb6241172 test: fix "bail if env has a hash but no --chaos" test
continuous-integration/drone/push Build is passing
2025-09-09 16:03:22 -04:00
3wordchant 66e6a2c47e chore: update POT
continuous-integration/drone/push Build is passing
2025-09-09 15:59:45 -04:00
3wordchant d866527138 fix: set "chaos" if a specified* version is "chaos-y"
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
*either from env file or command-line
2025-09-09 13:25:18 -04:00
3wordchant 39d1997edf chore: update POT
continuous-integration/drone/push Build is passing
2025-09-09 13:19:22 -04:00
3wordchant d5f5d96944 style: formatting 2025-09-09 13:18:49 -04:00
3wordchant 076d522b1a refactor: PR feedback 2025-09-09 13:18:26 -04:00
3wordchant 34934cf62d refactor: move strings.Join to DeployOverview
continuous-integration/drone/push Build is passing
2025-09-08 22:12:22 -04:00
3wordchant 241dffb8cd chore: POT 2025-09-08 22:12:21 -04:00
3wordchant e42b42e882 chore: 4matting 2025-09-08 22:12:20 -04:00
3wordchant 0a45424658 test: check new deploy overview stuff 2025-09-08 22:12:17 -04:00
3wordchant e73b0cc2fc refactor: don't reinvent the wheel 2025-09-08 22:12:12 -04:00
3wordchant 33aca42181 feat: add --show-unchanged/-U option 2025-09-08 22:12:08 -04:00
3wordchant 5c659bae5f chore: update POT 2025-09-08 22:12:04 -04:00
3wordchant d9f1f82923 style: 4matting 2025-09-08 22:12:00 -04:00
3wordchant 117f64a9d6 test: add some basic unit tests for new utility methods 2025-09-08 22:11:55 -04:00
3wordchant 90e9e9b5aa refactor: move MergeAbraShEnv to shared method
Re #638
2025-09-08 22:11:50 -04:00
3wordchant 7e217f8892 chore: regen POT 2025-09-08 22:11:39 -04:00
3wordchant bf68ec56a3 style: 4matting 2025-09-08 22:11:35 -04:00
3wordchant 40b5c5cd63 feat: roll out pre-deploy changes to rollback and upgrade 2025-09-08 22:11:30 -04:00
3wordchant 14d3f1f669 feat: show image differences in pre-deploy overview 2025-09-08 22:11:15 -04:00
3wordchant 8e8f7715a2 refactor: move secret- and config-gathering to separate file 2025-09-08 22:11:10 -04:00
3wordchant 745651e962 refactor: resolve circular import 2025-09-08 22:11:04 -04:00
3wordchant c2848cb3ec feat: add GetSecretNamesForStack, tidy up GetConfigNamesForStack 2025-09-08 22:10:58 -04:00
3wordchant f3edfea744 feat: warn instead of error on missing config version 2025-09-08 22:10:52 -04:00
3wordchant 719722a25b feat: working config version comparison 2025-09-08 22:10:48 -04:00
3wordchant 7f9f8f9d6a feat: skip empty sections in deploy overview 2025-09-08 22:10:43 -04:00
3wordchant 155df518dd feat: only show remote configs used in deployment 2025-09-08 22:10:39 -04:00
3wordchant 984bdd8792 feat: add some spacing, might delete 2025-09-08 22:10:29 -04:00
3wordchant 0b7c38c213 refactor: tidy up a little 2025-09-08 22:10:24 -04:00
3wordchant 1df0de2e65 WIP: Working secret and config versions during deploy overview 2025-09-08 22:06:27 -04:00
3wordchant 6d634ea4e2 WIP: Initial stab at secrets/configs/images 2025-09-08 22:06:27 -04:00
decentral1se dc207a0138 test: lang parsing
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #652
2025-09-06 08:38:38 +02:00
decentral1se 02add8c3ef chore: make i18n
continuous-integration/drone/push Build is passing
2025-09-06 08:28:53 +02:00
decentral1se 560d609013 test: ensure autocomplete output works
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
See #649
2025-09-06 08:26:50 +02:00
decentral1se b4c9fbfe6d fix: use local flag
See #648
2025-09-06 08:24:37 +02:00
3wordchant 7f456a3f24 chore: 4matting
continuous-integration/drone/push Build is passing
2025-09-05 21:12:21 +00:00
3wordchant 709a9ad659 fix: use LANG prefix instead of full value 2025-09-05 21:12:21 +00:00
Weblate a468245413 chore: update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-09-05 21:09:51 +00:00
3wordchant e895b852bc chore: update POT
continuous-integration/drone/push Build is passing
2025-09-05 17:09:39 -04:00
3wordchant bef92d53a8 fix: don't translate blank string
continuous-integration/drone/push Build is failing
2025-09-05 13:33:51 -04:00
3wordchant a4b47b431b fix: temporary fix to #648
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-09-05 13:29:31 -04:00
decentral1se bddf8039af test: ensure previous versions not deleted
continuous-integration/drone/push Build is passing
See #615
2025-09-04 08:26:21 +00:00
Weblate d74e760940 Update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-09-04 08:14:12 +00:00
ChasquiLabo 7f75d25d56 Translated using Weblate (Spanish)
Currently translated at 10.4% (116 of 1105 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-09-04 08:14:12 +00:00
3wordchant 0bb6d9609c Add test to make sure non-chaos hash deploy fails..
continuous-integration/drone/push Build is passing
..and make sure _ensure_env_version passes through variable correctly.
2025-09-03 14:25:42 -04:00
3wordchant e858dcdd14 Whoops, gettext 2025-09-03 14:25:41 -04:00
3wordchant 3606349a4a Error out if env version is chaos-y and --chaos not provided
Re #554
2025-09-03 14:25:22 -04:00
decentral1se 4547cf2579 fix: help/version override for translation
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #628
2025-09-03 08:58:31 +02:00
decentral1se e1f029d2db chore: make i18n
continuous-integration/drone/push Build is passing
2025-09-03 00:25:23 +02:00
decentral1se cf2952dc65 chore: add missing i18n on --latest [ci skip] 2025-09-03 00:24:55 +02:00
decentral1se 2291712661 fix: abra app move docs/patches
continuous-integration/drone/push Build is passing
2025-09-01 13:48:10 +02:00
decentral1se f0e2b012c6 chore: make i18n
continuous-integration/drone/push Build is passing
2025-09-01 11:17:44 +02:00
decentral1se 9c37b9b748 test: app move (basics) 2025-09-01 11:17:39 +02:00
decentral1se 824f314472 refactor: app move review pass 2025-09-01 11:17:22 +02:00
p4u1 61849a358c feat(app): Adds abra app move command 2025-09-01 06:50:11 +02:00
decentral1se 8c7b06a7bb chore: add missing authors [ci skip] 2025-08-30 13:40:39 +02:00
decentral1se 4c9abbf925 feat: template example domain in release notes
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See toolshed/organising#521
2025-08-30 12:45:48 +02:00
decentral1se 09176801e1 feat: warn for secret generation
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-08-30 12:27:29 +02:00
decentral1se 36d4648114 feat: add config dir help
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See toolshed/organising#470
2025-08-30 12:12:40 +02:00
decentral1se 83ca2a63d1 fix: support ValidArgs translation
continuous-integration/drone/push Build is passing
See #632
2025-08-30 12:02:13 +02:00
decentral1se e25ce5d1a0 chore: make i18n
continuous-integration/drone/push Build is passing
2025-08-30 11:46:48 +02:00
decentral1se 4cb5091d50 Merge remote-tracking branch 'weblate/main' 2025-08-30 11:45:59 +02:00
decentral1se 4bfbc53b94 feat: support alias translation
continuous-integration/drone/push Build is passing
See #627
2025-08-30 11:39:49 +02:00
decentral1se 52f02ad9b9 translate: support usage translations
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #628
2025-08-30 10:46:09 +02:00
ChasquiLabo c0acc3663b Translated using Weblate (Spanish)
Currently translated at 10.8% (114 of 1048 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-08-29 21:45:43 +00:00
decentral1se d5c66020ad refactor!: --ignore-env-version is --latest *only* on deploy
continuous-integration/drone/push Build is passing
See #617
2025-08-29 16:38:49 +02:00
decentral1se 86ba006e17 chore: fix merge conflict from weblate
continuous-integration/drone/push Build is passing
2025-08-29 13:58:10 +02:00
decentral1se cb4355e61e docs: add chasqui [ci skip] 2025-08-29 10:20:51 +02:00
decentral1se 069f8fec54 chore: sort AUTHORS 2025-08-29 10:20:05 +02:00
ChasquiLabo c2819b9366 Translated using Weblate (Spanish)
Currently translated at 10.8% (114 of 1048 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-08-29 08:00:42 +00:00
decentral1se 850264d085 chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-08-29 09:58:42 +02:00
decentral1se e019142c9e fix: show when logs dont get collected
See #575
2025-08-29 09:58:26 +02:00
ChasquiLabo e23c6197b5 Translated using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 10.7% (113 of 1048 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-08-28 22:30:49 +00:00
3wordchant 6539b1be7e Appease formatter (kinda weird?)
continuous-integration/drone/push Build is passing
2025-08-28 11:44:21 -04:00
3wordchant 02b520200e Mark command short descriptions with translators: tag
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-28 11:33:22 -04:00
3wordchant acb6170768 Add make find-tests
continuous-integration/drone/push Build is passing
2025-08-28 14:26:27 +00:00
decentral1se e04af4e582 chore: make i18n
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-08-28 16:18:10 +02:00
decentral1se 8bf0d7addc fix: wait for containers to go away
See #564
2025-08-28 16:17:37 +02:00
3wordchant 20909695e0 Translated using Weblate (Spanish)
continuous-integration/drone/push Build is passing
Currently translated at 5.2% (55 of 1043 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-08-28 01:00:51 +00:00
ChasquiLabo baf7631105 Translated using Weblate (Spanish)
Currently translated at 5.2% (55 of 1043 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-08-28 01:00:51 +00:00
Weblate 57fbc4c061 Update translation files
continuous-integration/drone/push Build is passing
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/
2025-08-27 19:32:09 +00:00
3wordchant c43e68ea6a Fix Makefile & .drone.yml
continuous-integration/drone/push Build is passing
2025-08-27 15:29:45 -04:00
3wordchant d3d3358a79 Sort files for make update-pot
continuous-integration/drone/push Build is failing
2025-08-27 13:00:40 -04:00
3wordchant cb310c56b5 Add comments_tag
continuous-integration/drone/push Build is failing
2025-08-27 12:58:06 -04:00
3wordchant 67c0a64f60 Run xgettext-go
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-08-27 12:54:05 -04:00
3wordchant db5da1656a Semi-automated mass string commenting 2025-08-27 12:54:05 -04:00
3wordchant 5b6254a243 Update check-pot-changes
continuous-integration/drone/push Build is failing
2025-08-27 16:50:27 +00:00
3wordchant 2a0857c388 Fix golang image tag 2025-08-27 16:50:27 +00:00
3wordchant 92a0294f2f Tweak Drone order, switch image for xgettext-go 2025-08-27 16:50:27 +00:00
3wordchant f79775d726 Tiny tweak to test Drone explosion 2025-08-27 16:50:27 +00:00
3wordchant e095bbe9d6 Fix check-pot-changes makefile command 2025-08-27 16:50:27 +00:00
3wordchant eb12127578 Fix makefile command for xgettext-go status build step 2025-08-27 16:50:27 +00:00
3wordchant 82779b233b Move check-pot-changes to Makefile 2025-08-27 16:50:27 +00:00
3wordchant ac4ac1d40f Adventurous xgettext-go automation 2025-08-27 16:50:27 +00:00
p4u1 7c31e4dc45 feat(secrets): Reading from stdin and reproducible secret list(#614)
continuous-integration/drone/push Build is passing
Reviewed-on: #614
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
Co-authored-by: p4u1 <p4u1_f4u1@riseup.net>
Co-committed-by: p4u1 <p4u1_f4u1@riseup.net>
2025-08-27 15:37:43 +00:00
3wordchant b86cd2e85f Update localez
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-08-26 13:37:15 -04:00
3wordchant 7dd7f763f4 Moar PR feedback
continuous-integration/drone/push Build is passing
2025-08-26 13:15:06 -04:00
3wordchant 7b7477062f Implement PR feedback
continuous-integration/drone/push Build is passing
2025-08-25 18:12:15 -04:00
3wordchant 238647a987 Prompt for secrets if not provided on CLI
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Re #646
2025-08-25 17:16:50 -04:00
decentral1se f39eab8f1e test: pass ABRA_DIR to unit test on CI
continuous-integration/drone/push Build is passing
2025-08-25 11:55:33 +02:00
decentral1se 6a52575ae0 refactor!: do not set default timeout
continuous-integration/drone/push Build is failing
See #596

Quite some `i18n.G` additions along the way!
2025-08-25 11:49:11 +02:00
decentral1se 44a7d288af test(unit): ensure timeout handling 2025-08-25 11:48:45 +02:00
decentral1se 97377dea39 test(integration): ensure timeout handling 2025-08-25 11:48:44 +02:00
decentral1se a2940a84b3 chore: restructure unit testing resources 2025-08-25 11:48:43 +02:00
decentral1se 0c708f6592 feat: recipe sync shows changes
continuous-integration/drone/push Build is passing
See #579
2025-08-24 15:56:26 +02:00
decentral1se 4cb660c348 fix: more robust -p failure handling
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #576
2025-08-24 13:05:03 +02:00
decentral1se 42dde0930d fix: handle translations
continuous-integration/drone/push Build is passing
2025-08-24 09:23:15 +02:00
decentral1se 7ccbbe8916 feat: include local recipes on auto-complete 2025-08-24 09:23:14 +02:00
decentral1se e421e00631 fix: don't ensure latest on auto-complete
See #567
2025-08-24 09:23:13 +02:00
decentral1se a5104336a2 feat: catalogue sync command 2025-08-24 09:23:12 +02:00
decentral1se 4e205cf13e feat: translation support
continuous-integration/drone/push Build is passing
See #483
2025-08-23 17:55:56 +02:00
decentral1se 5cf6048ecb test: also wipe env version
continuous-integration/drone/push Build is passing
2025-08-19 09:49:02 +02:00
decentral1se 3e2797c433 test: fixups for latest nightly failures
continuous-integration/drone/push Build is passing
2025-08-19 09:41:37 +02:00
decentral1se df89e8143a chore: clean cruft / formatting / add whitespace
continuous-integration/drone/push Build is passing
2025-08-19 07:30:55 +00:00
decentral1se b4ddd3e77c feat: handle generate=false env var mod
See toolshed/organising#461
2025-08-19 07:30:55 +00:00
decentral1se 81c28e3006 test: appease the tester
continuous-integration/drone/push Build is passing
2025-08-18 20:50:50 +02:00
decentral1se 34d2e3b092 chore: go mod vendor 2025-08-18 20:50:49 +02:00
decentral1se 1894c2f5fc chore: appease formatter 2025-08-18 20:50:48 +02:00
decentral1se e0bd03bec3 chore: bump deps 2025-08-18 20:50:47 +02:00
decentral1se 77ff146991 fix: better parsing errors
See toolshed/organising#608
See toolshed/organising#531
2025-08-18 20:50:46 +02:00
decentral1se 6fad1a1dcc test: check app list doesn't explode if missing .env
continuous-integration/drone/push Build is passing
See #560
2025-08-18 09:47:10 +02:00
decentral1se a90e239547 refactor!: ensure insert/remove not arbitrary
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-08-18 09:25:31 +02:00
decentral1se 9ee094fcd7 docs: secret removal examples 2025-08-18 09:25:20 +02:00
decentral1se 1aa7016789 fix: skip name validation for remote recipes
continuous-integration/drone/push Build is passing
See #601
2025-08-18 08:56:52 +02:00
decentral1se 60b3af1fa4 test: retrieve abra-test-recipe by hand now
continuous-integration/drone/push Build is passing
2025-08-18 06:32:41 +00:00
decentral1se 5f4b5e0fad fix: return error, not log.Fatal
See #582
2025-08-18 06:32:41 +00:00
decentral1se feadfca0d6 refactor: move ensureCtx closer to usage 2025-08-18 06:32:41 +00:00
decentral1se 73d4ee1c98 refactor: always validate recipe
This can slow things significantly down by requiring the catalogue and
if you don't have that, cause a slow `git clone`. However, the current
behvaiour is very confusing because it never actually checks if what the
user passes is actually a recipe. `abra recipe fetch DOESNTEXIST` gives
a better error to the user now. I'm hoping we can speed up the catalogue
handling at some point.
2025-08-18 06:32:41 +00:00
decentral1se f46c18c8d7 fix: warn on unknown server
continuous-integration/drone/push Build is passing
See #581
2025-08-18 08:29:14 +02:00
decentral1se f5a843bd90 feat: remove old app configs
continuous-integration/drone/push Build is passing
See #577
2025-08-17 13:27:35 +00:00
decentral1se fac372dc73 test: use latest release for check
continuous-integration/drone/push Build is passing
2025-08-17 15:18:05 +02:00
decentral1se 8a3be01c3e fix: $ABRA_DIR/servers subdirs also 0700
continuous-integration/drone/push Build is passing
See 38f308910a
See #580
2025-08-17 14:13:47 +02:00
decentral1se 4193d63d23 test: advertise locally to avoid multiple ip error
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-08-17 14:04:00 +02:00
decentral1se 38f308910a fix: $ABRA_DIR/servers=0700, $ABRA_DIR/servers/foo=0600
See #580
2025-08-17 14:03:15 +02:00
decentral1se 4aaa7400b8 fix: also ensure server is created with 0600
continuous-integration/drone/push Build is passing
See 6849e3554d
2025-08-17 13:32:37 +02:00
decentral1se 091611b984 feat: add volume arg to volume rm
continuous-integration/drone/push Build is passing
See #574
2025-08-17 11:16:30 +00:00
decentral1se 2cfc40dc28 fix: ensure recipe with undeploy
continuous-integration/drone/push Build is passing
See #573
2025-08-17 09:36:48 +00:00
decentral1se 6849e3554d fix: ensure $ABRA_DIR/servers is 0600
continuous-integration/drone/push Build is passing
Also remove deprecated folders while I'm here: `vendor` / `backup`

See #580
2025-08-17 09:17:00 +00:00
decentral1se 452de7fdc2 docs: show HOWTO generate in abra man help
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #568
2025-08-13 13:08:48 +02:00
decentral1se 952d768ab0 docs: show app secret rm example
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Closes #558
2025-08-12 21:34:57 +02:00
iexos 2c91d2040e fix: app ls -S didn't show updates sometimes (#561)
continuous-integration/drone/push Build is passing
2025-08-12 13:10:16 +00:00
3wordchant eff4435971 ABRA_TEST_DOMAIN → TEST_SERVER
continuous-integration/drone/push Build is passing
2025-08-12 12:18:49 +00:00
3wordchant 032fe99086 Appease formatter
continuous-integration/drone/push Build is passing
2025-08-12 12:18:29 +00:00
3wordchant 7add56df00 Add integration tests for new "--chaos to blast past lint errors"
Re toolshed/organising#497
2025-08-12 12:18:29 +00:00
3wordchant 0ab05cece2 Reformat linting errors in LintForErrors
See toolshed/organising#497 (comment)
2025-08-12 12:18:29 +00:00
3wordchant c63f6db61e WARN on recipe linting errors during --chaos..
..and show multiple linting errors instead of bailing on the first one.

Re #497
2025-08-12 12:18:29 +00:00
decentral1se 56a68dfa91 chore: bump deps
continuous-integration/drone/push Build is passing
2025-08-12 05:17:15 +00:00
p4u1 157d131b37 feat: Retrieves auth token from image
continuous-integration/drone/push Build is passing
This allows using a private registry for an image.
To use it, you have to run docker login on your local machine before
running abra deploy.
2025-08-12 05:01:42 +00:00
p4u1 3fae036db2 change to debug log
continuous-integration/drone/push Build is passing
2025-08-11 12:47:43 +00:00
p4u1 ce9d0934b6 fix: Does not error when recipes folder does not exist in app new 2025-08-11 12:47:43 +00:00
3wordchant a32e30374f Translated using Weblate (Spanish)
continuous-integration/drone/push Build is passing
continuous-integration/drone Build was killed
Currently translated at 100.0% (1 of 1 strings)

Translation: Co-op Cloud/abra
Translate-URL: https://translate.coopcloud.tech/projects/co-op-cloud/abra/es/
2025-08-04 16:51:35 +02:00
3wordchant cf46569f04 Add stub es catalogue 2025-08-04 16:51:34 +02:00
3wordchant 022606c13c Add default POT catalogue, don't alias gotext.Get 2025-08-04 16:51:33 +02:00
decentral1se 8cfda5229f feat: weblate 2025-08-04 16:51:26 +02:00
decentral1se 855a4c37c4 chore: bump installer script 2025-08-04 15:26:24 +02:00
3wordchant 7c3b740e14 Update the server used to deploy the installer script
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-07 15:01:31 +01:00
decentral1se 2fbef41a3a test: clean up properly
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-04-24 14:29:54 +02:00
decentral1se 6fb41e5300 fix: dont parse chaos version
continuous-integration/drone/push Build is passing
See #547
2025-04-24 11:24:14 +00:00
decentral1se 1432f480c7 fix: -T/--tty disables TTY remote request
continuous-integration/drone/push Build is passing
See #499
2025-04-24 08:57:53 +00:00
decentral1se 83af39771b test: drop unused tagHash
continuous-integration/drone/push Build is passing
2025-04-24 10:57:34 +02:00
decentral1se 4d1333202e test: flaky test when no RC is available
continuous-integration/drone/push Build is passing
Fixes https://build.coopcloud.tech/toolshed/abra/2760/1/5
2025-04-24 10:33:49 +02:00
decentral1se 55c24f070c feat: cancel git clone ops gracefully
continuous-integration/drone/push Build is passing
See #528
2025-04-22 22:56:10 +02:00
decentral1se 229e8eb9da feat: --ssh/--force for recipe fetch
continuous-integration/drone/push Build is passing
See toolshed/organising#546
2025-04-22 09:35:36 +00:00
decentral1se b3ab95750e fix: trim final newline on release note
continuous-integration/drone/push Build is passing
Follow-up #544
2025-04-22 09:23:28 +02:00
decentral1se de009921a2 fix: show release notes once
continuous-integration/drone/push Build is passing
See #543
2025-04-22 05:47:03 +00:00
decentral1se d081bbaefa feat: auto select single server
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See toolshed/organising#513
2025-04-21 21:06:29 +02:00
decentral1se 515b5466ca docs: add missing arg
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #540
2025-04-21 20:17:39 +02:00
decentral1se 6965799bdc chore: publish 0.10.0-beta
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-04-21 19:11:31 +02:00
decentral1se f75c9a6259 test: clean up test server correctly
continuous-integration/drone/push Build is passing
Fixes https://build.coopcloud.tech/toolshed/abra/2723/1/5
2025-04-21 19:03:49 +02:00
decentral1se a43a092ba7 fix: fetch recipe for "app list -S"
continuous-integration/drone/push Build is passing
2025-04-19 07:28:15 +00:00
p4u1 fa084a61d2 fix(lint): Improves error message if a lint rule errors
continuous-integration/drone/push Build is passing
This was detected while debugging #534
2025-04-16 05:12:19 +00:00
decentral1se 895a7fe7d6 fix: don't overwrite recipeVersion
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Fixes https://build.coopcloud.tech/toolshed/abra/2709/1/5
2025-04-15 10:51:53 +02:00
decentral1se 742a726778 fix: latest commit for new recipe version
continuous-integration/drone/push Build is passing
See #527
2025-04-14 23:55:19 +02:00
decentral1se 2b9a185aff build: go mod tidy 2025-03-23 11:10:05 +01:00
decentral1se b7c1e87c0b build: go mod vendor
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-03-23 11:08:17 +01:00
decentral1se cdfb8a08bb chore: publish 0.10.0-rc2-beta
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is passing
2025-03-23 11:05:03 +01:00
decentral1se 8943cea13f test: get latest via helper 2025-03-23 11:00:04 +01:00
decentral1se 6d64e0edd3 fix: sshPkg.Fatal has more nuance
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #507
2025-03-23 10:27:58 +01:00
decentral1se 47045ca8f1 feat: improved deploy progress reporting
continuous-integration/drone/push Build is passing
See #478
2025-03-23 09:13:36 +00:00
Apfelwurmandp4u1 d0f982456e add charset modifier to secret generation (#521)
continuous-integration/drone/push Build is passing
since we need special chars in passwords for a recipe we are working on, i have added the option to specify a charset in the same way as the length can be setted.
i did not change anything in the behaviour, so if length is not specified, the charset gets ignored whether it is there or not.

you can specify the following:
`charset=default` - Results in passgen.AlphabetDefault being used
`charset=special` - Results in passgen.AlphabetSpecial being used
`charset=safespecial` - Results in `!@#%^&*_-+=` being used (so it is AlphabetSpecial without the dollar sign)
`charset=default,special` or `charset=special,default` - Results in passgen.AlphabetDefault + passgen.AlphabetSpecial being used
`charset=default,safespecial` or `charset=safespecial,default` - Results in passgen.AlphabetDefault + `!@#%^&*_-+=` being used ((so it is AlphabetSpecial without the dollar sign)

PR for the docs: toolshed/docs.coopcloud.tech#271

Co-authored-by: p4u1 <p4u1@noreply.git.coopcloud.tech>
Reviewed-on: #521
Reviewed-by: p4u1 <p4u1@noreply.git.coopcloud.tech>
Co-authored-by: Apfelwurm <Alexander@volzit.de>
Co-committed-by: Apfelwurm <Alexander@volzit.de>
2025-03-21 10:29:21 +00:00
p4u1 80ad6c6681 fix(app): Properly detects release notes added after a release when upgrading an app (#523)
continuous-integration/drone/push Build is passing
Fixes #488

Reviewed-on: #523
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
Co-authored-by: p4u1 <p4u1_f4u1@riseup.net>
Co-committed-by: p4u1 <p4u1_f4u1@riseup.net>
2025-03-21 10:25:46 +00:00
decentral1se cb63cfe9c2 refactor: chaos redundant, shorter message
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-16 13:54:07 +01:00
decentral1se d1e49d17ce test: on-demand integration tests
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-16 13:22:50 +01:00
decentral1se 1574aa0631 refactor!: status between service/image
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #487 (comment)
2025-03-16 12:42:09 +01:00
decentral1se 1723025fbf build: go 1.24
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
We were running behind and there were quite some deprecations to update.
This was mostly in the upstream copy/pasta package but seems quite
minimal.
2025-03-16 12:31:45 +01:00
decentral1se a2b678caf6 test: reset after undeploy for a clean env version
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Follows #510.
See https://build.coopcloud.tech/toolshed/abra/2620/1/5.
2025-03-16 11:49:38 +01:00
p4u1 0a371ec360 fix: integration tests
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-13 08:31:11 +01:00
p4u1 e58a716fe1 feat(deploy): Simplifies deploy overview (#508)
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
This simplifies the deploy overview, to only show 3 version fields:
- CURRENT DEPLOYMENT
- CURRENT ENV
- NEW DEPLOYMENT

It also fixes a few errors around version detection

Reviewed-on: #508
Co-authored-by: p4u1 <p4u1_f4u1@riseup.net>
Co-committed-by: p4u1 <p4u1_f4u1@riseup.net>
2025-03-12 16:13:24 +00:00
p4u1 d09a19a385 fix: Adds chaos flag to restart command
continuous-integration/drone/push Build is passing
2025-02-11 10:01:44 +00:00
p4u1 cee808ff06 fix: Changes how the deploy version is detected in app deploy command 2025-02-11 10:01:44 +00:00
p4u1 4326d1d259 fix: Sorts git tags with tagcmp 2025-02-11 10:01:44 +00:00
p4u1 b976872f77 fix(overview): Adds linebreak after compose file in deploy overview
continuous-integration/drone/push Build is passing
2025-02-11 09:57:09 +00:00
p4u1 7b6ea76437 fix(secret): Checks for enough arguments
continuous-integration/drone/push Build is passing
2025-02-11 09:55:03 +00:00
p4u1 9069758969 fix(cmd): Uses uppercase t for tty shorthand flag
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-02-10 15:13:26 +01:00
p4u1 15d6b1a2a5 fix: app new with chaos should just take the local repo as it is (#495)
continuous-integration/drone/push Build is passing
Fixes #494

Reviewed-on: #495
Co-authored-by: p4u1 <p4u1_f4u1@riseup.net>
Co-committed-by: p4u1 <p4u1_f4u1@riseup.net>
2025-02-10 14:00:42 +00:00
decentral1se 8a7fe4ca07 fix: prompt, skip adding if next present
continuous-integration/drone/push Build is passing
#486
2025-01-17 17:46:41 +01:00
decentral1se 64ad60663f test: adjust for new abra-test-recipe version
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
See #470
2025-01-09 13:14:47 +00:00
decentral1se cb3f46b46e fix: redirect to stderr for machine output
continuous-integration/drone/push Build is passing
See #477
2025-01-09 11:23:36 +00:00
decentral1se 41e514ae9a test: reset after deploy
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-09 11:54:39 +01:00
decentral1se 086b4828ff docs: better comments, remove redundant output check 2025-01-09 11:54:38 +01:00
decentral1se ed263854d4 fix: show N/A if env version unknown
See #478
2025-01-09 11:54:37 +01:00
decentral1se eb6fe4ba6e fix: dont set chaos label if no chaos
See #478
2025-01-09 11:54:36 +01:00
decentral1se 993172d31b test: ensure .env version written
continuous-integration/drone/push Build is passing
2025-01-08 13:42:35 +00:00
decentral1se c70b6e72a7 test: ensure unstaged changes preserved 2025-01-08 13:42:35 +00:00
decentral1se 22e4dd7fca fix: app new from chaos changes
See #471
2025-01-08 13:42:35 +00:00
decentral1se b6009057a8 docs: note temp autocomplete, less whitespace
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-08 12:10:17 +01:00
decentral1se b978f04910 fix: use "sudo tee" to avoid permissions error
See #474
2025-01-08 12:09:51 +01:00
decentral1se 3ac29d54d9 chore: go update des/vendor
continuous-integration/drone/push Build is passing
2025-01-07 16:59:56 +01:00
decentral1se 877c17fab5 test: re-enable this one
continuous-integration/drone/push Build is passing
2025-01-05 16:46:48 +01:00
decentral1se f01fd26ce3 test: git status output 2025-01-05 16:46:38 +01:00
decentral1se 273c165a41 docs: --chaos/-C handling for catalogue generate 2025-01-05 16:46:20 +01:00
decentral1se c88fc66c99 test: moar chaos stability 😌 [ci skip] 2025-01-05 16:12:06 +01:00
decentral1se 9b271a6963 docs: moar authors [ci skip] 2025-01-05 15:53:17 +01:00
2376 changed files with 185476 additions and 369740 deletions
-1
View File
@@ -4,5 +4,4 @@
Dockerfile
abra
dist
kadabra
tags
+68 -31
View File
@@ -3,46 +3,54 @@ kind: pipeline
name: coopcloud.tech/abra
steps:
- name: make check
image: golang:1.22
image: golang:1.27
commands:
- make check
- name: xgettext-go
image: golang:1.27
environment:
GOPRIVATE: coopcloud.tech
commands:
- go run git.coopcloud.tech/toolshed/xgettext-go@latest
-o pkg/i18n/locales/abra.pot
--keyword=i18n.G
--keyword-ctx=i18n.GC
--sort-output
--add-comments-tag="translators"
$(find . -name "*.go" -not -path "*vendor*" | sort)
depends_on:
- make check
when:
event:
exclude:
- tag
- name: xgettext-go status
image: golang:1.26-alpine3.22
commands:
- apk add patchutils git make
- cd /drone/src
- sed -i "s/charset=CHARSET/charset=UTF-8/g" pkg/i18n/locales/*.pot
- git diff pkg/i18n/locales/abra.pot | grepdiff --output-matching=hunk POT-Creation-Date | git apply --reverse --allow-empty
- git diff
- git diff-files --exit-code
depends_on:
- xgettext-go
when:
event:
exclude:
- tag
- name: make test
image: golang:1.22
image: golang:1.27
environment:
CATL_URL: https://git.coopcloud.tech/toolshed/recipes-catalogue-json.git
ABRA_DIR: /root/.abra_test
commands:
- mkdir -p $HOME/.abra
- git clone $CATL_URL $HOME/.abra/catalogue
- make test
depends_on:
- make check
- name: fetch
image: docker:git
commands:
- git fetch --tags
depends_on:
- make check
- make test
when:
event: tag
- name: release
image: goreleaser/goreleaser:v2.5.1
environment:
GITEA_TOKEN:
from_secret: goreleaser_gitea_token
volumes:
- name: deps
path: /go
commands:
- goreleaser release
depends_on:
- fetch
when:
event: tag
- name: publish image
image: plugins/docker
settings:
@@ -60,7 +68,31 @@ steps:
- make check
- make test
- name: integration test
- name: on-demand integration test
image: appleboy/drone-ssh
settings:
host:
- int.coopcloud.tech
username: abra
key:
from_secret: abra_int_private_key
port: 22
command_timeout: 60m
script_stop: true
request_pty: true
script:
- |
wget https://git.coopcloud.tech/toolshed/abra/raw/branch/main/scripts/tests/run-ci-int -O run-ci-int
chmod +x run-ci-int
sh run-ci-int
when:
ref:
- refs/heads/int-*
depends_on:
- make check
- make test
- name: nightly integration test
image: appleboy/drone-ssh
settings:
host:
@@ -87,3 +119,8 @@ steps:
volumes:
- name: deps
temp: {}
trigger:
action:
exclude:
- synchronized
+1 -1
View File
@@ -1,6 +1,6 @@
# integration test suite
# export ABRA_DIR="$HOME/.abra_test"
# export ABRA_TEST_DOMAIN=test.example.com
# export TEST_SERVER=test.example.com
# export ABRA_CI=1
# release automation
+1
View File
@@ -0,0 +1 @@
vendor/** linguist-generated=true
+2 -1
View File
@@ -1,8 +1,9 @@
*.tar.gz
*fmtcoverage.html
.e2e.env
.envrc
.vscode/
/abra
/kadabra
/bin
dist/
tests/integration/.bats
+5 -25
View File
@@ -1,4 +1,6 @@
---
version: 2
gitea_urls:
api: https://git.coopcloud.tech/api/v1
download: https://git.coopcloud.tech/
@@ -26,31 +28,9 @@ builds:
- 5
- 6
- 7
ldflags:
- "-X 'main.Commit={{ .Commit }}'"
- "-X 'main.Version={{ .Version }}'"
- "-s"
- "-w"
- id: kadabra
binary: kadabra
dir: cmd/kadabra
env:
- CGO_ENABLED=0
goos:
- linux
- darwin
goarch:
- 386
- amd64
- arm
- arm64
goarm:
- 5
- 6
- 7
gcflags:
- "all=-l -B"
flags:
- -v
- -trimpath
ldflags:
- "-X 'main.Commit={{ .Commit }}'"
- "-X 'main.Version={{ .Version }}'"
+9
View File
@@ -4,14 +4,23 @@
> please do add yourself! This is a community project, let's show some 💞
- 3wordchant
- ammaratef45
- apfelwurm
- basebuilder
- cassowary
- chasqui
- codegod100
- cyrnel
- decentral1se
- fauno
- frando
- iexos
- jade
- kawaiipunk
- knoflook
- mayel
- moritz
- namnatulco
- p4u1
- rix
- roxxers
+2 -3
View File
@@ -1,5 +1,5 @@
# Build image
FROM golang:1.22-alpine AS build
FROM golang:1.27-alpine AS build
ENV GOPRIVATE=coopcloud.tech
@@ -15,8 +15,7 @@ WORKDIR /app
RUN CGO_ENABLED=0 make build
# Release image ("slim")
FROM alpine:3.19.1
FROM alpine:3.24
RUN apk add --no-cache \
ca-certificates \
+51 -26
View File
@@ -1,48 +1,36 @@
ABRA := ./cmd/abra
KADABRA := ./cmd/kadabra
XGETTEXT := go run git.coopcloud.tech/toolshed/xgettext-go@latest
COMMIT := $(shell git rev-list -1 HEAD)
GOPATH := $(shell go env GOPATH)
GOVERSION := 1.22
GOVERSION := 1.26
LDFLAGS := "-X 'main.Commit=$(COMMIT)'"
DIST_LDFLAGS := $(LDFLAGS)" -s -w"
BFLAGS := -v -trimpath
GCFLAGS := "all=-l -B"
DOMAIN := abra
POFILES := $(wildcard pkg/i18n/locales/*.po)
MOFILES := $(patsubst %.po,%.mo,$(POFILES))
LINGUAS := $(basename $(POFILES))
export GOPRIVATE=coopcloud.tech
# NOTE(d1): default `make` optimised for Abra hacking
all: format check build-abra test
all: format check build
run-abra:
run:
@go run -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(ABRA)
run-kadabra:
@go run -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(KADABRA)
install-abra:
install:
@go install -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(ABRA)
install-kadabra:
@go install -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(KADABRA)
build:
@go build $(BFLAGS) -gcflags=$(GCFLAGS) -ldflags=$(DIST_LDFLAGS) $(ABRA)
install: install-abra install-kadabra
build-abra:
@go build -v -gcflags=$(GCFLAGS) -ldflags=$(DIST_LDFLAGS) $(ABRA)
build-kadabra:
@go build -v -gcflags=$(GCFLAGS) -ldflags=$(DIST_LDFLAGS) $(KADABRA)
build: build-abra build-kadabra
build-docker-abra:
build-docker:
@docker run -it -v $(PWD):/abra golang:$(GOVERSION) \
bash -c 'cd /abra; ./scripts/docker/build.sh'
build-docker: build-docker-abra
clean:
@rm '$(GOPATH)/bin/abra'
@rm '$(GOPATH)/bin/kadabra'
format:
@gofmt -s -w $$(find . -type f -name '*.go' | grep -v "/vendor/")
@@ -52,10 +40,47 @@ check:
(echo "gofmt: formatting issue - run 'make format' to resolve" && exit 1)
test:
@go test ./... -cover -v
@go test ./... -cover -v -p 1
find-tests:
@find . -name "*_test.go"
loc:
@find . -name "*.go" | xargs wc -l
deps:
@go get -t -u ./...
.PHONY: i18n
i18n: update-pot update-pot-po-metadata update-po build-mo
.PHONY: update-po
update-po:
@set -eu; \
for lang in $(LINGUAS); do \
msgmerge --backup=none -U $$lang.po pkg/i18n/locales/$(DOMAIN).pot; \
done
.PHONY: update-pot
update-pot:
@$(XGETTEXT) \
-o pkg/i18n/locales/$(DOMAIN).pot \
--keyword=i18n.G \
--keyword-ctx=i18n.GC \
--sort-output \
--add-comments-tag="translators" \
$$(find . -name "*.go" -not -path "*vendor*" | sort)
.PHONY: update-pot-po-metadata
update-pot-po-metadata:
@sed -i "s/charset=CHARSET/charset=UTF-8/g" pkg/i18n/locales/*.po pkg/i18n/locales/*.pot
.PHONY: build-mo
build-mo:
@set -eu; \
for lang in $(POFILES); do \
msgfmt $$lang -o $$(echo $$lang | sed 's/.po/.mo/g') --statistics; \
done
release:
@goreleaser release --clean
+1
View File
@@ -3,6 +3,7 @@
[![Build Status](https://build.coopcloud.tech/api/badges/toolshed/abra/status.svg?ref=refs/heads/main)](https://build.coopcloud.tech/toolshed/abra)
[![Go Report Card](https://goreportcard.com/badge/git.coopcloud.tech/toolshed/abra)](https://goreportcard.com/report/git.coopcloud.tech/toolshed/abra)
[![Go Reference](https://pkg.go.dev/badge/coopcloud.tech/abra.svg)](https://pkg.go.dev/coopcloud.tech/abra)
[![Translation status](https://translate.coopcloud.tech/widget/co-op-cloud/svg-badge.svg)](https://translate.coopcloud.tech/engage/co-op-cloud/)
The Co-op Cloud utility belt 🎩🐇
+12 -3
View File
@@ -1,11 +1,20 @@
package app
import (
"strings"
"coopcloud.tech/abra/pkg/i18n"
"github.com/spf13/cobra"
)
// translators: `abra app` aliases. use a comma separated list of aliases with
// no spaces in between
var appAliases = i18n.GC("a", "abra app")
var AppCommand = &cobra.Command{
Use: "app [cmd] [args] [flags]",
Aliases: []string{"a"},
Short: "Manage apps",
// translators: `app` command group
Use: i18n.G("app [cmd] [args] [flags]"),
Aliases: strings.Split(appAliases, ","),
// translators: Short description for `app` command group
Short: i18n.G("Manage apps"),
}
+90 -58
View File
@@ -2,19 +2,27 @@ package app
import (
"fmt"
"strings"
"coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/client"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/log"
"github.com/spf13/cobra"
)
// translators: `abra app backup list` aliases. use a comma separated list of aliases with
// no spaces in between
var appBackupListAliases = i18n.G("ls")
var AppBackupListCommand = &cobra.Command{
Use: "list <domain> [flags]",
Aliases: []string{"ls"},
Short: "List the contents of a snapshot",
Args: cobra.ExactArgs(1),
// translators: `app backup list` command
Use: i18n.G("list <domain> [flags]"),
Aliases: strings.Split(appBackupListAliases, ","),
// translators: Short description for `app backup list` command
Short: i18n.G("List the contents of a snapshot"),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
args []string,
@@ -40,17 +48,17 @@ var AppBackupListCommand = &cobra.Command{
}
if snapshot != "" {
log.Debugf("including SNAPSHOT=%s in backupbot exec invocation", snapshot)
log.Debug(i18n.G("including SNAPSHOT=%s in backupbot exec invocation", snapshot))
execEnv = append(execEnv, fmt.Sprintf("SNAPSHOT=%s", snapshot))
}
if showAllPaths {
log.Debugf("including SHOW_ALL=%v in backupbot exec invocation", showAllPaths)
log.Debug(i18n.G("including SHOW_ALL=%v in backupbot exec invocation", showAllPaths))
execEnv = append(execEnv, fmt.Sprintf("SHOW_ALL=%v", showAllPaths))
}
if timestamps {
log.Debugf("including TIMESTAMPS=%v in backupbot exec invocation", timestamps)
log.Debug(i18n.G("including TIMESTAMPS=%v in backupbot exec invocation", timestamps))
execEnv = append(execEnv, fmt.Sprintf("TIMESTAMPS=%v", timestamps))
}
@@ -60,14 +68,20 @@ var AppBackupListCommand = &cobra.Command{
},
}
// translators: `abra app backup download` aliases. use a comma separated list of aliases with
// no spaces in between
var appBackupDownloadAliases = i18n.G("d")
var AppBackupDownloadCommand = &cobra.Command{
Use: "download <domain> [flags]",
Aliases: []string{"d"},
Short: "Download a snapshot",
Long: `Downloads a backup.tar.gz to the current working directory.
// translators: `app backup download` command
Use: i18n.G("download <domain> [flags]"),
Aliases: strings.Split(appBackupDownloadAliases, ","),
// translators: Short description for `app backup download` command
Short: i18n.G("Download a snapshot"),
Long: i18n.G(`Downloads a backup.tar.gz to the current working directory.
"--volumes/-v" includes data contained in volumes alongide paths specified in
"backupbot.backup.path" labels.`,
"backupbot.backup.path" labels.`),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
@@ -98,22 +112,22 @@ var AppBackupDownloadCommand = &cobra.Command{
}
if snapshot != "" {
log.Debugf("including SNAPSHOT=%s in backupbot exec invocation", snapshot)
log.Debug(i18n.G("including SNAPSHOT=%s in backupbot exec invocation", snapshot))
execEnv = append(execEnv, fmt.Sprintf("SNAPSHOT=%s", snapshot))
}
if includePath != "" {
log.Debugf("including INCLUDE_PATH=%s in backupbot exec invocation", includePath)
log.Debug(i18n.G("including INCLUDE_PATH=%s in backupbot exec invocation", includePath))
execEnv = append(execEnv, fmt.Sprintf("INCLUDE_PATH=%s", includePath))
}
if includeSecrets {
log.Debugf("including SECRETS=%v in backupbot exec invocation", includeSecrets)
log.Debug(i18n.G("including SECRETS=%v in backupbot exec invocation", includeSecrets))
execEnv = append(execEnv, fmt.Sprintf("SECRETS=%v", includeSecrets))
}
if includeVolumes {
log.Debugf("including VOLUMES=%v in backupbot exec invocation", includeVolumes)
log.Debug(i18n.G("including VOLUMES=%v in backupbot exec invocation", includeVolumes))
execEnv = append(execEnv, fmt.Sprintf("VOLUMES=%v", includeVolumes))
}
@@ -129,11 +143,17 @@ var AppBackupDownloadCommand = &cobra.Command{
},
}
// translators: `abra app backup create` aliases. use a comma separated list of aliases with
// no spaces in between
var appBackupCreateAliases = i18n.G("c")
var AppBackupCreateCommand = &cobra.Command{
Use: "create <domain> [flags]",
Aliases: []string{"c"},
Short: "Create a new snapshot",
Args: cobra.ExactArgs(1),
// translators: `app backup create` command
Use: i18n.G("create <domain> [flags]"),
Aliases: strings.Split(appBackupCreateAliases, ","),
// translators: Short description for `app backup create` command
Short: i18n.G("Create a new snapshot"),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
args []string,
@@ -163,7 +183,7 @@ var AppBackupCreateCommand = &cobra.Command{
}
if retries != "" {
log.Debugf("including RETRIES=%s in backupbot exec invocation", retries)
log.Debug(i18n.G("including RETRIES=%s in backupbot exec invocation", retries))
execEnv = append(execEnv, fmt.Sprintf("RETRIES=%s", retries))
}
@@ -173,11 +193,17 @@ var AppBackupCreateCommand = &cobra.Command{
},
}
// translators: `abra app backup snapshots` aliases. use a comma separated list of aliases with
// no spaces in between
var appBackupSnapshotsAliases = i18n.G("s")
var AppBackupSnapshotsCommand = &cobra.Command{
Use: "snapshots <domain> [flags]",
Aliases: []string{"s"},
Short: "List all snapshots",
Args: cobra.ExactArgs(1),
// translators: `app backup snapshots` command
Use: i18n.G("snapshots <domain> [flags]"),
Aliases: strings.Split(appBackupSnapshotsAliases, ","),
// translators: Short description for `app backup snapshots` command
Short: i18n.G("List all snapshots"),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
args []string,
@@ -208,10 +234,16 @@ var AppBackupSnapshotsCommand = &cobra.Command{
},
}
// translators: `abra app backup` aliases. use a comma separated list of aliases with
// no spaces in between
var appBackupAliases = i18n.G("b")
var AppBackupCommand = &cobra.Command{
Use: "backup [cmd] [args] [flags]",
Aliases: []string{"b"},
Short: "Manage app backups",
// translators: `app backup` command group
Use: i18n.G("backup [cmd] [args] [flags]"),
Aliases: strings.Split(appBackupAliases, ","),
// translators: Short description for `app backup` command group
Short: i18n.G("Manage app backups"),
}
var (
@@ -227,81 +259,81 @@ var (
func init() {
AppBackupListCommand.Flags().StringVarP(
&snapshot,
"snapshot",
"s",
i18n.G("snapshot"),
i18n.G("s"),
"",
"list specific snapshot",
i18n.G("list specific snapshot"),
)
AppBackupListCommand.Flags().BoolVarP(
&showAllPaths,
"all",
"a",
i18n.G("all"),
i18n.GC("a", "app backup list"),
false,
"show all paths",
i18n.G("show all paths"),
)
AppBackupListCommand.Flags().BoolVarP(
&timestamps,
"timestamps",
"t",
i18n.G("timestamps"),
i18n.G("t"),
false,
"include timestamps",
i18n.G("include timestamps"),
)
AppBackupDownloadCommand.Flags().StringVarP(
&snapshot,
"snapshot",
"s",
i18n.G("snapshot"),
i18n.G("s"),
"",
"list specific snapshot",
i18n.G("list specific snapshot"),
)
AppBackupDownloadCommand.Flags().StringVarP(
&includePath,
"path",
"p",
i18n.G("path"),
i18n.G("p"),
"",
"volumes path",
i18n.G("volumes path"),
)
AppBackupDownloadCommand.Flags().BoolVarP(
&includeSecrets,
"secrets",
"S",
i18n.G("secrets"),
i18n.G("S"),
false,
"include secrets",
i18n.G("include secrets"),
)
AppBackupDownloadCommand.Flags().BoolVarP(
&includeVolumes,
"volumes",
"v",
i18n.G("volumes"),
i18n.G("v"),
false,
"include volumes",
i18n.G("include volumes"),
)
AppBackupDownloadCommand.Flags().BoolVarP(
&internal.Chaos,
"chaos",
"C",
i18n.G("chaos"),
i18n.G("C"),
false,
"ignore uncommitted recipes changes",
i18n.G("ignore uncommitted recipes changes"),
)
AppBackupCreateCommand.Flags().StringVarP(
&retries,
"retries",
"r",
i18n.G("retries"),
i18n.G("r"),
"1",
"number of retry attempts",
i18n.G("number of retry attempts"),
)
AppBackupCreateCommand.Flags().BoolVarP(
&internal.Chaos,
"chaos",
"C",
i18n.G("chaos"),
i18n.G("C"),
false,
"ignore uncommitted recipes changes",
i18n.G("ignore uncommitted recipes changes"),
)
}
+16 -8
View File
@@ -2,21 +2,29 @@ package app
import (
"fmt"
"strings"
"coopcloud.tech/abra/cli/internal"
appPkg "coopcloud.tech/abra/pkg/app"
"coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/formatter"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/log"
"github.com/charmbracelet/lipgloss"
"github.com/spf13/cobra"
)
// translators: `abra app check` aliases. use a comma separated list of aliases with
// no spaces in between
var appCheckAliases = i18n.G("chk")
var AppCheckCommand = &cobra.Command{
Use: "check <domain> [flags]",
Aliases: []string{"chk"},
Short: "Ensure an app is well configured",
Long: `Compare env vars in both the app ".env" and recipe ".env.sample" file.
// translators: `app check` command
Use: i18n.G("check <domain> [flags]"),
Aliases: strings.Split(appCheckAliases, ","),
// translators: Short description for `app check` command
Short: i18n.G("Ensure an app is well configured"),
Long: i18n.G(`Compare env vars in both the app ".env" and recipe ".env.sample" file.
The goal is to ensure that recipe ".env.sample" env vars are defined in your
app ".env" file. Only env var definitions in the ".env.sample" which are
@@ -25,7 +33,7 @@ these env vars, then "check" will complain.
Recipe maintainers may or may not provide defaults for env vars within their
recipes regardless of commenting or not (e.g. through the use of
${FOO:<default>} syntax). "check" does not confirm or deny this for you.`,
${FOO:<default>} syntax). "check" does not confirm or deny this for you.`),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
@@ -83,9 +91,9 @@ ${FOO:<default>} syntax). "check" does not confirm or deny this for you.`,
func init() {
AppCheckCommand.Flags().BoolVarP(
&internal.Chaos,
"chaos",
"C",
i18n.G("chaos"),
i18n.G("C"),
false,
"ignore uncommitted recipes changes",
i18n.G("ignore uncommitted recipes changes"),
)
}
+52 -39
View File
@@ -13,15 +13,22 @@ import (
appPkg "coopcloud.tech/abra/pkg/app"
"coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/client"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/log"
"github.com/spf13/cobra"
)
// translators: `abra app cmd` aliases. use a comma separated list of aliases with
// no spaces in between
var appCmdAliases = i18n.G("cmd")
var AppCmdCommand = &cobra.Command{
Use: "command <domain> [service | --local] <cmd> [[args] [flags] | [flags] -- [args]]",
Aliases: []string{"cmd"},
Short: "Run app commands",
Long: `Run an app specific command.
// translators: `app command` command
Use: i18n.G("command <domain> [service | --local] <cmd> [[args] [flags] | [flags] -- [args]]"),
Aliases: strings.Split(appCmdAliases, ","),
// translators: Short description for `app cmd` command
Short: i18n.G("Run app commands"),
Long: i18n.G(`Run an app specific command.
These commands are bash functions, defined in the abra.sh of the recipe itself.
They can be run within the context of a service (e.g. app) or locally on your
@@ -30,24 +37,24 @@ work station by passing "--local/-l".
N.B. If using the "--" style to pass arguments, flags (e.g. "--local/-l") must
be passed *before* the "--". It is possible to pass arguments without the "--"
as long as no dashes are present (i.e. "foo" works without "--", "-foo"
does not).`,
Example: ` # pass <cmd> args/flags without "--"
does not).`),
Example: i18n.G(` # pass <cmd> args/flags without "--"
abra app cmd 1312.net app my_cmd_arg foo --user bar
# pass <cmd> args/flags with "--"
abra app cmd 1312.net app my_cmd_args --user bar -- foo -vvv
# drop the [service] arg if using "--local/-l"
abra app cmd 1312.net my_cmd --local`,
abra app cmd 1312.net my_cmd --local`),
Args: func(cmd *cobra.Command, args []string) error {
if local {
if !(len(args) >= 2) {
return errors.New("requires at least 2 arguments with --local/-l")
return errors.New(i18n.G("requires at least 2 arguments with --local/-l"))
}
if slices.Contains(os.Args, "--") {
if cmd.ArgsLenAtDash() > 2 {
return errors.New("accepts at most 2 args with --local/-l")
return errors.New(i18n.G("accepts at most 2 args with --local/-l"))
}
}
@@ -63,7 +70,7 @@ does not).`,
}
if !(len(args) >= 3) {
return errors.New("requires at least 3 arguments")
return errors.New(i18n.G("requires at least 3 arguments"))
}
return nil
@@ -97,14 +104,14 @@ does not).`,
}
if local && remoteUser != "" {
log.Fatal("cannot use --local & --user together")
log.Fatal(i18n.G("cannot use --local & --user together"))
}
hasCmdArgs, parsedCmdArgs := parseCmdArgs(args, local)
if _, err := os.Stat(app.Recipe.AbraShPath); err != nil {
if os.IsNotExist(err) {
log.Fatalf("%s does not exist for %s?", app.Recipe.AbraShPath, app.Name)
log.Fatal(i18n.G("%s does not exist for %s?", app.Recipe.AbraShPath, app.Name))
}
log.Fatal(err)
}
@@ -115,7 +122,7 @@ does not).`,
log.Fatal(err)
}
log.Debugf("--local detected, running %s on local work station", cmdName)
log.Debug(i18n.G("--local detected, running %s on local work station", cmdName))
var exportEnv string
for k, v := range app.Env {
@@ -124,16 +131,16 @@ does not).`,
var sourceAndExec string
if hasCmdArgs {
log.Debugf("parsed following command arguments: %s", parsedCmdArgs)
log.Debug(i18n.G("parsed following command arguments: %s", parsedCmdArgs))
sourceAndExec = fmt.Sprintf("TARGET=local; APP_NAME=%s; STACK_NAME=%s; %s . %s; %s %s", app.Name, app.StackName(), exportEnv, app.Recipe.AbraShPath, cmdName, parsedCmdArgs)
} else {
log.Debug("did not detect any command arguments")
log.Debug(i18n.G("did not detect any command arguments"))
sourceAndExec = fmt.Sprintf("TARGET=local; APP_NAME=%s; STACK_NAME=%s; %s . %s; %s", app.Name, app.StackName(), exportEnv, app.Recipe.AbraShPath, cmdName)
}
shell := "/bin/bash"
if _, err := os.Stat(shell); errors.Is(err, os.ErrNotExist) {
log.Debugf("%s does not exist locally, use /bin/sh as fallback", shell)
log.Debug(i18n.G("%s does not exist locally, use /bin/sh as fallback", shell))
shell = "/bin/sh"
}
cmd := exec.Command(shell, "-c", sourceAndExec)
@@ -164,15 +171,15 @@ does not).`,
}
if !matchingServiceName {
log.Fatalf("no service %s for %s?", targetServiceName, app.Name)
log.Fatal(i18n.G("no service %s for %s?", targetServiceName, app.Name))
}
log.Debugf("running command %s within the context of %s_%s", cmdName, app.StackName(), targetServiceName)
log.Debug(i18n.G("running command %s within the context of %s_%s", cmdName, app.StackName(), targetServiceName))
if hasCmdArgs {
log.Debugf("parsed following command arguments: %s", parsedCmdArgs)
log.Debug(i18n.G("parsed following command arguments: %s", parsedCmdArgs))
} else {
log.Debug("did not detect any command arguments")
log.Debug(i18n.G("did not detect any command arguments"))
}
cl, err := client.New(app.Server)
@@ -183,7 +190,7 @@ does not).`,
if err := internal.RunCmdRemote(
cl,
app,
requestTTY,
disableTTY,
app.Recipe.AbraShPath,
targetServiceName, cmdName, parsedCmdArgs, remoteUser); err != nil {
log.Fatal(err)
@@ -191,11 +198,17 @@ does not).`,
},
}
// translators: `abra app command list` aliases. use a comma separated list of
// aliases with no spaces in between
var appCmdListAliases = i18n.G("ls")
var AppCmdListCommand = &cobra.Command{
Use: "list <domain> [flags]",
Aliases: []string{"ls"},
Short: "List all available commands",
Args: cobra.MinimumNArgs(1),
// translators: `app cmd list` command
Use: i18n.G("list <domain> [flags]"),
Aliases: strings.Split(appCmdListAliases, ","),
// translators: Short description for `app cmd list` command
Short: i18n.G("List all available commands"),
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
app := internal.ValidateApp(args)
@@ -238,39 +251,39 @@ func parseCmdArgs(args []string, isLocal bool) (bool, string) {
var (
local bool
remoteUser string
requestTTY bool
disableTTY bool
)
func init() {
AppCmdCommand.Flags().BoolVarP(
&local,
"local",
"l",
i18n.G("local"),
i18n.G("l"),
false,
"run command locally",
i18n.G("run command locally"),
)
AppCmdCommand.Flags().StringVarP(
&remoteUser,
"user",
"u",
i18n.G("user"),
i18n.G("u"),
"",
"request remote user",
i18n.G("request remote user"),
)
AppCmdCommand.Flags().BoolVarP(
&requestTTY,
"tty",
"t",
&disableTTY,
i18n.G("tty"),
i18n.G("T"),
false,
"request remote TTY",
i18n.G("disable remote TTY"),
)
AppCmdCommand.Flags().BoolVarP(
&internal.Chaos,
"chaos",
"C",
i18n.G("chaos"),
i18n.G("C"),
false,
"ignore uncommitted recipes changes",
i18n.G("ignore uncommitted recipes changes"),
)
}
+14 -6
View File
@@ -3,19 +3,27 @@ package app
import (
"os"
"os/exec"
"strings"
appPkg "coopcloud.tech/abra/pkg/app"
"coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/log"
"github.com/AlecAivazis/survey/v2"
"github.com/spf13/cobra"
)
// translators: `abra app config` aliases. use a comma separated list of
// aliases with no spaces in between
var appConfigAliases = i18n.G("cfg")
var AppConfigCommand = &cobra.Command{
Use: "config <domain> [flags]",
Aliases: []string{"cfg"},
Short: "Edit app config",
Example: " abra config 1312.net",
// translators: `app config` command
Use: i18n.G("config <domain> [flags]"),
Aliases: strings.Split(appConfigAliases, ","),
// translators: Short description for `app config` command
Short: i18n.G("Edit app config"),
Example: i18n.G(" abra config 1312.net"),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
@@ -32,13 +40,13 @@ var AppConfigCommand = &cobra.Command{
appName := args[0]
appFile, exists := files[appName]
if !exists {
log.Fatalf("cannot find app with name %s", appName)
log.Fatal(i18n.G("cannot find app with name %s", appName))
}
ed, ok := os.LookupEnv("EDITOR")
if !ok {
edPrompt := &survey.Select{
Message: "which editor do you wish to use?",
Message: i18n.G("which editor do you wish to use?"),
Options: []string{"vi", "vim", "nvim", "nano", "pico", "emacs"},
}
if err := survey.AskOne(edPrompt, &ed); err != nil {
+33 -27
View File
@@ -3,7 +3,6 @@ package app
import (
"context"
"errors"
"fmt"
"io"
"os"
"path"
@@ -15,25 +14,32 @@ import (
"coopcloud.tech/abra/pkg/client"
containerPkg "coopcloud.tech/abra/pkg/container"
"coopcloud.tech/abra/pkg/formatter"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/log"
"coopcloud.tech/abra/pkg/upstream/container"
"github.com/docker/cli/cli/command"
"github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container"
dockerClient "github.com/docker/docker/client"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/pkg/archive"
"github.com/spf13/cobra"
)
// translators: `abra app cp` aliases. use a comma separated list of aliases with
// no spaces in between
var appCpAliases = i18n.G("c")
var AppCpCommand = &cobra.Command{
Use: "cp <domain> <src> <dst> [flags]",
Aliases: []string{"c"},
Short: "Copy files to/from a deployed app service",
Example: ` # copy myfile.txt to the root of the app service
// translators: `app cp` command
Use: i18n.G("cp <domain> <src> <dst> [flags]"),
Aliases: strings.Split(appCpAliases, ","),
// translators: Short description for `app cp` command
Short: i18n.G("Copy files to/from a deployed app service"),
Example: i18n.G(` # copy myfile.txt to the root of the app service
abra app cp 1312.net myfile.txt app:/
# copy that file back to your current working directory locally
abra app cp 1312.net app:/myfile.txt`,
abra app cp 1312.net app:/myfile.txt ./`),
Args: cobra.ExactArgs(3),
ValidArgsFunction: func(
cmd *cobra.Command,
@@ -69,7 +75,7 @@ var AppCpCommand = &cobra.Command{
if err != nil {
log.Fatal(err)
}
log.Debugf("retrieved %s as target container on %s", formatter.ShortenID(container.ID), app.Server)
log.Debug(i18n.G("retrieved %s as target container on %s", formatter.ShortenID(container.ID), app.Server))
if toContainer {
err = CopyToContainer(cl, container.ID, srcPath, dstPath)
@@ -82,7 +88,7 @@ var AppCpCommand = &cobra.Command{
},
}
var errServiceMissing = errors.New("one of <src>/<dest> arguments must take $SERVICE:$PATH form")
var errServiceMissing = errors.New(i18n.G("one of <src>/<dest> arguments must take $SERVICE:$PATH form"))
// parseSrcAndDst parses src and dest string. One of src or dst must be of the form $SERVICE:$PATH
func parseSrcAndDst(src, dst string) (srcPath string, dstPath string, service string, toContainer bool, err error) {
@@ -105,7 +111,7 @@ func parseSrcAndDst(src, dst string) (srcPath string, dstPath string, service st
func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath string) error {
srcStat, err := os.Stat(srcPath)
if err != nil {
return fmt.Errorf("local %s ", err)
return errors.New(i18n.G("local %s ", err))
}
dstStat, err := cl.ContainerStatPath(context.Background(), containerID, dstPath)
@@ -114,7 +120,7 @@ func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath stri
if errdefs.IsNotFound(err) {
dstExists = false
} else {
return fmt.Errorf("remote path: %s", err)
return errors.New(i18n.G("remote path: %s", err))
}
}
@@ -134,7 +140,7 @@ func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath stri
if err != nil {
return err
}
if _, err := container.RunExec(dcli, cl, containerID, &types.ExecConfig{
if _, err := container.RunExec(dcli, cl, containerID, &containertypes.ExecOptions{
AttachStderr: true,
AttachStdin: true,
AttachStdout: true,
@@ -142,7 +148,7 @@ func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath stri
Detach: false,
Tty: true,
}); err != nil {
return fmt.Errorf("create remote directory: %s", err)
return errors.New(i18n.G("create remote directory: %s", err))
}
case CopyModeFileToFile:
// Remove the file component from the path, since docker can only copy
@@ -161,8 +167,8 @@ func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath stri
return err
}
log.Debugf("copy %s from local to %s on container", srcPath, dstPath)
copyOpts := types.CopyToContainerOptions{AllowOverwriteDirWithFile: false, CopyUIDGID: false}
log.Debug(i18n.G("copy %s from local to %s on container", srcPath, dstPath))
copyOpts := containertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: false, CopyUIDGID: false}
if err := cl.CopyToContainer(context.Background(), containerID, dstPath, content, copyOpts); err != nil {
return err
}
@@ -173,7 +179,7 @@ func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath stri
if err != nil {
return err
}
if _, err := container.RunExec(dcli, cl, containerID, &types.ExecConfig{
if _, err := container.RunExec(dcli, cl, containerID, &containertypes.ExecOptions{
AttachStderr: true,
AttachStdin: true,
AttachStdout: true,
@@ -181,7 +187,7 @@ func CopyToContainer(cl *dockerClient.Client, containerID, srcPath, dstPath stri
Detach: false,
Tty: true,
}); err != nil {
return fmt.Errorf("create remote directory: %s", err)
return errors.New(i18n.G("create remote directory: %s", err))
}
}
@@ -194,9 +200,9 @@ func CopyFromContainer(cl *dockerClient.Client, containerID, srcPath, dstPath st
srcStat, err := cl.ContainerStatPath(context.Background(), containerID, srcPath)
if err != nil {
if errdefs.IsNotFound(err) {
return fmt.Errorf("remote: %s does not exist", srcPath)
return errors.New(i18n.G("remote: %s does not exist", srcPath))
} else {
return fmt.Errorf("remote path: %s", err)
return errors.New(i18n.G("remote path: %s", err))
}
}
@@ -207,7 +213,7 @@ func CopyFromContainer(cl *dockerClient.Client, containerID, srcPath, dstPath st
if os.IsNotExist(err) {
dstExists = false
} else {
return fmt.Errorf("remote path: %s", err)
return errors.New(i18n.G("remote path: %s", err))
}
} else {
dstMode = dstStat.Mode()
@@ -242,7 +248,7 @@ func CopyFromContainer(cl *dockerClient.Client, containerID, srcPath, dstPath st
content, _, err := cl.CopyFromContainer(context.Background(), containerID, srcPath)
if err != nil {
return fmt.Errorf("copy: %s", err)
return errors.New(i18n.G("copy: %s", err))
}
defer content.Close()
if err := archive.Untar(content, dstPath, &archive.TarOptions{
@@ -250,7 +256,7 @@ func CopyFromContainer(cl *dockerClient.Client, containerID, srcPath, dstPath st
Compression: archive.Gzip,
NoLchown: true,
}); err != nil {
return fmt.Errorf("untar: %s", err)
return errors.New(i18n.G("untar: %s", err))
}
if moveDstFile != "" {
@@ -269,8 +275,8 @@ func CopyFromContainer(cl *dockerClient.Client, containerID, srcPath, dstPath st
}
var (
ErrCopyDirToFile = fmt.Errorf("can't copy dir to file")
ErrDstDirNotExist = fmt.Errorf("destination directory does not exist")
ErrCopyDirToFile = errors.New(i18n.G("can't copy dir to file"))
ErrDstDirNotExist = errors.New(i18n.G("destination directory does not exist"))
)
type CopyMode int
@@ -375,9 +381,9 @@ func moveFile(sourcePath, destPath string) error {
func init() {
AppCpCommand.Flags().BoolVarP(
&internal.Chaos,
"chaos",
"C",
i18n.G("chaos"),
i18n.G("C"),
false,
"ignore uncommitted recipes changes",
i18n.G("ignore uncommitted recipes changes"),
)
}
+230 -127
View File
@@ -2,19 +2,22 @@ package app
import (
"context"
"errors"
"fmt"
"strings"
"coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/app"
"coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/config"
"coopcloud.tech/abra/pkg/envfile"
"coopcloud.tech/abra/pkg/secret"
"coopcloud.tech/tagcmp"
appPkg "coopcloud.tech/abra/pkg/app"
"coopcloud.tech/abra/pkg/client"
"coopcloud.tech/abra/pkg/deploy"
"coopcloud.tech/abra/pkg/dns"
"coopcloud.tech/abra/pkg/formatter"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/lint"
"coopcloud.tech/abra/pkg/log"
"coopcloud.tech/abra/pkg/upstream/stack"
@@ -22,16 +25,22 @@ import (
"github.com/spf13/cobra"
)
// translators: `abra app deploy` aliases. use a comma separated list of aliases with
// no spaces in between
var appDeployAliases = i18n.G("d")
var AppDeployCommand = &cobra.Command{
Use: "deploy <domain> [version] [flags]",
Aliases: []string{"d"},
Short: "Deploy an app",
Long: `Deploy an app.
// translators: `app deploy` command
Use: i18n.G("deploy <domain> [version] [flags]"),
Aliases: strings.Split(appDeployAliases, ","),
// translators: Short description for `app deploy` command
Short: i18n.G("Deploy an app"),
Long: i18n.G(`Deploy an app.
This command supports chaos operations. Use "--chaos/-C" to deploy your recipe
checkout as-is. Recipe commit hashes are also supported as values for
"[version]". Please note, "upgrade"/"rollback" do not support chaos operations.`,
Example: ` # standard deployment
"[version]". Please note, "upgrade"/"rollback" do not support chaos operations.`),
Example: i18n.G(` # standard deployment
abra app deploy 1312.net
# chaos deployment
@@ -41,19 +50,20 @@ checkout as-is. Recipe commit hashes are also supported as values for
abra app deploy 1312.net 2.0.0+1.2.3
# deploy a specific git hash
abra app deploy 1312.net 886db76d`,
abra app deploy 1312.net 886db76d`),
Args: cobra.RangeArgs(1, 2),
ValidArgsFunction: func(
cmd *cobra.Command,
args []string,
toComplete string) ([]string, cobra.ShellCompDirective) {
toComplete string,
) ([]string, cobra.ShellCompDirective) {
switch l := len(args); l {
case 0:
return autocomplete.AppNameComplete()
case 1:
app, err := appPkg.Get(args[0])
if err != nil {
errMsg := fmt.Sprintf("autocomplete failed: %s", err)
errMsg := i18n.G("autocomplete failed: %s", err)
return []string{errMsg}, cobra.ShellCompDirectiveError
}
return autocomplete.RecipeVersionComplete(app.Recipe.Name)
@@ -63,10 +73,8 @@ checkout as-is. Recipe commit hashes are also supported as values for
},
Run: func(cmd *cobra.Command, args []string) {
var (
deployWarnMessages []string
toDeployVersion string
isChaosCommit bool
toDeployChaosVersion = config.CHAOS_DEFAULT
deployWarnMessages []string
toDeployVersion string
)
app := internal.ValidateApp(args)
@@ -79,16 +87,12 @@ checkout as-is. Recipe commit hashes are also supported as values for
log.Fatal(err)
}
if err := lint.LintForErrors(app.Recipe); err != nil {
log.Fatal(err)
}
cl, err := client.New(app.Server)
if err != nil {
log.Fatal(err)
}
log.Debugf("checking whether %s is already deployed", app.StackName())
log.Debug(i18n.G("checking whether %s is already deployed", app.StackName()))
deployMeta, err := stack.IsDeployed(context.Background(), cl, app.StackName())
if err != nil {
@@ -96,48 +100,39 @@ checkout as-is. Recipe commit hashes are also supported as values for
}
if deployMeta.IsDeployed && !(internal.Force || internal.Chaos) {
log.Fatalf("%s is already deployed", app.Name)
log.Fatal(i18n.G("%s is already deployed", app.Name))
}
if len(args) == 2 && args[1] != "" {
toDeployVersion = args[1]
toDeployVersion, err = getDeployVersion(args, deployMeta, app)
if err != nil {
log.Fatal(err)
}
if !deployMeta.IsDeployed &&
toDeployVersion == "" &&
app.Recipe.EnvVersion != "" && !internal.IgnoreEnvVersion {
log.Debugf("new deployment, choosing .env version: %s", app.Recipe.EnvVersion)
toDeployVersion = app.Recipe.EnvVersion
isChaosCommit, err := app.Recipe.IsChaosCommit(toDeployVersion)
if err != nil {
log.Fatal(i18n.G("unable to determine if %s is a chaos commit: %s", toDeployVersion, err))
}
if !internal.Chaos && toDeployVersion == "" {
if err := getLatestVersionOrCommit(app, &toDeployVersion); err != nil {
log.Fatal(err)
}
}
if internal.Chaos {
if err := getChaosVersion(app, &toDeployVersion, &toDeployChaosVersion); err != nil {
log.Fatal(err)
}
if !isChaosCommit && !tagcmp.IsParsable(toDeployVersion) {
log.Fatal(i18n.G("unable to parse deploy version: %s", toDeployVersion))
}
if !internal.Chaos {
isChaosCommit, err = app.Recipe.EnsureVersion(toDeployVersion)
isChaosCommit, err := app.Recipe.EnsureVersion(toDeployVersion)
if err != nil {
log.Fatal(err)
log.Fatal(i18n.G("ensure recipe: %s", err))
}
if isChaosCommit {
log.Debugf("assuming chaos commit: %s", toDeployVersion)
log.Warnf(i18n.G("version '%s' appears to be a chaos commit, but --chaos/-C was not provided", toDeployVersion))
internal.Chaos = true
toDeployChaosVersion = toDeployVersion
}
}
toDeployVersion, err = app.Recipe.GetVersionLabelLocal()
if err != nil {
log.Fatal(err)
}
if err := lint.LintForErrors(app.Recipe); err != nil {
if internal.Chaos {
log.Warn(err)
} else {
log.Fatal(err)
}
}
@@ -145,13 +140,9 @@ checkout as-is. Recipe commit hashes are also supported as values for
log.Fatal(err)
}
abraShEnv, err := envfile.ReadAbraShEnvVars(app.Recipe.AbraShPath)
if err != nil {
if err := deploy.MergeAbraShEnv(app.Recipe, app.Env); err != nil {
log.Fatal(err)
}
for k, v := range abraShEnv {
app.Env[k] = v
}
composeFiles, err := app.Recipe.GetComposeFiles(app.Env)
if err != nil {
@@ -160,27 +151,38 @@ checkout as-is. Recipe commit hashes are also supported as values for
stackName := app.StackName()
deployOpts := stack.Deploy{
Composefiles: composeFiles,
Namespace: stackName,
Prune: false,
ResolveImage: stack.ResolveImageAlways,
Detach: false,
Composefiles: composeFiles,
Namespace: stackName,
Prune: false,
ResolveImage: stack.ResolveImageAlways,
Detach: false,
SendRegistryAuth: true,
}
compose, err := appPkg.GetAppComposeConfig(app.Name, deployOpts, app.Env)
if err != nil {
log.Fatal(err)
}
toDeployChaosVersionLabel := toDeployChaosVersion
if app.Recipe.Dirty {
toDeployChaosVersionLabel = formatter.AddDirtyMarker(toDeployChaosVersionLabel)
}
appPkg.ExposeAllEnv(stackName, compose, app.Env)
appPkg.SetRecipeLabel(compose, stackName, app.Recipe.Name)
appPkg.SetChaosLabel(compose, stackName, internal.Chaos)
appPkg.SetChaosVersionLabel(compose, stackName, toDeployChaosVersionLabel)
appPkg.SetUpdateLabel(compose, stackName, app.Env)
if internal.Chaos {
appPkg.SetChaosVersionLabel(compose, stackName, toDeployVersion)
}
versionLabel := toDeployVersion
if internal.Chaos {
for _, service := range compose.Services {
if service.Name == "app" {
labelKey := fmt.Sprintf("coop-cloud.%s.version", stackName)
// NOTE(d1): keep non-chaos version labbeling when doing chaos ops
versionLabel = service.Deploy.Labels[labelKey]
}
}
}
appPkg.SetVersionLabel(compose, stackName, versionLabel)
newRecipeWithDeployVersion := fmt.Sprintf("%s:%s", app.Recipe.Name, toDeployVersion)
appPkg.ExposeAllEnv(stackName, compose, app.Env, newRecipeWithDeployVersion)
envVars, err := appPkg.CheckEnv(app)
if err != nil {
@@ -190,7 +192,7 @@ checkout as-is. Recipe commit hashes are also supported as values for
for _, envVar := range envVars {
if !envVar.Present {
deployWarnMessages = append(deployWarnMessages,
fmt.Sprintf("%s missing from %s.env", envVar.Name, app.Domain),
i18n.G("%s missing from %s.env", envVar.Name, app.Domain),
)
}
}
@@ -201,30 +203,48 @@ checkout as-is. Recipe commit hashes are also supported as values for
log.Fatal(err)
}
} else {
log.Debug("skipping domain checks, no DOMAIN=... configured")
log.Debug(i18n.G("skipping domain checks, no DOMAIN=... configured"))
}
} else {
log.Debug("skipping domain checks")
log.Debug(i18n.G("skipping domain checks"))
}
deployedVersion := config.NO_VERSION_DEFAULT
deployedVersion := config.MISSING_DEFAULT
if deployMeta.IsDeployed {
deployedVersion = deployMeta.Version
if deployMeta.IsChaos {
deployedVersion = deployMeta.ChaosVersion
}
}
toWriteVersion := toDeployVersion
if internal.Chaos || isChaosCommit {
toWriteVersion = toDeployChaosVersion
// Gather secrets
secretInfo, err := deploy.GatherSecretsForDeploy(cl, app, internal.ShowUnchanged)
if err != nil {
log.Fatal(err)
}
// Gather configs
configInfo, err := deploy.GatherConfigsForDeploy(cl, app, compose, app.Env, internal.ShowUnchanged)
if err != nil {
log.Fatal(err)
}
// Gather images
imageInfo, err := deploy.GatherImagesForDeploy(cl, app, compose, internal.ShowUnchanged)
if err != nil {
log.Fatal(err)
}
// Show deploy overview
if err := internal.DeployOverview(
app,
deployWarnMessages,
deployedVersion,
deployMeta.ChaosVersion,
toDeployVersion,
toDeployChaosVersion,
toWriteVersion,
"",
deployWarnMessages,
secretInfo,
configInfo,
imageInfo,
); err != nil {
log.Fatal(err)
}
@@ -234,79 +254,97 @@ checkout as-is. Recipe commit hashes are also supported as values for
log.Fatal(err)
}
log.Debugf("set waiting timeout to %d second(s)", stack.WaitTimeout)
serviceNames, err := appPkg.GetAppServiceNames(app.Name)
if err != nil {
log.Fatal(err)
}
if err := stack.RunDeploy(cl, deployOpts, compose, app.Name, internal.DontWaitConverge); err != nil {
f, err := app.Filters(true, false, serviceNames...)
if err != nil {
log.Fatal(err)
}
if err := stack.RunDeploy(
cl,
deployOpts,
compose,
app.Name,
app.Server,
internal.DontWaitConverge,
internal.NoInput,
f,
); err != nil {
log.Fatal(err)
}
postDeployCmds, ok := app.Env["POST_DEPLOY_CMDS"]
if ok && !internal.DontWaitConverge {
log.Debugf("run the following post-deploy commands: %s", postDeployCmds)
log.Debug(i18n.G("run the following post-deploy commands: %s", postDeployCmds))
if err := internal.PostCmds(cl, app, postDeployCmds); err != nil {
log.Fatalf("attempting to run post deploy commands, saw: %s", err)
log.Fatal(i18n.G("attempting to run post deploy commands, saw: %s", err))
}
}
if err := app.WriteRecipeVersion(toWriteVersion, false); err != nil {
log.Fatalf("writing recipe version failed: %s", err)
if err := app.WriteRecipeVersion(toDeployVersion, false); err != nil {
log.Fatal(i18n.G("writing recipe version failed: %s", err))
}
},
}
func getChaosVersion(app app.App, toDeployVersion, toDeployChaosVersion *string) error {
var err error
*toDeployChaosVersion, err = app.Recipe.ChaosVersion()
func getLatestVersionOrCommit(app appPkg.App) (string, error) {
recipeVersions, warnings, err := app.Recipe.GetRecipeVersions()
if err != nil {
return err
return "", err
}
*toDeployVersion, err = app.Recipe.GetVersionLabelLocal()
if err != nil {
return err
for _, warning := range warnings {
log.Warn(warning)
}
return nil
}
func getLatestVersionOrCommit(app app.App, toDeployVersion *string) error {
versions, err := app.Recipe.Tags()
if err != nil {
return err
}
if len(versions) > 0 && !internal.Chaos {
*toDeployVersion = versions[len(versions)-1]
log.Debugf("choosing %s as version to deploy", *toDeployVersion)
if _, err := app.Recipe.EnsureVersion(*toDeployVersion); err != nil {
return err
if len(recipeVersions) > 0 && !internal.Chaos {
latest := recipeVersions[len(recipeVersions)-1]
for tag := range latest {
log.Debug(i18n.G("selected latest recipe version: %s (from %d available versions)", tag, len(recipeVersions)))
return tag, nil
}
return nil
}
head, err := app.Recipe.Head()
if err != nil {
return err
return "", err
}
*toDeployVersion = formatter.SmallSHA(head.String())
return nil
return formatter.SmallSHA(head.String()), nil
}
// validateArgsAndFlags ensures compatible args/flags.
func validateArgsAndFlags(args []string) error {
if len(args) == 2 && args[1] != "" && internal.Chaos {
return fmt.Errorf("cannot use [version] and --chaos together")
return errors.New(i18n.G("cannot use [version] and --chaos together"))
}
if len(args) == 2 && args[1] != "" && internal.DeployLatest {
return errors.New(i18n.G("cannot use [version] and --latest together"))
}
if internal.DeployLatest && internal.Chaos {
return errors.New(i18n.G("cannot use --chaos and --latest together"))
}
return nil
}
func validateSecrets(cl *dockerClient.Client, app app.App) error {
func validateSecrets(cl *dockerClient.Client, app appPkg.App) error {
composeFiles, err := app.Recipe.GetComposeFiles(app.Env)
if err != nil {
return err
}
secretsConfig, err := secret.ReadSecretsConfig(app.Path, composeFiles, app.StackName())
if err != nil {
return err
}
secStats, err := secret.PollSecretsStatus(cl, app)
if err != nil {
return err
@@ -314,43 +352,108 @@ func validateSecrets(cl *dockerClient.Client, app app.App) error {
for _, secStat := range secStats {
if !secStat.CreatedOnRemote {
return fmt.Errorf("secret not generated: %s", secStat.LocalName)
secretConfig := secretsConfig[secStat.LocalName]
if secretConfig.SkipGenerate {
return errors.New(i18n.G("secret not inserted (#generate=false): %s", secStat.LocalName))
}
return errors.New(i18n.G("secret not generated: %s", secStat.LocalName))
}
}
return nil
}
func getDeployVersion(cliArgs []string, deployMeta stack.DeployMeta, app appPkg.App) (string, error) {
// Chaos mode overrides everything
if internal.Chaos {
v, err := app.Recipe.ChaosVersion()
if err != nil {
return "", err
}
log.Debug(i18n.G("version: taking chaos version: %s", v))
return v, nil
}
// Check if the deploy version is set with a cli argument
if len(cliArgs) == 2 && cliArgs[1] != "" {
log.Debug(i18n.G("version: taking version from cli arg: %s", cliArgs[1]))
return cliArgs[1], nil
}
// Check if the recipe has a version in the .env file
if app.Recipe.EnvVersion != "" && !internal.DeployLatest {
if strings.HasSuffix(app.Recipe.EnvVersionRaw, "+U") {
// NOTE(d1): use double-line 5 spaces ("FATA ") trick to make a more
// informative error message. it's ugly but that's our logging situation
// atm
return "", errors.New(i18n.G(`cannot redeploy previous chaos version (%s), did you mean to use "--chaos"?
to return to a regular release, specify a release tag, commit SHA or use "--latest"`,
formatter.BoldDirtyDefault(app.Recipe.EnvVersionRaw)))
}
log.Debug(i18n.G("version: taking version from .env file: %s", app.Recipe.EnvVersion))
return app.Recipe.EnvVersion, nil
}
// Take deployed version
if deployMeta.IsDeployed && !internal.DeployLatest {
log.Debug(i18n.G("version: taking deployed version: %s", deployMeta.Version))
return deployMeta.Version, nil
}
v, err := getLatestVersionOrCommit(app)
log.Debug(i18n.G("version: taking new recipe version: %s", v))
if err != nil {
return "", err
}
return v, nil
}
func init() {
AppDeployCommand.Flags().BoolVarP(
&internal.Chaos,
"chaos",
"C",
i18n.G("chaos"),
i18n.G("C"),
false,
"ignore uncommitted recipes changes",
i18n.G("ignore uncommitted recipes changes"),
)
AppDeployCommand.Flags().BoolVarP(
&internal.Force,
"force",
"f",
i18n.G("force"),
i18n.G("f"),
false,
"perform action without further prompt",
i18n.G("perform action without further prompt"),
)
AppDeployCommand.Flags().BoolVarP(
&internal.NoDomainChecks,
"no-domain-checks",
"D",
i18n.G("no-domain-checks"),
i18n.G("D"),
false,
"disable public DNS checks",
i18n.G("disable public DNS checks"),
)
AppDeployCommand.Flags().BoolVarP(
&internal.DontWaitConverge,
"no-converge-checks",
"c",
i18n.G("no-converge-checks"),
i18n.G("c"),
false,
"disable converge logic checks",
i18n.G("disable converge logic checks"),
)
AppDeployCommand.PersistentFlags().BoolVarP(
&internal.DeployLatest,
i18n.G("latest"),
i18n.G("l"),
false,
i18n.G("deploy latest recipe version"),
)
AppDeployCommand.Flags().BoolVarP(
&internal.ShowUnchanged,
i18n.G("show-unchanged"),
i18n.G("U"),
false,
i18n.G("show all configs & images, including unchanged ones"),
)
}
+307 -6
View File
@@ -1,20 +1,50 @@
package app
import (
"context"
"fmt"
"os"
"path"
"path/filepath"
"regexp"
"sort"
"strings"
"coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/app"
appPkg "coopcloud.tech/abra/pkg/app"
"coopcloud.tech/abra/pkg/autocomplete"
"coopcloud.tech/abra/pkg/client"
"coopcloud.tech/abra/pkg/config"
containerPkg "coopcloud.tech/abra/pkg/container"
contextPkg "coopcloud.tech/abra/pkg/context"
"coopcloud.tech/abra/pkg/formatter"
"coopcloud.tech/abra/pkg/i18n"
"coopcloud.tech/abra/pkg/log"
"coopcloud.tech/abra/pkg/upstream/stack"
"github.com/docker/docker/api/types/filters"
"github.com/spf13/cobra"
)
var AppEnvCommand = &cobra.Command{
Use: "env <domain> [flags]",
Aliases: []string{"e"},
Short: "Show app .env values",
Example: " abra app env 1312.net",
// translators: `abra app env` aliases. use a comma separated list of aliases
// with no spaces in between
var appEnvAliases = i18n.G("e")
// translators: `abra app env list` aliases. use a comma separated list of
// aliases with no spaces in between
var appEnvListAliases = i18n.G("l,ls")
// translators: `abra app env pull` aliases. use a comma separated list of
// aliases with no spaces in between
var appEnvPullAliases = i18n.G("pl,p")
var AppEnvListCommand = &cobra.Command{
// translators: `app env list` command
Use: i18n.G("list <domain> [flags]"),
Aliases: strings.Split(appEnvListAliases, ","),
// translators: Short description for `app env list` command
Short: i18n.G("List all app environment values"),
Example: i18n.G(" abra app env list 1312.net"),
Args: cobra.ExactArgs(1),
ValidArgsFunction: func(
cmd *cobra.Command,
@@ -37,7 +67,278 @@ var AppEnvCommand = &cobra.Command{
rows = append(rows, []string{k, app.Env[k]})
}
overview := formatter.CreateOverview("ENV OVERVIEW", rows)
overview := formatter.CreateOverview(i18n.G("ENV OVERVIEW"), rows)
fmt.Println(overview)
},
}
var AppEnvPullCommand = &cobra.Command{
// translators: `app pull` command
Use: i18n.G("pull <domain> [flags]"),
Aliases: strings.Split(appEnvPullAliases, ","),
// translators: Short description for `app env pull` command
Short: i18n.G("Pull app environment values from a deployed app"),
Long: i18n.G(`Pull app environment values from a deploymed app.
A convenient command for when you've lost your app environment file or want to
synchronize your local app environment values with what is deployed live.`),
Example: i18n.G(` # pull existing .env file and overwrite local values
abra app env pull 1312.net --force
# pull lost app .env file
abra app env pull my.gitea.net --server 1312.net`),
Args: cobra.MaximumNArgs(2),
ValidArgsFunction: func(
cmd *cobra.Command,
args []string,
toComplete string) ([]string, cobra.ShellCompDirective) {
return autocomplete.AppNameComplete()
},
Run: func(cmd *cobra.Command, args []string) {
appName := args[0]
appEnvPath := path.Join(config.ABRA_DIR, "servers", server, fmt.Sprintf("%s.env", appName))
if _, err := os.Stat(appEnvPath); !os.IsNotExist(err) {
log.Fatal(i18n.G("%s already exists?", appEnvPath))
}
if server == "" {
log.Fatal(i18n.G("unable to determine server of app %s, please pass --server/-s", appName))
}
serverDir := filepath.Join(config.SERVERS_DIR, server)
if _, err := os.Stat(serverDir); os.IsNotExist(err) {
log.Fatal(i18n.G("unknown server %s, run \"abra server add %s\"?", server, server))
}
store := contextPkg.NewDefaultDockerContextStore()
contexts, err := store.Store.List()
if err != nil {
log.Fatal(i18n.G("unable to look up server context for %s: %s", server, err))
}
var contextCreated bool
if server == "default" {
contextCreated = true
}
for _, context := range contexts {
if context.Name == server {
contextCreated = true
}
}
if !contextCreated {
log.Fatal(i18n.G("%s missing context, run \"abra server add %s\"?", server, server))
}
cl, err := client.New(server)
if err != nil {
log.Fatal(err)
}
deployMeta, err := stack.IsDeployed(context.Background(), cl, appPkg.StackName(appName))
if err != nil {
log.Fatal(err)
}
if !deployMeta.IsDeployed {
log.Fatal(i18n.G("%s is not deployed?", appName))
}
filters := filters.NewArgs()
filters.Add("name", fmt.Sprintf("^%s_%s", app.StackName(appName), "app"))
targetContainer, err := containerPkg.GetContainer(context.Background(), cl, filters, internal.NoInput)
if err != nil {
log.Fatal(i18n.G("unable to retrieve container for %s: %s", appName, err))
}
inspectResult, err := cl.ContainerInspect(context.Background(), targetContainer.ID)
if err != nil {
log.Fatal(i18n.G("unable to inspect container for %s: %s", appName, err))
}
deploymentEnv := make(map[string]string)
for _, envVar := range inspectResult.Config.Env {
split := strings.SplitN(envVar, "=", 2)
if len(split) != 2 {
log.Debug(i18n.G("no value attached to %s", envVar))
continue
}
key, val := split[0], split[1]
deploymentEnv[key] = val
}
log.Debug(i18n.G("pulled env values from %s deployment: %s", appName, deploymentEnv))
var (
recipeEnvVar string
recipeKey string
)
if r, ok := deploymentEnv["TYPE"]; ok {
recipeKey = "TYPE"
recipeEnvVar = r
}
if r, ok := deploymentEnv["RECIPE"]; ok {
recipeKey = "RECIPE"
recipeEnvVar = r
}
if recipeEnvVar == "" {
log.Fatal(i18n.G("unable to determine recipe type from %s, env: %v", appName, inspectResult.Config.Env))
}
var recipeName = recipeEnvVar
if strings.Contains(recipeEnvVar, ":") {
split := strings.Split(recipeEnvVar, ":")
recipeName = split[0]
}
recipe := internal.ValidateRecipe(
[]string{recipeName},
cmd.Name(),
)
version := deployMeta.Version
if deployMeta.IsChaos {
version = deployMeta.ChaosVersion
}
if _, err := recipe.EnsureVersion(version); err != nil {
log.Fatal(err)
}
mergedEnv, err := recipe.SampleEnv()
if err != nil {
log.Fatal(err)
}
log.Debug(i18n.G("retrieved env values from .env.sample of %s: %s", recipe.Name, mergedEnv))
for k, v := range deploymentEnv {
mergedEnv[k] = v
}
if !strings.Contains(recipeEnvVar, ":") {
mergedEnv[recipeKey] = fmt.Sprintf("%s:%s", mergedEnv[recipeKey], version)
}
log.Debug(i18n.G("final merged env values for %s are: %s", appName, mergedEnv))
envSample, err := os.ReadFile(recipe.SampleEnvPath)
if err != nil {
log.Fatal(err)
}
err = os.WriteFile(appEnvPath, envSample, 0o664)
if err != nil {
log.Fatal(i18n.G("unable to write new env %s: %s", appEnvPath, err))
}
read, err := os.ReadFile(appEnvPath)
if err != nil {
log.Fatal(i18n.G("unable to read new env %s: %s", appEnvPath, err))
}
sampleEnv, err := recipe.SampleEnv()
if err != nil {
log.Fatal(err)
}
var composeFileUpdated bool
newContents := string(read)
for key, val := range mergedEnv {
if sampleEnv[key] == val {
continue
}
if key == "COMPOSE_FILE" {
composeFileUpdated = true
continue
}
if m, _ := regexp.MatchString(fmt.Sprintf(`#%s=`, key), newContents); m {
log.Debug(i18n.G("uncommenting %s", key))
re := regexp.MustCompile(fmt.Sprintf(`#%s=`, key))
newContents = re.ReplaceAllString(newContents, fmt.Sprintf("%s=", key))
}
if m, _ := regexp.MatchString(fmt.Sprintf(`# %s=`, key), newContents); m {
log.Debug(i18n.G("uncommenting %s", key))
re := regexp.MustCompile(fmt.Sprintf(`# %s=`, key))
newContents = re.ReplaceAllString(newContents, fmt.Sprintf("%s=", key))
}
if m, _ := regexp.MatchString(fmt.Sprintf(`%s=".*"`, key), newContents); m {
log.Debug(i18n.G(`inserting %s="%s" (double quotes)`, key, val))
re := regexp.MustCompile(fmt.Sprintf(`%s=".*"`, key))
newContents = re.ReplaceAllString(newContents, fmt.Sprintf(`%s="%s"`, key, val))
continue
}
if m, _ := regexp.MatchString(fmt.Sprintf(`%s='.*'`, key), newContents); m {
log.Debug(i18n.G(`inserting %s='%s' (single quotes)`, key, val))
re := regexp.MustCompile(fmt.Sprintf(`%s='.*'`, key))
newContents = re.ReplaceAllString(newContents, fmt.Sprintf(`%s='%s'`, key, val))
continue
}
if m, _ := regexp.MatchString(fmt.Sprintf("%s=.*", key), newContents); m {
log.Debug(i18n.G("inserting %s=%s (no quotes)", key, val))
re := regexp.MustCompile(fmt.Sprintf("%s=.*", key))
newContents = re.ReplaceAllString(newContents, fmt.Sprintf("%s=%s", key, val))
}
}
err = os.WriteFile(appEnvPath, []byte(newContents), 0)
if err != nil {
log.Fatal(i18n.G("unable to write new env %s: %s", appEnvPath, err))
}
log.Info(i18n.G("%s successfully created", appEnvPath))
if composeFileUpdated {
log.Warn(i18n.G("manual update required: COMPOSE_FILE=\"%s\"", mergedEnv["COMPOSE_FILE"]))
}
},
}
var AppEnvCommand = &cobra.Command{
// translators: `app env` command group
Use: i18n.G("env [cmd] [args] [flags]"),
Aliases: strings.Split(appEnvAliases, ","),
// translators: Short description for `app env` command group
Short: i18n.G("Manage app environment values"),
}
var (
server string