diff --git a/.drone.yml b/.drone.yml index 88b719de..ea406595 100644 --- a/.drone.yml +++ b/.drone.yml @@ -71,7 +71,6 @@ steps: port: 22 command_timeout: 60m script_stop: true - envs: [ DRONE_SOURCE_BRANCH ] request_pty: true script: - | diff --git a/cli/app/deploy.go b/cli/app/deploy.go index 60cf765d..7a17fb8b 100644 --- a/cli/app/deploy.go +++ b/cli/app/deploy.go @@ -6,6 +6,7 @@ import ( "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" + "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/envfile" "coopcloud.tech/abra/pkg/secret" @@ -54,13 +55,15 @@ EXAMPLE: stackName := app.StackName() specificVersion := c.Args().Get(1) - if specificVersion == "" { - specificVersion = app.Recipe.Version - } if specificVersion != "" && internal.Chaos { log.Fatal("cannot use and --chaos together") } + if specificVersion == "" && app.Recipe.Version != "" { + log.Debugf("retrieved %s as version from env file", app.Recipe.Version) + specificVersion = app.Recipe.Version + } + if err := app.Recipe.Ensure(internal.Chaos, internal.Offline); err != nil { log.Fatal(err) } @@ -146,7 +149,7 @@ EXAMPLE: } } - chaosVersion := "false" + chaosVersion := config.CHAOS_DEFAULT if internal.Chaos { warnMessages = append(warnMessages, "chaos mode engaged") @@ -245,12 +248,15 @@ EXAMPLE: } } - if app.Recipe.Version != "" && specificVersion != "" && specificVersion != app.Recipe.Version { - err := app.WriteRecipeVersion(specificVersion) - if err != nil { - log.Fatalf("writing new recipe version in env file: %s", err) - } + app.Recipe.Version = version + if chaosVersion != config.CHAOS_DEFAULT { + app.Recipe.Version = chaosVersion } + log.Debugf("choosing %s as version to save to env file", app.Recipe.Version) + if err := app.WriteRecipeVersion(app.Recipe.Version); err != nil { + log.Fatalf("writing new recipe version in env file: %s", err) + } + return nil }, } diff --git a/cli/app/new.go b/cli/app/new.go index be77f168..bc2614c9 100644 --- a/cli/app/new.go +++ b/cli/app/new.go @@ -4,6 +4,7 @@ import ( "fmt" "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" @@ -28,6 +29,8 @@ deploy " to do so. You can see what recipes are available (i.e. values for the argument) by running "abra recipe ls". +Recipe commit hashes are supported values for "[]". + Passing the "--secrets/-S" flag will automatically generate secrets for your app and store them encrypted at rest on the chosen target server. These generated secrets are only visible at generation time, so please take care to @@ -66,6 +69,7 @@ var appNewCommand = cli.Command{ Action: func(c *cli.Context) error { recipe := internal.ValidateRecipe(c) + var version string if !internal.Chaos { if err := recipe.EnsureIsClean(); err != nil { log.Fatal(err) @@ -75,16 +79,13 @@ var appNewCommand = cli.Command{ log.Fatal(err) } } - if c.Args().Get(1) == "" { - var version string + if c.Args().Get(1) == "" { recipeVersions, err := recipe.GetRecipeVersions() if err != nil { log.Fatal(err) } - // NOTE(d1): determine whether recipe versions exist or not and check - // out the latest version or current HEAD if len(recipeVersions) > 0 { latest := recipeVersions[len(recipeVersions)-1] for tag := range latest { @@ -100,7 +101,8 @@ var appNewCommand = cli.Command{ } } } else { - if _, err := recipe.EnsureVersion(c.Args().Get(1)); err != nil { + version = c.Args().Get(1) + if _, err := recipe.EnsureVersion(version); err != nil { log.Fatal(err) } } @@ -180,10 +182,10 @@ var appNewCommand = cli.Command{ log.Fatal(err) } - headers := []string{"SERVER", "RECIPE", "DOMAIN"} + headers := []string{"SERVER", "DOMAIN", "RECIPE", "VERSION"} table.Headers(headers...) - table.Row(internal.NewAppServer, recipe.Name, internal.Domain) + table.Row(internal.NewAppServer, internal.Domain, recipe.Name, version) log.Infof("new app '%s' created 🌞", recipe.Name) @@ -211,6 +213,16 @@ var appNewCommand = cli.Command{ ) } + app, err := app.Get(internal.Domain) + if err != nil { + log.Fatal(err) + } + + log.Debugf("choosing %s as version to save to env file", version) + if err := app.WriteRecipeVersion(version); err != nil { + log.Fatalf("writing new recipe version in env file: %s", err) + } + return nil }, } diff --git a/cli/app/ps.go b/cli/app/ps.go index f61e5e88..b094eafd 100644 --- a/cli/app/ps.go +++ b/cli/app/ps.go @@ -9,6 +9,7 @@ import ( appPkg "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" + "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/formatter" "coopcloud.tech/abra/pkg/log" abraService "coopcloud.tech/abra/pkg/service" @@ -52,7 +53,7 @@ var appPsCommand = cli.Command{ log.Fatalf("%s is not deployed?", app.Name) } - chaosVersion := "false" + chaosVersion := config.CHAOS_DEFAULT statuses, err := appPkg.GetAppStatuses([]appPkg.App{app}, true) if statusMeta, ok := statuses[app.StackName()]; ok { isChaos, exists := statusMeta["chaos"] diff --git a/cli/app/rollback.go b/cli/app/rollback.go index b44a08a0..5e41f9c9 100644 --- a/cli/app/rollback.go +++ b/cli/app/rollback.go @@ -6,6 +6,7 @@ import ( appPkg "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/autocomplete" + "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/envfile" "coopcloud.tech/abra/pkg/lint" stack "coopcloud.tech/abra/pkg/upstream/stack" @@ -197,7 +198,7 @@ EXAMPLE: appPkg.SetChaosVersionLabel(compose, stackName, chosenDowngrade) appPkg.SetUpdateLabel(compose, stackName, app.Env) - chaosVersion := "false" + chaosVersion := config.CHAOS_DEFAULT if deployMeta.IsChaos { chaosVersion = deployMeta.ChaosVersion } @@ -218,11 +219,10 @@ EXAMPLE: log.Fatal(err) } - if app.Recipe.Version != "" { - err := app.WriteRecipeVersion(chosenDowngrade) - if err != nil { - log.Fatalf("writing new recipe version in env file: %s", err) - } + app.Recipe.Version = chosenDowngrade + log.Debugf("choosing %s as version to save to env file", app.Recipe.Version) + if err := app.WriteRecipeVersion(app.Recipe.Version); err != nil { + log.Fatalf("writing new recipe version in env file: %s", err) } return nil diff --git a/cli/app/undeploy.go b/cli/app/undeploy.go index 3adffd06..43ea2415 100644 --- a/cli/app/undeploy.go +++ b/cli/app/undeploy.go @@ -8,6 +8,7 @@ import ( appPkg "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" + "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/formatter" "coopcloud.tech/abra/pkg/log" stack "coopcloud.tech/abra/pkg/upstream/stack" @@ -102,7 +103,7 @@ Passing "-p/--prune" does not remove those volumes.`, log.Fatalf("%s is not deployed?", app.Name) } - chaosVersion := "false" + chaosVersion := config.CHAOS_DEFAULT if deployMeta.IsChaos { chaosVersion = deployMeta.ChaosVersion } diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index 38849856..2e4ff78f 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -8,6 +8,7 @@ import ( appPkg "coopcloud.tech/abra/pkg/app" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" + "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/envfile" "coopcloud.tech/abra/pkg/lint" "coopcloud.tech/abra/pkg/log" @@ -244,7 +245,7 @@ EXAMPLE: return nil } - chaosVersion := "false" + chaosVersion := config.CHAOS_DEFAULT if deployMeta.IsChaos { chaosVersion = deployMeta.ChaosVersion } @@ -278,11 +279,10 @@ EXAMPLE: } } - if app.Recipe.Version != "" { - err := app.WriteRecipeVersion(chosenUpgrade) - if err != nil { - log.Fatalf("writing new recipe version in env file: %s", err) - } + app.Recipe.Version = chosenUpgrade + log.Debugf("choosing %s as version to save to env file", app.Recipe.Version) + if err := app.WriteRecipeVersion(app.Recipe.Version); err != nil { + log.Fatalf("writing new recipe version in env file: %s", err) } return nil diff --git a/cli/recipe/version.go b/cli/recipe/version.go index c0f64580..0f59d7fd 100644 --- a/cli/recipe/version.go +++ b/cli/recipe/version.go @@ -85,6 +85,7 @@ var recipeVersionCommand = cli.Command{ if !internal.MachineReadable { fmt.Println(table) log.Infof("VERSION: %s", version) + fmt.Println() } } } diff --git a/pkg/app/app.go b/pkg/app/app.go index 95b6d191..1da87c66 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -584,6 +584,12 @@ func (a App) WriteRecipeVersion(version string) error { lines = append(lines, line) continue } + + if strings.HasPrefix(line, "#") { + lines = append(lines, line) + continue + } + splitted := strings.Split(line, ":") line = fmt.Sprintf("%s:%s", splitted[0], version) lines = append(lines, line) diff --git a/pkg/config/abra.go b/pkg/config/abra.go index 2f8d41dc..1a7c6e03 100644 --- a/pkg/config/abra.go +++ b/pkg/config/abra.go @@ -107,4 +107,5 @@ var ( REPOS_BASE_URL = "https://git.coopcloud.tech/coop-cloud" CATALOGUE_JSON_REPO_NAME = "recipes-catalogue-json" SSH_URL_TEMPLATE = "ssh://git@git.coopcloud.tech:2222/coop-cloud/%s.git" + CHAOS_DEFAULT = "false" ) diff --git a/scripts/tests/run-ci-int b/scripts/tests/run-ci-int index e1561c73..4964e439 100755 --- a/scripts/tests/run-ci-int +++ b/scripts/tests/run-ci-int @@ -7,7 +7,6 @@ # destroys resources on the swarm server you run it against. This is for # setup/teardown for the integration test suite. # -# export DRONE_SOURCE_BRANCH= # ./run-ci-int set -eu @@ -45,17 +44,7 @@ echo "========================================================================" rm -rf abra git clone ssh://git@git.coopcloud.tech:2222/coop-cloud/abra.git cd abra -echo "========================================================================" - -echo "========================================================================" -echo "FETCHING ABRA BRANCH FOR TESTING" -echo "========================================================================" -if [ -z "$DRONE_SOURCE_BRANCH" ]; then - DRONE_SOURCE_BRANCH="main" -fi - -git fetch --all -git checkout $DRONE_SOURCE_BRANCH +git checkout main echo "========================================================================" echo "========================================================================" diff --git a/tests/integration/app_deploy.bats b/tests/integration/app_deploy.bats index 1d341c04..8ba05f5d 100644 --- a/tests/integration/app_deploy.bats +++ b/tests/integration/app_deploy.bats @@ -355,34 +355,3 @@ teardown(){ run $ABRA app secret rm "$TEST_APP_DOMAIN" --all --chaos assert_success } - -# bats test_tags=slow -@test "deploy chaos commit" { - tagHash=$(_get_tag_hash "0.1.0+1.20.0") - - run $ABRA app deploy "$TEST_APP_DOMAIN" "$tagHash" --no-input --no-converge-checks - assert_success - assert_output --partial 'chaos mode' -} - -# bats test_tags=slow -@test "deploy remote recipe" { - run sed -i 's/TYPE=abra-test-recipe/RECIPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe/g' \ - "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" - assert_success - - run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks - assert_success - assert_output --partial "git.coopcloud.tech/coop-cloud/abra-test-recipe" -} - -# bats test_tags=slow -@test "deploy remote recipe with version" { - run sed -i 's/TYPE=abra-test-recipe/RECIPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe:0.2.0+1.21.0/g' \ - "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" - assert_success - - run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks - assert_success - assert_output --partial '0.2.0+1.21.0' -} diff --git a/tests/integration/app_deploy_env_version.bats b/tests/integration/app_deploy_env_version.bats new file mode 100644 index 00000000..63d4d775 --- /dev/null +++ b/tests/integration/app_deploy_env_version.bats @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +setup_file(){ + load "$PWD/tests/integration/helpers/common" + _common_setup + _add_server + _new_app +} + +teardown_file(){ + _rm_app + _rm_server + _reset_recipe +} + +setup(){ + load "$PWD/tests/integration/helpers/common" + _common_setup + _ensure_catalogue +} + +teardown(){ + _reset_recipe + _undeploy_app + _reset_app +} + +# bats test_tags=slow +@test "deploy version written to env" { + run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input --no-converge-checks + assert_success + + run grep -q "TYPE=$TEST_RECIPE:0.1.0+1.20.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +} + +# bats test_tags=slow +@test "redeploy overwrites env version" { + run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input --no-converge-checks + assert_success + + run grep -q "TYPE=$TEST_RECIPE:0.1.0+1.20.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app deploy "$TEST_APP_DOMAIN" "0.2.0+1.21.0" \ + --no-input --no-converge-checks --force + assert_success + + run grep -q "TYPE=$TEST_RECIPE:0.2.0+1.21.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +} + +# bats test_tags=slow +@test "chaos commit written to env" { + run $ABRA app deploy "$TEST_APP_DOMAIN" "1e83340e" --no-input --no-converge-checks + assert_success + + run grep -q "TYPE=$TEST_RECIPE:1e83340e" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +} + +# bats test_tags=slow +@test "redeploy reads from env version" { + run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input --no-converge-checks + assert_success + + run grep -q "TYPE=$TEST_RECIPE:0.1.0+1.20.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + _undeploy_app + + run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks + assert_success + assert_output --partial '0.1.0+1.20.0' +} diff --git a/tests/integration/app_deploy_remote_recipes.bats b/tests/integration/app_deploy_remote_recipes.bats new file mode 100644 index 00000000..56b6ce56 --- /dev/null +++ b/tests/integration/app_deploy_remote_recipes.bats @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +setup_file(){ + load "$PWD/tests/integration/helpers/common" + _common_setup + _add_server + _new_app +} + +teardown_file(){ + _rm_app + _rm_server + _reset_recipe +} + +setup(){ + load "$PWD/tests/integration/helpers/common" + _common_setup + _ensure_catalogue +} + +teardown(){ + _reset_recipe + _undeploy_app + _reset_app +} + +# bats test_tags=slow +@test "deploy remote recipe" { + run sed -i 's/TYPE=abra-test-recipe/TYPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe/g' \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks + assert_success + assert_output --partial "git.coopcloud.tech/coop-cloud/abra-test-recipe" +} + +# bats test_tags=slow +@test "deploy remote recipe with version" { + run sed -i 's/TYPE=abra-test-recipe/TYPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe:0.2.0+1.21.0/g' \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks + assert_success + assert_output --partial '0.2.0+1.21.0' +} + +# bats test_tags=slow +@test "deploy remote recipe with chaos commit" { + run sed -i 's/TYPE=abra-test-recipe/TYPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe:1e83340e/g' \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks + assert_success + assert_output --partial '1e83340e' +} + +# bats test_tags=slow +@test "remote recipe version written to env" { + run sed -i 's/TYPE=abra-test-recipe/TYPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe/g' \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks + assert_success + + latestRelease=$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" tag -l | tail -n 1) + run grep -q "TYPE=git.coopcloud.tech\/coop-cloud\/abra-test-recipe:$latestRelease" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +} diff --git a/tests/integration/app_new.bats b/tests/integration/app_new.bats index 9646b57a..d88b7404 100644 --- a/tests/integration/app_new.bats +++ b/tests/integration/app_new.bats @@ -39,17 +39,42 @@ teardown(){ _get_head_hash _get_current_hash assert_equal "$headHash" "$currentHash" + + latestRelease=$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" tag -l | tail -n 1) + run grep -q "TYPE=$TEST_RECIPE:$latestRelease" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success } @test "create new app with version" { - run $ABRA app new "$TEST_RECIPE" 0.1.1+1.20.2 \ + run $ABRA app new "$TEST_RECIPE" 0.3.0+1.21.0 \ --no-input \ --server "$TEST_SERVER" \ --domain "$TEST_APP_DOMAIN" assert_success assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" - assert_equal $(_get_tag_hash 0.1.1+1.20.2) $(_get_current_hash) + assert_equal $(_get_tag_hash 0.3.0+1.21.0) $(_get_current_hash) + + run grep -q "TYPE=$TEST_RECIPE:0.3.0+1.21.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +} + +@test "create new app with chaos commit" { + run $ABRA app new "$TEST_RECIPE" 1e83340e \ + --no-input \ + --server "$TEST_SERVER" \ + --domain "$TEST_APP_DOMAIN" + assert_success + assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + + currentHash=$(_get_current_hash) + assert_equal 1e83340e ${currentHash:0:8} + + run grep -q "TYPE=$TEST_RECIPE:1e83340e" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success } @test "does not overwrite existing env files" { diff --git a/tests/integration/app_rollback_env_version.bats b/tests/integration/app_rollback_env_version.bats new file mode 100644 index 00000000..a06d22a4 --- /dev/null +++ b/tests/integration/app_rollback_env_version.bats @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +setup_file(){ + load "$PWD/tests/integration/helpers/common" + _common_setup + _add_server + _new_app +} + +teardown_file(){ + _rm_app + _rm_server + _reset_recipe +} + +setup(){ + load "$PWD/tests/integration/helpers/common" + _common_setup +} + +teardown(){ + _undeploy_app + _reset_recipe +} + +@test "rollback writes version to env file" { + run $ABRA app deploy "$TEST_APP_DOMAIN" "0.2.0+1.21.0" --no-input --no-converge-checks + assert_success + assert_output --partial "0.2.0+1.21.0" + + run grep -q "TYPE=abra-test-recipe:0.2.0+1.21.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app rollback "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input --no-converge-checks + assert_success + assert_output --partial "0.1.0+1.20.0" + + run grep -q "TYPE=abra-test-recipe:0.1.0+1.20.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +} diff --git a/tests/integration/app_upgrade_env_version.bats b/tests/integration/app_upgrade_env_version.bats new file mode 100644 index 00000000..b4fa1c46 --- /dev/null +++ b/tests/integration/app_upgrade_env_version.bats @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +setup_file(){ + load "$PWD/tests/integration/helpers/common" + _common_setup + _add_server + _new_app +} + +teardown_file(){ + _rm_app + _rm_server +} + +setup(){ + load "$PWD/tests/integration/helpers/common" + _common_setup +} + +teardown(){ + _undeploy_app + _reset_recipe +} + +@test "upgrade writes version to env file" { + run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input --no-converge-checks + assert_success + assert_output --partial '0.1.0+1.20.0' + + run grep -q "TYPE=abra-test-recipe:0.1.0+1.20.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success + + run $ABRA app upgrade "$TEST_APP_DOMAIN" "0.2.0+1.21.0" --no-input --no-converge-checks + assert_success + assert_output --partial "0.2.0+1.21.0" + + run grep -q "TYPE=abra-test-recipe:0.2.0+1.21.0" \ + "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" + assert_success +}