From 14bdb57ac7f10e435ce5295266871a4fa82b1a4d Mon Sep 17 00:00:00 2001 From: Moritz Date: Thu, 13 Apr 2023 19:33:34 +0200 Subject: [PATCH] feat(deploy): post deploy commands --- cli/app/upgrade.go | 8 ++++++ cli/internal/deploy.go | 60 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index df903d40..4a03a41d 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -205,6 +205,14 @@ recipes. logrus.Fatal(err) } + postDeployCmds, ok := app.Env["POST_UPGRADE_CMDS"] + if ok && !internal.DontWaitConverge { + logrus.Debugf("Run the following post-deploy commands: %s", postDeployCmds) + if err := internal.PostCmds(cl, app, postDeployCmds); err != nil { + logrus.Fatal(err) + } + } + return nil }, BashComplete: autocomplete.AppNameComplete, diff --git a/cli/internal/deploy.go b/cli/internal/deploy.go index 34794606..48383e2d 100644 --- a/cli/internal/deploy.go +++ b/cli/internal/deploy.go @@ -18,6 +18,7 @@ import ( "coopcloud.tech/abra/pkg/runtime" "coopcloud.tech/abra/pkg/upstream/stack" "github.com/AlecAivazis/survey/v2" + dockerClient "github.com/docker/docker/client" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -164,6 +165,65 @@ func DeployAction(c *cli.Context) error { logrus.Fatal(err) } + postDeployCmds, ok := app.Env["POST_DEPLOY_CMDS"] + if ok && !DontWaitConverge { + logrus.Debugf("Run the following post-deploy commands: %s", postDeployCmds) + if err := PostCmds(cl, app, postDeployCmds); err != nil { + logrus.Fatal(err) + } + } + + return nil +} + +func PostCmds(cl *dockerClient.Client, app config.App, commands string) error { + abraSh := path.Join(config.RECIPES_DIR, app.Recipe, "abra.sh") + if _, err := os.Stat(abraSh); err != nil { + if os.IsNotExist(err) { + return fmt.Errorf(fmt.Sprintf("%s does not exist for %s?", abraSh, app.Name)) + } + return err + } + + for _, command := range strings.Split(commands, "|") { + commandParts := strings.Split(command, " ") + if len(commandParts) < 2 { + return fmt.Errorf(fmt.Sprintf("not enough arguments: %s", command)) + } + targetServiceName := commandParts[0] + cmdName := commandParts[1] + parsedCmdArgs := "" + if len(commandParts) > 2 { + parsedCmdArgs = fmt.Sprintf("%s ", strings.Join(commandParts[2:], " ")) + } + logrus.Infof("Running post-command '%s %s' in container %s", cmdName, parsedCmdArgs, targetServiceName) + + if err := EnsureCommand(abraSh, app.Recipe, cmdName); err != nil { + return err + } + + serviceNames, err := config.GetAppServiceNames(app.Name) + if err != nil { + return err + } + + matchingServiceName := false + for _, serviceName := range serviceNames { + if serviceName == targetServiceName { + matchingServiceName = true + } + } + + if !matchingServiceName { + return fmt.Errorf(fmt.Sprintf("no service %s for %s?", targetServiceName, app.Name)) + } + + logrus.Debugf("running command %s %s within the context of %s_%s", cmdName, parsedCmdArgs, app.StackName(), targetServiceName) + + if err := RunCmdRemote(cl, app, abraSh, targetServiceName, cmdName, parsedCmdArgs); err != nil { + return err + } + } return nil }