forked from toolshed/abra
		
	Compare commits
	
		
			12 Commits
		
	
	
		
			improve-mo
			...
			fix-new-do
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4b688825e0 | |||
| b0cf2a1f8e | |||
| 6b7020d457 | |||
| efdac610bd | |||
| cd6021f116 | |||
| ee8de8ef5c | |||
| 
						
						
							
						
						e5a653c002
	
				 | 
					
					
						|||
| 
						
						
							
						
						2cca04de90
	
				 | 
					
					
						|||
| f2f79e2df8 | |||
| 
						
						
							
						
						dd83741a9f
	
				 | 
					
					
						|||
| 
						
						
							
						
						dc2cd85d91
	
				 | 
					
					
						|||
| 
						
						
							
						
						96e59cf196
	
				 | 
					
					
						
@ -152,7 +152,6 @@ checkout as-is. Recipe commit hashes are also supported as values for
 | 
			
		||||
			log.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		appPkg.ExposeAllEnv(stackName, compose, app.Env)
 | 
			
		||||
		appPkg.SetRecipeLabel(compose, stackName, app.Recipe.Name)
 | 
			
		||||
		appPkg.SetChaosLabel(compose, stackName, internal.Chaos)
 | 
			
		||||
		if internal.Chaos {
 | 
			
		||||
@ -171,6 +170,9 @@ checkout as-is. Recipe commit hashes are also supported as values for
 | 
			
		||||
		}
 | 
			
		||||
		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 {
 | 
			
		||||
			log.Fatal(err)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										311
									
								
								cli/app/env.go
									
									
									
									
									
								
							
							
						
						
									
										311
									
								
								cli/app/env.go
									
									
									
									
									
								
							@ -1,28 +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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// translators: `abra app env` aliases. use a comma separated list of aliases with
 | 
			
		||||
// no spaces in between
 | 
			
		||||
// translators: `abra app env` aliases. use a comma separated list of aliases
 | 
			
		||||
// with no spaces in between
 | 
			
		||||
var appEnvAliases = i18n.G("e")
 | 
			
		||||
 | 
			
		||||
var AppEnvCommand = &cobra.Command{
 | 
			
		||||
	// translators: `app env` command
 | 
			
		||||
	Use:     i18n.G("env <domain> [flags]"),
 | 
			
		||||
	Aliases: strings.Split(appEnvAliases, ","),
 | 
			
		||||
	// translators: Short description for `app env` command
 | 
			
		||||
	Short:   i18n.G("Show app .env values"),
 | 
			
		||||
	Example: i18n.G("  abra app env 1312.net"),
 | 
			
		||||
// 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,
 | 
			
		||||
@ -49,3 +71,274 @@ var AppEnvCommand = &cobra.Command{
 | 
			
		||||
		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
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	AppEnvPullCommand.Flags().BoolVarP(
 | 
			
		||||
		&internal.Force,
 | 
			
		||||
		i18n.G("force"),
 | 
			
		||||
		i18n.G("f"),
 | 
			
		||||
		false,
 | 
			
		||||
		i18n.G("perform action without further prompt"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	AppEnvPullCommand.Flags().StringVarP(
 | 
			
		||||
		&server,
 | 
			
		||||
		i18n.G("server"),
 | 
			
		||||
		i18n.G("s"),
 | 
			
		||||
		"",
 | 
			
		||||
		i18n.G("server associated with deployed app"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	AppEnvPullCommand.RegisterFlagCompletionFunc(
 | 
			
		||||
		i18n.G("server"),
 | 
			
		||||
		func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
 | 
			
		||||
			return autocomplete.ServerNameComplete()
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@ package app
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	appPkg "coopcloud.tech/abra/pkg/app"
 | 
			
		||||
@ -177,7 +178,9 @@ beforehand. See "abra app backup" for more.`),
 | 
			
		||||
			log.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		appPkg.ExposeAllEnv(stackName, compose, app.Env)
 | 
			
		||||
		newRecipeWithDowngradeVersion := fmt.Sprintf("%s:%s", app.Recipe.Name, chosenDowngrade)
 | 
			
		||||
		appPkg.ExposeAllEnv(stackName, compose, app.Env, newRecipeWithDowngradeVersion)
 | 
			
		||||
 | 
			
		||||
		appPkg.SetRecipeLabel(compose, stackName, app.Recipe.Name)
 | 
			
		||||
		appPkg.SetChaosLabel(compose, stackName, internal.Chaos)
 | 
			
		||||
		if internal.Chaos {
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,7 @@ var AppUndeployCommand = &cobra.Command{
 | 
			
		||||
	Use: i18n.G("undeploy <domain> [flags]"),
 | 
			
		||||
	// translators: Short description for `app undeploy` command
 | 
			
		||||
	Aliases: strings.Split(appUndeployAliases, ","),
 | 
			
		||||
	Short:   i18n.G("Undeploy a deployed app"),
 | 
			
		||||
	Long: i18n.G(`This does not destroy any application data.
 | 
			
		||||
 | 
			
		||||
However, you should remain vigilant, as your swarm installation will consider
 | 
			
		||||
 | 
			
		||||
@ -190,7 +190,9 @@ beforehand. See "abra app backup" for more.`),
 | 
			
		||||
			log.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		appPkg.ExposeAllEnv(stackName, compose, app.Env)
 | 
			
		||||
		newRecipeWithUpgradeVersion := fmt.Sprintf("%s:%s", app.Recipe.Name, chosenUpgrade)
 | 
			
		||||
		appPkg.ExposeAllEnv(stackName, compose, app.Env, newRecipeWithUpgradeVersion)
 | 
			
		||||
 | 
			
		||||
		appPkg.SetRecipeLabel(compose, stackName, app.Recipe.Name)
 | 
			
		||||
		appPkg.SetChaosLabel(compose, stackName, internal.Chaos)
 | 
			
		||||
		if internal.Chaos {
 | 
			
		||||
 | 
			
		||||
@ -283,6 +283,11 @@ Config:
 | 
			
		||||
		app.AppBackupSnapshotsCommand,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	app.AppEnvCommand.AddCommand(
 | 
			
		||||
		app.AppEnvListCommand,
 | 
			
		||||
		app.AppEnvPullCommand,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	app.AppCommand.AddCommand(
 | 
			
		||||
		app.AppBackupCommand,
 | 
			
		||||
		app.AppCheckCommand,
 | 
			
		||||
 | 
			
		||||
@ -502,7 +502,11 @@ func GetAppComposeConfig(recipe string, opts stack.Deploy, appEnv envfile.AppEnv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExposeAllEnv exposes all env variables to the app container
 | 
			
		||||
func ExposeAllEnv(stackName string, compose *composetypes.Config, appEnv envfile.AppEnv) {
 | 
			
		||||
func ExposeAllEnv(
 | 
			
		||||
	stackName string,
 | 
			
		||||
	compose *composetypes.Config,
 | 
			
		||||
	appEnv envfile.AppEnv,
 | 
			
		||||
	toDeployVersion string) {
 | 
			
		||||
	for _, service := range compose.Services {
 | 
			
		||||
		if service.Name == "app" {
 | 
			
		||||
			log.Debug(i18n.G("adding env vars to %s service config", stackName))
 | 
			
		||||
@ -510,6 +514,11 @@ func ExposeAllEnv(stackName string, compose *composetypes.Config, appEnv envfile
 | 
			
		||||
				_, exists := service.Environment[k]
 | 
			
		||||
				if !exists {
 | 
			
		||||
					value := v
 | 
			
		||||
					if k == "TYPE" || k == "RECIPE" {
 | 
			
		||||
						// NOTE(d1): don't use the wrong version from the app env
 | 
			
		||||
						//           since we are deploying a new version
 | 
			
		||||
						value = toDeployVersion
 | 
			
		||||
					}
 | 
			
		||||
					service.Environment[k] = &value
 | 
			
		||||
					log.Debug(i18n.G("%s: %s: %s", stackName, k, value))
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
@ -44,11 +44,21 @@ func New(serverName string, opts ...Opt) (*client.Client, error) {
 | 
			
		||||
	ctx, err := GetContext(serverName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		serverDir := path.Join(config.SERVERS_DIR, serverName)
 | 
			
		||||
		if _, err := os.Stat(serverDir); err == nil {
 | 
			
		||||
			return nil, errors.New(i18n.G("server missing context, run \"abra server add %s\"?", serverName))
 | 
			
		||||
		if _, err := os.Stat(serverDir); err != nil {
 | 
			
		||||
			return nil, errors.New(i18n.G("server missing, run \"abra server add %s\"?", serverName))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nil, errors.New(i18n.G("unknown server, run \"abra server add %s\"?", serverName))
 | 
			
		||||
		// When the docker context does not exist but the server folder is
 | 
			
		||||
		// there, let's create a new docker context.
 | 
			
		||||
		err = CreateContext(serverName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.New(i18n.G("server missing context, context creation failed: %s", err))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx, err = GetContext(serverName)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.New(i18n.G("server missing context, run \"abra server add %s\"?", serverName))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctxEndpoint, err := contextPkg.GetContextEndpoint(ctx)
 | 
			
		||||
 | 
			
		||||
@ -7,13 +7,13 @@
 | 
			
		||||
msgid   ""
 | 
			
		||||
msgstr  "Project-Id-Version: \n"
 | 
			
		||||
        "Report-Msgid-Bugs-To: EMAIL\n"
 | 
			
		||||
        "POT-Creation-Date: 2025-10-31 19:25+0100\n"
 | 
			
		||||
        "POT-Creation-Date: 2025-11-02 11:41+0100\n"
 | 
			
		||||
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
			
		||||
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
        "Language-Team: LANGUAGE <LL@li.org>\n"
 | 
			
		||||
        "Language: \n"
 | 
			
		||||
        "MIME-Version: 1.0\n"
 | 
			
		||||
        "Content-Type: text/plain; charset=CHARSET\n"
 | 
			
		||||
        "Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
        "Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/cp.go:38
 | 
			
		||||
@ -92,6 +92,14 @@ msgid   "  # pass <cmd> args/flags without \"--\"\n"
 | 
			
		||||
        "  abra app cmd 1312.net my_cmd --local"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:85
 | 
			
		||||
msgid   "  # pull existing .env file and overwrite local values\n"
 | 
			
		||||
        "  abra app env pull 1312.net --force\n"
 | 
			
		||||
        "\n"
 | 
			
		||||
        "  # pull lost app .env file\n"
 | 
			
		||||
        "  abra app env pull my.gitea.net --server 1312.net"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/restart.go:36
 | 
			
		||||
msgid   "  # restart a single app service\n"
 | 
			
		||||
        "  abra app restart 1312.net app\n"
 | 
			
		||||
@ -125,8 +133,8 @@ msgid   "  # standard deployment\n"
 | 
			
		||||
        "  abra app deploy 1312.net 886db76d"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:25
 | 
			
		||||
msgid   "  abra app env 1312.net"
 | 
			
		||||
#: ./cli/app/env.go:47
 | 
			
		||||
msgid   "  abra app env list 1312.net"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/remove.go:45
 | 
			
		||||
@ -149,7 +157,7 @@ msgstr  ""
 | 
			
		||||
msgid   "  abra upgrade --rc"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:48
 | 
			
		||||
#: ./cli/app/rollback.go:49
 | 
			
		||||
msgid   " # standard rollback\n"
 | 
			
		||||
        "  abra app rollback 1312.net\n"
 | 
			
		||||
        "\n"
 | 
			
		||||
@ -201,7 +209,7 @@ msgstr  ""
 | 
			
		||||
msgid   "%s already exists"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:380
 | 
			
		||||
#: ./cli/app/env.go:102 ./pkg/app/app.go:380
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s already exists?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -331,17 +339,17 @@ msgstr  ""
 | 
			
		||||
msgid   "%s is missing the TYPE env var?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:305 ./cli/app/rollback.go:309
 | 
			
		||||
#: ./cli/app/rollback.go:308 ./cli/app/rollback.go:312
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s is not a downgrade for %s?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:426 ./cli/app/upgrade.go:430
 | 
			
		||||
#: ./cli/app/upgrade.go:428 ./cli/app/upgrade.go:432
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s is not an upgrade for %s?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/logs.go:65 ./cli/app/ps.go:62 ./cli/app/restart.go:100 ./cli/app/services.go:55 ./cli/app/undeploy.go:65 ./cli/app/upgrade.go:447
 | 
			
		||||
#: ./cli/app/env.go:146 ./cli/app/logs.go:65 ./cli/app/ps.go:62 ./cli/app/restart.go:100 ./cli/app/services.go:55 ./cli/app/undeploy.go:66 ./cli/app/upgrade.go:449
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s is not deployed?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -356,7 +364,12 @@ msgstr  ""
 | 
			
		||||
msgid   "%s is still deployed. Run \"abra app undeploy %s\""
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:182 ./cli/app/upgrade.go:208
 | 
			
		||||
#: ./cli/app/env.go:132
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s missing context, run \"abra server add %s\"?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:184 ./cli/app/upgrade.go:210
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s missing from %s.env"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -421,6 +434,11 @@ msgstr  ""
 | 
			
		||||
msgid   "%s successfully added"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:301
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s successfully created"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/secret.go:254
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s successfully stored on server"
 | 
			
		||||
@ -466,7 +484,7 @@ msgstr  ""
 | 
			
		||||
msgid   "%s: %s → %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:514
 | 
			
		||||
#: ./pkg/app/app.go:523
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "%s: %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -531,12 +549,12 @@ msgstr  ""
 | 
			
		||||
msgid   "%s: waiting %d seconds before next retry"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:421
 | 
			
		||||
#: ./cli/app/upgrade.go:423
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "'%s' is not a known version"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:300 ./cli/app/upgrade.go:416
 | 
			
		||||
#: ./cli/app/rollback.go:303 ./cli/app/upgrade.go:418
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "'%s' is not a known version for %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -603,7 +621,7 @@ msgstr  ""
 | 
			
		||||
msgid   "Both local recipe and live deployment labels are shown."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/backup.go:319 ./cli/app/backup.go:335 ./cli/app/check.go:95 ./cli/app/cmd.go:285 ./cli/app/cp.go:385 ./cli/app/deploy.go:393 ./cli/app/labels.go:143 ./cli/app/new.go:397 ./cli/app/ps.go:213 ./cli/app/restart.go:162 ./cli/app/restore.go:138 ./cli/app/secret.go:569 ./cli/app/secret.go:609 ./cli/app/secret.go:633 ./cli/app/secret.go:641 ./cli/catalogue/catalogue.go:318 ./cli/recipe/lint.go:137
 | 
			
		||||
#: ./cli/app/backup.go:319 ./cli/app/backup.go:335 ./cli/app/check.go:95 ./cli/app/cmd.go:285 ./cli/app/cp.go:385 ./cli/app/deploy.go:395 ./cli/app/labels.go:143 ./cli/app/new.go:397 ./cli/app/ps.go:213 ./cli/app/restart.go:162 ./cli/app/restore.go:138 ./cli/app/secret.go:569 ./cli/app/secret.go:609 ./cli/app/secret.go:633 ./cli/app/secret.go:641 ./cli/catalogue/catalogue.go:318 ./cli/recipe/lint.go:137
 | 
			
		||||
msgid   "C"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -744,7 +762,7 @@ msgid   "Creates a new app from a default recipe.\n"
 | 
			
		||||
        "on your $PATH."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:409 ./cli/app/new.go:373 ./cli/app/rollback.go:357 ./cli/app/upgrade.go:467
 | 
			
		||||
#: ./cli/app/deploy.go:411 ./cli/app/new.go:373 ./cli/app/rollback.go:360 ./cli/app/upgrade.go:469
 | 
			
		||||
msgid   "D"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -794,7 +812,7 @@ msgid   "Downloads a backup.tar.gz to the current working directory.\n"
 | 
			
		||||
        "\"backupbot.backup.path\" labels."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:48
 | 
			
		||||
#: ./cli/app/env.go:70
 | 
			
		||||
msgid   "ENV OVERVIEW"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -939,6 +957,11 @@ msgstr  ""
 | 
			
		||||
msgid   "Lint a recipe"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app env list` command
 | 
			
		||||
#: ./cli/app/env.go:46
 | 
			
		||||
msgid   "List all app environment values"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app cmd list` command
 | 
			
		||||
#: ./cli/app/cmd.go:210
 | 
			
		||||
msgid   "List all available commands"
 | 
			
		||||
@ -993,6 +1016,11 @@ msgstr  ""
 | 
			
		||||
msgid   "Manage app backups"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app env` command group
 | 
			
		||||
#: ./cli/app/env.go:314
 | 
			
		||||
msgid   "Manage app environment values"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app secret` command group
 | 
			
		||||
#: ./cli/app/secret.go:537
 | 
			
		||||
msgid   "Manage app secrets"
 | 
			
		||||
@ -1099,6 +1127,18 @@ msgid   "Prunes unused containers, networks, and dangling images.\n"
 | 
			
		||||
        "app. This can result in unwanted data loss if not used carefully."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app env pull` command
 | 
			
		||||
#: ./cli/app/env.go:80
 | 
			
		||||
msgid   "Pull app environment values from a deployed app"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:81
 | 
			
		||||
msgid   "Pull app environment values from a deploymed app.\n"
 | 
			
		||||
        "\n"
 | 
			
		||||
        "A convenient command for when you've lost your app environment file or want to\n"
 | 
			
		||||
        "synchronize your local app environment values with what is deployed live."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/lint/recipe.go:110
 | 
			
		||||
msgid   "README.md metadata filled in"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -1192,7 +1232,7 @@ msgid   "Restore a snapshot"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app rollback` command
 | 
			
		||||
#: ./cli/app/rollback.go:33
 | 
			
		||||
#: ./cli/app/rollback.go:34
 | 
			
		||||
msgid   "Roll an app back to a previous version"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -1268,11 +1308,6 @@ msgstr  ""
 | 
			
		||||
msgid   "Select recipe"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app env` command
 | 
			
		||||
#: ./cli/app/env.go:24
 | 
			
		||||
msgid   "Show app .env values"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: Short description for `app labels` command
 | 
			
		||||
#: ./cli/app/labels.go:32
 | 
			
		||||
msgid   "Show deployment labels"
 | 
			
		||||
@ -1370,7 +1405,7 @@ msgid   "This command restarts services within a deployed app.\n"
 | 
			
		||||
        "Pass \"--all-services/-a\" to restart all services."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:34
 | 
			
		||||
#: ./cli/app/rollback.go:35
 | 
			
		||||
msgid   "This command rolls an app back to a previous version.\n"
 | 
			
		||||
        "\n"
 | 
			
		||||
        "Unlike \"abra app deploy\", chaos operations are not supported here. Only recipe\n"
 | 
			
		||||
@ -1387,7 +1422,7 @@ msgid   "This command rolls an app back to a previous version.\n"
 | 
			
		||||
        "beforehand. See \"abra app backup\" for more."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:31
 | 
			
		||||
#: ./cli/app/undeploy.go:32
 | 
			
		||||
msgid   "This does not destroy any application data.\n"
 | 
			
		||||
        "\n"
 | 
			
		||||
        "However, you should remain vigilant, as your swarm installation will consider\n"
 | 
			
		||||
@ -1434,7 +1469,7 @@ msgid   "To load completions:\n"
 | 
			
		||||
        "  # and source this file from your PowerShell profile."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:433 ./cli/app/rollback.go:373 ./cli/app/upgrade.go:491
 | 
			
		||||
#: ./cli/app/deploy.go:435 ./cli/app/rollback.go:376 ./cli/app/upgrade.go:493
 | 
			
		||||
msgid   "U"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -1450,6 +1485,10 @@ msgstr  ""
 | 
			
		||||
msgid   "UPGRADE"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:31
 | 
			
		||||
msgid   "Undeploy a deployed app"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/recipe/upgrade.go:50
 | 
			
		||||
msgid   "Upgrade a given <recipe> configuration.\n"
 | 
			
		||||
        "\n"
 | 
			
		||||
@ -1721,7 +1760,7 @@ msgstr  ""
 | 
			
		||||
msgid   "add release note? (leave empty to skip)"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:508
 | 
			
		||||
#: ./pkg/app/app.go:512
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "adding env vars to %s service config"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -1805,7 +1844,7 @@ msgstr  ""
 | 
			
		||||
msgid   "attempting to run %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:270 ./cli/app/upgrade.go:293
 | 
			
		||||
#: ./cli/app/deploy.go:272 ./cli/app/upgrade.go:295
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "attempting to run post deploy commands, saw: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -1830,7 +1869,7 @@ msgstr  ""
 | 
			
		||||
msgid   "autocomplete [bash|zsh|fish|powershell]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:65 ./cli/app/logs.go:39 ./cli/app/rollback.go:64 ./cli/app/secret.go:49 ./cli/app/secret.go:191 ./cli/app/secret.go:360 ./cli/app/upgrade.go:63 ./pkg/autocomplete/autocomplete.go:18 ./pkg/autocomplete/autocomplete.go:33 ./pkg/autocomplete/autocomplete.go:44 ./pkg/autocomplete/autocomplete.go:50 ./pkg/autocomplete/autocomplete.go:70 ./pkg/autocomplete/autocomplete.go:88 ./pkg/autocomplete/autocomplete.go:104 ./pkg/autocomplete/autocomplete.go:110 ./pkg/autocomplete/autocomplete.go:125
 | 
			
		||||
#: ./cli/app/deploy.go:65 ./cli/app/logs.go:39 ./cli/app/rollback.go:65 ./cli/app/secret.go:49 ./cli/app/secret.go:191 ./cli/app/secret.go:360 ./cli/app/upgrade.go:63 ./pkg/autocomplete/autocomplete.go:18 ./pkg/autocomplete/autocomplete.go:33 ./pkg/autocomplete/autocomplete.go:44 ./pkg/autocomplete/autocomplete.go:50 ./pkg/autocomplete/autocomplete.go:70 ./pkg/autocomplete/autocomplete.go:88 ./pkg/autocomplete/autocomplete.go:104 ./pkg/autocomplete/autocomplete.go:110 ./pkg/autocomplete/autocomplete.go:125
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "autocomplete failed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -1885,7 +1924,7 @@ msgstr  ""
 | 
			
		||||
#. no spaces in between
 | 
			
		||||
#. translators: `abra app cp` aliases. use a comma separated list of aliases with
 | 
			
		||||
#. no spaces in between
 | 
			
		||||
#: ./cli/app/backup.go:148 ./cli/app/cp.go:30 ./cli/app/deploy.go:417 ./cli/app/rollback.go:365 ./cli/app/upgrade.go:475
 | 
			
		||||
#: ./cli/app/backup.go:148 ./cli/app/cp.go:30 ./cli/app/deploy.go:419 ./cli/app/rollback.go:368 ./cli/app/upgrade.go:477
 | 
			
		||||
msgid   "c"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -1941,7 +1980,7 @@ msgstr  ""
 | 
			
		||||
msgid   "cannot redeploy previous chaos version (%s), did you mean to use \"--chaos\"?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:367
 | 
			
		||||
#: ./cli/app/deploy.go:369
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "cannot redeploy previous chaos version (%s), did you mean to use \"--chaos\"?\n"
 | 
			
		||||
        "     to return to a regular release, specify a release tag, commit SHA or use \"--latest\""
 | 
			
		||||
@ -1960,7 +1999,7 @@ msgstr  ""
 | 
			
		||||
msgid   "cannot use '[secret] [version]' and '--all' together"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:309
 | 
			
		||||
#: ./cli/app/deploy.go:311
 | 
			
		||||
msgid   "cannot use --chaos and --latest together"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -1984,11 +2023,11 @@ msgstr  ""
 | 
			
		||||
msgid   "cannot use [service] and --all-services/-a together"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:301 ./cli/app/new.go:76
 | 
			
		||||
#: ./cli/app/deploy.go:303 ./cli/app/new.go:76
 | 
			
		||||
msgid   "cannot use [version] and --chaos together"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:305
 | 
			
		||||
#: ./cli/app/deploy.go:307
 | 
			
		||||
msgid   "cannot use [version] and --latest together"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -2020,7 +2059,7 @@ msgstr  ""
 | 
			
		||||
msgid   "cfg"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/backup.go:318 ./cli/app/backup.go:334 ./cli/app/check.go:94 ./cli/app/cmd.go:284 ./cli/app/cp.go:384 ./cli/app/deploy.go:392 ./cli/app/labels.go:142 ./cli/app/new.go:396 ./cli/app/ps.go:212 ./cli/app/restart.go:161 ./cli/app/restore.go:137 ./cli/app/secret.go:568 ./cli/app/secret.go:608 ./cli/app/secret.go:632 ./cli/app/secret.go:640 ./cli/catalogue/catalogue.go:317 ./cli/recipe/lint.go:136
 | 
			
		||||
#: ./cli/app/backup.go:318 ./cli/app/backup.go:334 ./cli/app/check.go:94 ./cli/app/cmd.go:284 ./cli/app/cp.go:384 ./cli/app/deploy.go:394 ./cli/app/labels.go:142 ./cli/app/new.go:396 ./cli/app/ps.go:212 ./cli/app/restart.go:161 ./cli/app/restore.go:137 ./cli/app/secret.go:568 ./cli/app/secret.go:608 ./cli/app/secret.go:632 ./cli/app/secret.go:640 ./cli/catalogue/catalogue.go:317 ./cli/recipe/lint.go:136
 | 
			
		||||
msgid   "chaos"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -2029,7 +2068,7 @@ msgstr  ""
 | 
			
		||||
msgid   "check <domain> [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:94 ./cli/app/undeploy.go:57 ./cli/app/upgrade.go:439
 | 
			
		||||
#: ./cli/app/deploy.go:94 ./cli/app/undeploy.go:58 ./cli/app/upgrade.go:441
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "checking whether %s is already deployed"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -2050,7 +2089,7 @@ msgstr  ""
 | 
			
		||||
msgid   "choosing %s as new version for %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:151
 | 
			
		||||
#: ./cli/app/rollback.go:152
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "choosing %s as version to rollback"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -2180,7 +2219,7 @@ msgstr  ""
 | 
			
		||||
msgid   "considering %s config(s) for tag update"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:140 ./cli/server/prune.go:53
 | 
			
		||||
#: ./cli/app/undeploy.go:141 ./cli/server/prune.go:53
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "containers pruned: %d; space reclaimed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -2311,7 +2350,7 @@ msgstr  ""
 | 
			
		||||
msgid   "critical errors present in %s config"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:295
 | 
			
		||||
#: ./cli/app/rollback.go:298
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "current deployment '%s' is not a known version for %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -2363,7 +2402,7 @@ msgstr  ""
 | 
			
		||||
msgid   "deploy labels stanza present"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:427
 | 
			
		||||
#: ./cli/app/deploy.go:429
 | 
			
		||||
msgid   "deploy latest recipe version"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -2465,11 +2504,11 @@ msgstr  ""
 | 
			
		||||
msgid   "dirty: %v, "
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:419 ./cli/app/rollback.go:367 ./cli/app/upgrade.go:477
 | 
			
		||||
#: ./cli/app/deploy.go:421 ./cli/app/rollback.go:370 ./cli/app/upgrade.go:479
 | 
			
		||||
msgid   "disable converge logic checks"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:411 ./cli/app/rollback.go:359 ./cli/app/upgrade.go:469
 | 
			
		||||
#: ./cli/app/deploy.go:413 ./cli/app/rollback.go:362 ./cli/app/upgrade.go:471
 | 
			
		||||
msgid   "disable public DNS checks"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -2567,9 +2606,9 @@ msgstr  ""
 | 
			
		||||
msgid   "duplicate secret target for %s not allowed"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `abra app env` aliases. use a comma separated list of aliases with
 | 
			
		||||
#. no spaces in between
 | 
			
		||||
#: ./cli/app/env.go:17 ./cli/recipe/lint.go:145 ./cli/recipe/new.go:131
 | 
			
		||||
#. translators: `abra app env` aliases. use a comma separated list of aliases
 | 
			
		||||
#. with no spaces in between
 | 
			
		||||
#: ./cli/app/env.go:31 ./cli/recipe/lint.go:145 ./cli/recipe/new.go:131
 | 
			
		||||
msgid   "e"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -2608,9 +2647,9 @@ msgstr  ""
 | 
			
		||||
msgid   "enter / return to confirm, choose 'skip' to not upgrade this tag, vim mode is enabled"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `app env` command
 | 
			
		||||
#: ./cli/app/env.go:21
 | 
			
		||||
msgid   "env <domain> [flags]"
 | 
			
		||||
#. translators: `app env` command group
 | 
			
		||||
#: ./cli/app/env.go:311
 | 
			
		||||
msgid   "env [cmd] [args] [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:248
 | 
			
		||||
@ -2687,7 +2726,7 @@ msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `abra recipe fetch` aliases. use a comma separated list of aliases
 | 
			
		||||
#. with no spaces in between
 | 
			
		||||
#: ./cli/app/deploy.go:401 ./cli/app/remove.go:163 ./cli/app/rollback.go:349 ./cli/app/secret.go:593 ./cli/app/upgrade.go:459 ./cli/app/volume.go:217 ./cli/recipe/fetch.go:20 ./cli/recipe/fetch.go:138
 | 
			
		||||
#: ./cli/app/deploy.go:403 ./cli/app/env.go:325 ./cli/app/remove.go:163 ./cli/app/rollback.go:352 ./cli/app/secret.go:593 ./cli/app/upgrade.go:461 ./cli/app/volume.go:217 ./cli/recipe/fetch.go:20 ./cli/recipe/fetch.go:138
 | 
			
		||||
msgid   "f"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -2913,7 +2952,12 @@ msgstr  ""
 | 
			
		||||
msgid   "filter by recipe"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:400 ./cli/app/remove.go:162 ./cli/app/rollback.go:348 ./cli/app/upgrade.go:458 ./cli/app/volume.go:216 ./cli/recipe/fetch.go:137
 | 
			
		||||
#: ./cli/app/env.go:229
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "final merged env values for %s are: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:402 ./cli/app/env.go:324 ./cli/app/remove.go:162 ./cli/app/rollback.go:351 ./cli/app/upgrade.go:460 ./cli/app/volume.go:216 ./cli/recipe/fetch.go:137
 | 
			
		||||
msgid   "force"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3127,11 +3171,11 @@ msgstr  ""
 | 
			
		||||
msgid   "id: %s, "
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/backup.go:321 ./cli/app/backup.go:337 ./cli/app/check.go:97 ./cli/app/cmd.go:287 ./cli/app/cp.go:387 ./cli/app/deploy.go:395 ./cli/app/labels.go:145 ./cli/app/new.go:399 ./cli/app/ps.go:215 ./cli/app/restart.go:164 ./cli/app/restore.go:140 ./cli/app/secret.go:571 ./cli/app/secret.go:611 ./cli/app/secret.go:635 ./cli/app/secret.go:643 ./cli/catalogue/catalogue.go:320 ./cli/recipe/lint.go:139
 | 
			
		||||
#: ./cli/app/backup.go:321 ./cli/app/backup.go:337 ./cli/app/check.go:97 ./cli/app/cmd.go:287 ./cli/app/cp.go:387 ./cli/app/deploy.go:397 ./cli/app/labels.go:145 ./cli/app/new.go:399 ./cli/app/ps.go:215 ./cli/app/restart.go:164 ./cli/app/restore.go:140 ./cli/app/secret.go:571 ./cli/app/secret.go:611 ./cli/app/secret.go:635 ./cli/app/secret.go:643 ./cli/catalogue/catalogue.go:320 ./cli/recipe/lint.go:139
 | 
			
		||||
msgid   "ignore uncommitted recipes changes"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:155 ./cli/server/prune.go:74
 | 
			
		||||
#: ./cli/app/undeploy.go:156 ./cli/server/prune.go:74
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "images pruned: %d; space reclaimed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -3251,6 +3295,21 @@ msgstr  ""
 | 
			
		||||
msgid   "insert <domain> <secret> <version> [<data>] [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:290
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "inserting %s=%s (no quotes)"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:283
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "inserting %s='%s' (single quotes)"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:276
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "inserting %s=\"%s\" (double quotes)"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/upgrade.go:62
 | 
			
		||||
msgid   "install release candidate (may contain bugs)"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -3310,16 +3369,22 @@ msgstr  ""
 | 
			
		||||
#. no spaces in between
 | 
			
		||||
#. translators: `abra recipe lint` aliases. use a comma separated list of
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#: ./cli/app/cmd.go:261 ./cli/app/deploy.go:425 ./cli/app/logs.go:20 ./cli/recipe/lint.go:17 ./cli/server/add.go:207
 | 
			
		||||
#: ./cli/app/cmd.go:261 ./cli/app/deploy.go:427 ./cli/app/logs.go:20 ./cli/recipe/lint.go:17 ./cli/server/add.go:207
 | 
			
		||||
msgid   "l"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `abra app env list` aliases. use a comma separated list of
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#: ./cli/app/env.go:35
 | 
			
		||||
msgid   "l,ls"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `app labels` command
 | 
			
		||||
#: ./cli/app/labels.go:29
 | 
			
		||||
msgid   "labels <domain> [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:424 ./cli/app/list.go:182
 | 
			
		||||
#: ./cli/app/deploy.go:426 ./cli/app/list.go:182
 | 
			
		||||
msgid   "latest"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3361,8 +3426,9 @@ msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `app backup list` command
 | 
			
		||||
#. translators: `app cmd list` command
 | 
			
		||||
#. translators: `app env list` command
 | 
			
		||||
#. translators: `app volume list` command
 | 
			
		||||
#: ./cli/app/backup.go:21 ./cli/app/cmd.go:207 ./cli/app/volume.go:25
 | 
			
		||||
#: ./cli/app/backup.go:21 ./cli/app/cmd.go:207 ./cli/app/env.go:43 ./cli/app/volume.go:25
 | 
			
		||||
msgid   "list <domain> [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3474,6 +3540,11 @@ msgstr  ""
 | 
			
		||||
msgid   "man [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:304
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "manual update required: COMPOSE_FILE=\"%s\""
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/move.go:204
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "migrating app config from %s to %s"
 | 
			
		||||
@ -3553,7 +3624,7 @@ msgstr  ""
 | 
			
		||||
msgid   "network %q is declared as external, but it is not in the right scope: %q instead of \"swarm\""
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:147 ./cli/server/prune.go:60
 | 
			
		||||
#: ./cli/app/undeploy.go:148 ./cli/server/prune.go:60
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "networks pruned: %d"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -3621,7 +3692,7 @@ msgstr  ""
 | 
			
		||||
msgid   "no app provided"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:126
 | 
			
		||||
#: ./cli/app/rollback.go:127
 | 
			
		||||
msgid   "no available downgrades"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3744,6 +3815,11 @@ msgstr  ""
 | 
			
		||||
msgid   "no unstable tags"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:165
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "no value attached to %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/internal/recipe.go:72 ./cli/internal/recipe.go:87
 | 
			
		||||
msgid   "no version bump type specififed?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -3766,11 +3842,11 @@ msgstr  ""
 | 
			
		||||
msgid   "no volumes to remove"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:416 ./cli/app/rollback.go:364 ./cli/app/upgrade.go:474
 | 
			
		||||
#: ./cli/app/deploy.go:418 ./cli/app/rollback.go:367 ./cli/app/upgrade.go:476
 | 
			
		||||
msgid   "no-converge-checks"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:408 ./cli/app/rollback.go:356 ./cli/app/upgrade.go:466
 | 
			
		||||
#: ./cli/app/deploy.go:410 ./cli/app/rollback.go:359 ./cli/app/upgrade.go:468
 | 
			
		||||
msgid   "no-domain-checks"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3826,7 +3902,7 @@ msgstr  ""
 | 
			
		||||
msgid   "only show errors"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:485
 | 
			
		||||
#: ./cli/app/upgrade.go:487
 | 
			
		||||
msgid   "only show release notes"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3838,7 +3914,7 @@ msgstr  ""
 | 
			
		||||
#. with no spaces in between
 | 
			
		||||
#. translators: `abra server prune` aliases. use a comma separated list of
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#: ./cli/app/backup.go:295 ./cli/app/new.go:381 ./cli/app/ps.go:29 ./cli/app/secret.go:561 ./cli/app/secret.go:585 ./cli/app/secret.go:625 ./cli/app/undeploy.go:168 ./cli/catalogue/catalogue.go:294 ./cli/recipe/list.go:112 ./cli/recipe/release.go:681 ./cli/server/prune.go:18
 | 
			
		||||
#: ./cli/app/backup.go:295 ./cli/app/new.go:381 ./cli/app/ps.go:29 ./cli/app/secret.go:561 ./cli/app/secret.go:585 ./cli/app/secret.go:625 ./cli/app/undeploy.go:169 ./cli/catalogue/catalogue.go:294 ./cli/recipe/list.go:112 ./cli/recipe/release.go:681 ./cli/server/prune.go:18
 | 
			
		||||
msgid   "p"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3857,22 +3933,22 @@ msgstr  ""
 | 
			
		||||
msgid   "parsed following command arguments: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:342
 | 
			
		||||
#: ./cli/app/upgrade.go:344
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "parsing chosen upgrade version failed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:386
 | 
			
		||||
#: ./cli/app/upgrade.go:388
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "parsing deployed version failed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:347
 | 
			
		||||
#: ./cli/app/upgrade.go:349
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "parsing deployment version failed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:353 ./cli/app/upgrade.go:392
 | 
			
		||||
#: ./cli/app/upgrade.go:355 ./cli/app/upgrade.go:394
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "parsing recipe version failed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -3897,31 +3973,37 @@ msgstr  ""
 | 
			
		||||
msgid   "pattern"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:403 ./cli/app/remove.go:165 ./cli/app/rollback.go:351 ./cli/app/upgrade.go:461 ./cli/app/volume.go:219
 | 
			
		||||
#: ./cli/app/deploy.go:405 ./cli/app/env.go:327 ./cli/app/remove.go:165 ./cli/app/rollback.go:354 ./cli/app/upgrade.go:463 ./cli/app/volume.go:219
 | 
			
		||||
msgid   "perform action without further prompt"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `abra app env pull` aliases. use a comma separated list of
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#: ./cli/app/env.go:39
 | 
			
		||||
msgid   "pl,p"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/recipe/release.go:634
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "please fix your synced label for %s and re-run this command"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:263
 | 
			
		||||
#: ./cli/app/rollback.go:266
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "please select a downgrade (version: %s):"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:268
 | 
			
		||||
#: ./cli/app/rollback.go:271
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "please select a downgrade (version: %s, chaos: %s):"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:309
 | 
			
		||||
#: ./cli/app/upgrade.go:311
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "please select an upgrade (version: %s):"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:314
 | 
			
		||||
#: ./cli/app/upgrade.go:316
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "please select an upgrade (version: %s, chaos: %s):"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -3960,7 +4042,7 @@ msgstr  ""
 | 
			
		||||
msgid   "proposed images: %v"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:167
 | 
			
		||||
#: ./cli/app/undeploy.go:168
 | 
			
		||||
msgid   "prune"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3969,7 +4051,7 @@ msgstr  ""
 | 
			
		||||
msgid   "prune <server> [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:170
 | 
			
		||||
#: ./cli/app/undeploy.go:171
 | 
			
		||||
msgid   "prune unused containers, networks, and dangling images"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -3994,6 +4076,16 @@ msgstr  ""
 | 
			
		||||
msgid   "publish new release?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `app pull` command
 | 
			
		||||
#: ./cli/app/env.go:77
 | 
			
		||||
msgid   "pull <domain> [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:173
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "pulled env values from %s deployment: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:429
 | 
			
		||||
msgid   "querying remote servers..."
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -4002,7 +4094,7 @@ msgstr  ""
 | 
			
		||||
#. with no spaces in between
 | 
			
		||||
#. translators: `abra recipe` aliases. use a comma separated list of aliases
 | 
			
		||||
#. with no spaces in between
 | 
			
		||||
#: ./cli/app/backup.go:327 ./cli/app/list.go:300 ./cli/app/move.go:350 ./cli/app/run.go:23 ./cli/app/upgrade.go:483 ./cli/catalogue/catalogue.go:302 ./cli/recipe/recipe.go:12 ./cli/recipe/release.go:649 ./cli/recipe/sync.go:272
 | 
			
		||||
#: ./cli/app/backup.go:327 ./cli/app/list.go:300 ./cli/app/move.go:350 ./cli/app/run.go:23 ./cli/app/upgrade.go:485 ./cli/catalogue/catalogue.go:302 ./cli/recipe/recipe.go:12 ./cli/recipe/release.go:649 ./cli/recipe/sync.go:272
 | 
			
		||||
msgid   "r"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4017,12 +4109,12 @@ msgstr  ""
 | 
			
		||||
msgid   "read %s as tags for recipe %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:575 ./pkg/config/env.go:50 ./pkg/envfile/envfile.go:42 ./pkg/envfile/envfile.go:80
 | 
			
		||||
#: ./pkg/app/app.go:584 ./pkg/config/env.go:50 ./pkg/envfile/envfile.go:42 ./pkg/envfile/envfile.go:80
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "read %s from %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:577
 | 
			
		||||
#: ./pkg/app/app.go:586
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "read 0 command names from %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -4118,7 +4210,7 @@ msgstr  ""
 | 
			
		||||
msgid   "release <recipe> [version] [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/upgrade.go:482
 | 
			
		||||
#: ./cli/app/upgrade.go:484
 | 
			
		||||
msgid   "releasenotes"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4340,6 +4432,11 @@ msgstr  ""
 | 
			
		||||
msgid   "retrieved app statuses: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:219
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "retrieved env values from .env.sample of %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/recipe/version.go:46
 | 
			
		||||
msgid   "retrieved versions from local recipe repository"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -4357,7 +4454,7 @@ msgstr  ""
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#. translators: `abra recipe release` aliases. use a comma separated list of
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#: ./cli/app/rollback.go:26 ./cli/recipe/release.go:28
 | 
			
		||||
#: ./cli/app/rollback.go:27 ./cli/recipe/release.go:28
 | 
			
		||||
msgid   "rl"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4374,7 +4471,7 @@ msgid   "rm"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `app rollback` command
 | 
			
		||||
#: ./cli/app/rollback.go:30
 | 
			
		||||
#: ./cli/app/rollback.go:31
 | 
			
		||||
msgid   "rollback <domain> [version] [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4417,7 +4514,7 @@ msgstr  ""
 | 
			
		||||
msgid   "run command locally"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:268 ./cli/app/upgrade.go:290
 | 
			
		||||
#: ./cli/app/deploy.go:270 ./cli/app/upgrade.go:292
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "run the following post-deploy commands: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -4460,7 +4557,7 @@ msgstr  ""
 | 
			
		||||
#. aliases with no spaces in between
 | 
			
		||||
#. translators: `abra server` aliases. use a comma separated list of aliases
 | 
			
		||||
#. with no spaces in between
 | 
			
		||||
#: ./cli/app/backup.go:198 ./cli/app/backup.go:263 ./cli/app/backup.go:287 ./cli/app/list.go:323 ./cli/app/logs.go:101 ./cli/app/new.go:358 ./cli/app/restore.go:114 ./cli/app/secret.go:535 ./cli/catalogue/catalogue.go:27 ./cli/catalogue/catalogue.go:310 ./cli/recipe/fetch.go:130 ./cli/recipe/sync.go:24 ./cli/server/server.go:12
 | 
			
		||||
#: ./cli/app/backup.go:198 ./cli/app/backup.go:263 ./cli/app/backup.go:287 ./cli/app/env.go:333 ./cli/app/list.go:323 ./cli/app/logs.go:101 ./cli/app/new.go:358 ./cli/app/restore.go:114 ./cli/app/secret.go:535 ./cli/catalogue/catalogue.go:27 ./cli/catalogue/catalogue.go:310 ./cli/recipe/fetch.go:130 ./cli/recipe/sync.go:24 ./cli/server/server.go:12
 | 
			
		||||
msgid   "s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4502,12 +4599,12 @@ msgstr  ""
 | 
			
		||||
msgid   "secret not found: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:337
 | 
			
		||||
#: ./cli/app/deploy.go:339
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "secret not generated: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:335
 | 
			
		||||
#: ./cli/app/deploy.go:337
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "secret not inserted (#generate=false): %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -4527,7 +4624,7 @@ msgid   "secrets are %s shown again, please save them %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#. translators: `abra server` command for autocompletion
 | 
			
		||||
#: ./cli/app/list.go:322 ./cli/app/list.go:329 ./cli/app/new.go:357 ./cli/app/new.go:364 ./cli/run.go:101
 | 
			
		||||
#: ./cli/app/env.go:332 ./cli/app/env.go:339 ./cli/app/list.go:322 ./cli/app/list.go:329 ./cli/app/new.go:357 ./cli/app/new.go:364 ./cli/run.go:101
 | 
			
		||||
msgid   "server"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4541,6 +4638,10 @@ msgstr  ""
 | 
			
		||||
msgid   "server [cmd] [args] [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:335
 | 
			
		||||
msgid   "server associated with deployed app"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/server/add.go:191
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "server dir for %s already created"
 | 
			
		||||
@ -4627,7 +4728,7 @@ msgstr  ""
 | 
			
		||||
msgid   "severity"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:435 ./cli/app/rollback.go:375 ./cli/app/upgrade.go:493
 | 
			
		||||
#: ./cli/app/deploy.go:437 ./cli/app/rollback.go:378 ./cli/app/upgrade.go:495
 | 
			
		||||
msgid   "show all configs & images, including unchanged ones"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4651,7 +4752,7 @@ msgstr  ""
 | 
			
		||||
msgid   "show debug messages"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:432 ./cli/app/rollback.go:372 ./cli/app/upgrade.go:490
 | 
			
		||||
#: ./cli/app/deploy.go:434 ./cli/app/rollback.go:375 ./cli/app/upgrade.go:492
 | 
			
		||||
msgid   "show-unchanged"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4699,11 +4800,11 @@ msgstr  ""
 | 
			
		||||
msgid   "skipping converge logic checks"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:196
 | 
			
		||||
#: ./cli/app/deploy.go:198
 | 
			
		||||
msgid   "skipping domain checks"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:193
 | 
			
		||||
#: ./cli/app/deploy.go:195
 | 
			
		||||
msgid   "skipping domain checks, no DOMAIN=... configured"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -4717,12 +4818,12 @@ msgstr  ""
 | 
			
		||||
msgid   "skipping secret (because it already exists) on %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:683
 | 
			
		||||
#: ./pkg/app/app.go:692
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "skipping version %s write as already exists in %s.env"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:677
 | 
			
		||||
#: ./pkg/app/app.go:686
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "skipping writing version %s because dry run"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -5034,6 +5135,16 @@ msgstr  ""
 | 
			
		||||
msgid   "unable to delete tag %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:191
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to determine recipe type from %s, env: %v"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:106
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to determine server of app %s, please pass --server/-s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/recipe/upgrade.go:253
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to determine versioning semantics of %s, listing all tags"
 | 
			
		||||
@ -5064,6 +5175,11 @@ msgstr  ""
 | 
			
		||||
msgid   "unable to git pull in %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:158
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to inspect container for %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/lint/recipe.go:496
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to list local tags for %s"
 | 
			
		||||
@ -5073,6 +5189,11 @@ msgstr  ""
 | 
			
		||||
msgid   "unable to locate git command, cannot output diff"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:117
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to look up server context for %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/recipe/fetch.go:77 ./pkg/git/read.go:26 ./pkg/lint/recipe.go:491 ./pkg/recipe/git.go:236
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to open %s: %s"
 | 
			
		||||
@ -5128,6 +5249,11 @@ msgstr  ""
 | 
			
		||||
msgid   "unable to query status of %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:243
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to read new env %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/recipe/git.go:241
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to read remotes in %s: %s"
 | 
			
		||||
@ -5178,6 +5304,11 @@ msgstr  ""
 | 
			
		||||
msgid   "unable to retrieve %s resources on %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:153
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to retrieve container for %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/list.go:153
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to retrieve tags for %s: %s"
 | 
			
		||||
@ -5208,6 +5339,16 @@ msgstr  ""
 | 
			
		||||
msgid   "unable to validate recipe: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:238 ./cli/app/env.go:298
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unable to write new env %s: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:264 ./cli/app/env.go:270
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "uncommenting %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/upstream/convert/service.go:462
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "undefined config %q"
 | 
			
		||||
@ -5233,7 +5374,7 @@ msgstr  ""
 | 
			
		||||
msgid   "undeploy <domain> [flags]"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/undeploy.go:116
 | 
			
		||||
#: ./cli/app/undeploy.go:117
 | 
			
		||||
msgid   "undeploy succeeded 🟢"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -5266,7 +5407,7 @@ msgstr  ""
 | 
			
		||||
msgid   "unknown"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/rollback.go:148
 | 
			
		||||
#: ./cli/app/rollback.go:149
 | 
			
		||||
msgid   "unknown deployed version, unable to downgrade"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
@ -5289,6 +5430,11 @@ msgstr  ""
 | 
			
		||||
msgid   "unknown restart policy: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/env.go:111
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unknown server %s, run \"abra server add %s\"?"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/client/client.go:51
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "unknown server, run \"abra server add %s\"?"
 | 
			
		||||
@ -5417,7 +5563,7 @@ msgstr  ""
 | 
			
		||||
msgid   "version"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:681
 | 
			
		||||
#: ./pkg/app/app.go:690
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version %s saved to %s.env"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -5441,32 +5587,32 @@ msgstr  ""
 | 
			
		||||
msgid   "version seems invalid: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./pkg/app/app.go:620
 | 
			
		||||
#: ./pkg/app/app.go:629
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version wiped from %s.env"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:351
 | 
			
		||||
#: ./cli/app/deploy.go:353
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version: taking chaos version: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:377
 | 
			
		||||
#: ./cli/app/deploy.go:379
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version: taking deployed version: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:382
 | 
			
		||||
#: ./cli/app/deploy.go:384
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version: taking new recipe version: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:371
 | 
			
		||||
#: ./cli/app/deploy.go:373
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version: taking version from .env file: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:357
 | 
			
		||||
#: ./cli/app/deploy.go:359
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "version: taking version from cli arg: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
@ -5589,7 +5735,7 @@ msgstr  ""
 | 
			
		||||
msgid   "writer: %v, "
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
#: ./cli/app/deploy.go:275 ./cli/app/new.go:241 ./cli/app/rollback.go:252 ./cli/app/undeploy.go:119 ./cli/app/upgrade.go:298
 | 
			
		||||
#: ./cli/app/deploy.go:277 ./cli/app/new.go:241 ./cli/app/rollback.go:255 ./cli/app/undeploy.go:120 ./cli/app/upgrade.go:300
 | 
			
		||||
#, c-format
 | 
			
		||||
msgid   "writing recipe version failed: %s"
 | 
			
		||||
msgstr  ""
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -127,3 +127,14 @@ teardown(){
 | 
			
		||||
    "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
  assert_success
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "new env version written to container env" {
 | 
			
		||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' \
 | 
			
		||||
    $(docker ps -f name="$TEST_APP_DOMAIN_$TEST_SERVER" -q)
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial "$TEST_RECIIPE:0.1.0+1.20.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -28,17 +28,17 @@ teardown(){
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@test "validate app argument" {
 | 
			
		||||
  run $ABRA app env
 | 
			
		||||
  run $ABRA app env list
 | 
			
		||||
  assert_failure
 | 
			
		||||
 | 
			
		||||
  run $ABRA app env DOESNTEXIST
 | 
			
		||||
  run $ABRA app env list DOESNTEXIST
 | 
			
		||||
  assert_failure
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@test "show env version" {
 | 
			
		||||
  latestRelease=$(_latest_release)
 | 
			
		||||
 | 
			
		||||
  run $ABRA app env "$TEST_APP_DOMAIN"
 | 
			
		||||
  run $ABRA app env list "$TEST_APP_DOMAIN"
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial "$latestRelease"
 | 
			
		||||
}
 | 
			
		||||
@ -48,7 +48,7 @@ teardown(){
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
			
		||||
 | 
			
		||||
  run $ABRA app env "$TEST_APP_DOMAIN"
 | 
			
		||||
  run $ABRA app env list "$TEST_APP_DOMAIN"
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
			
		||||
@ -57,3 +57,44 @@ teardown(){
 | 
			
		||||
  run rm -rf "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
			
		||||
  assert_not_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@test "app env pull explodes when no deployed app" { 
 | 
			
		||||
  run $ABRA app env pull "$TEST_APP_DOMAIN" -s "$TEST_SERVER"
 | 
			
		||||
  assert_failure
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "app env pull recreates app env when missing" { 
 | 
			
		||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run rm -rf "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
 | 
			
		||||
  run $ABRA app env pull "$TEST_APP_DOMAIN" -s "$TEST_SERVER"
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "app env pull recreates correct version" { 
 | 
			
		||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input
 | 
			
		||||
  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 rm -rf "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
 | 
			
		||||
  run $ABRA app env pull "$TEST_APP_DOMAIN" -s "$TEST_SERVER"
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
 | 
			
		||||
  run grep -q "TYPE=$TEST_RECIPE:0.1.0+1.20.0" \
 | 
			
		||||
    "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
  assert_success
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -33,10 +33,29 @@ teardown(){
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run $ABRA app rollback "$TEST_APP_DOMAIN" "0.1.0+1.20.0" \
 | 
			
		||||
    --no-input --no-converge-checks --debug
 | 
			
		||||
    --no-input --no-converge-checks
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run grep -q "TYPE=abra-test-recipe:0.1.0+1.20.0" \
 | 
			
		||||
    "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
  assert_success
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "new env version written to container env" {
 | 
			
		||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" "0.2.0+1.21.0" --no-input
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' \
 | 
			
		||||
    $(docker ps -f name="$TEST_APP_DOMAIN_$TEST_SERVER" -q)
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial "$TEST_RECIIPE:0.1.0+1.20.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -256,7 +256,7 @@ teardown(){
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "commit deploy upgrade is possible" {
 | 
			
		||||
@test "specific version upgrade after chaos deploy" {
 | 
			
		||||
  tagHash=$(_get_tag_hash "0.1.0+1.20.0")
 | 
			
		||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$tagHash"
 | 
			
		||||
  assert_success
 | 
			
		||||
@ -269,17 +269,26 @@ teardown(){
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --regexp "CURRENT DEPLOYMENT.*${tagHash:0:8}"
 | 
			
		||||
  assert_output --regexp "ENV VERSION.*${tagHash:0:8}"
 | 
			
		||||
  assert_output --regexp "NEW DEPLOYMENT.*0\.1\.1\+1\.20\.2"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@test "chaos commit upgrade is possible" {
 | 
			
		||||
  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'
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "upgrade to latest after chaos deploy" {
 | 
			
		||||
  latestRelease=$(_latest_release)
 | 
			
		||||
 | 
			
		||||
  tagHash=$(_get_tag_hash "0.2.0+1.21.0")
 | 
			
		||||
 | 
			
		||||
  run $ABRA app upgrade "$TEST_APP_DOMAIN" "$tagHash" --no-input --no-converge-checks
 | 
			
		||||
  tagHash=$(_get_tag_hash "0.1.0+1.20.0")
 | 
			
		||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$tagHash"
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks --chaos
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial "${tagHash:0:8}"
 | 
			
		||||
 | 
			
		||||
  run $ABRA app upgrade "$TEST_APP_DOMAIN" --no-input --no-converge-checks
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --regexp "CURRENT DEPLOYMENT.*${tagHash:0:8}"
 | 
			
		||||
  assert_output --regexp "ENV VERSION.*${tagHash:0:8}"
 | 
			
		||||
  assert_output --partial "${latestRelease}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
 | 
			
		||||
@ -40,3 +40,21 @@ teardown(){
 | 
			
		||||
    "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
			
		||||
  assert_success
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# bats test_tags=slow
 | 
			
		||||
@test "new env version written to container env" {
 | 
			
		||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' \
 | 
			
		||||
    $(docker ps -f name="$TEST_APP_DOMAIN_$TEST_SERVER" -q)
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial "$TEST_RECIIPE:0.2.0+1.21.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -101,6 +101,9 @@ teardown() {
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
			
		||||
 | 
			
		||||
  run $ABRA recipe sync "$TEST_RECIPE" --no-input --patch
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run $ABRA recipe release "$TEST_RECIPE" --no-input --patch
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial 'no -p/--publish passed, not publishing'
 | 
			
		||||
@ -119,6 +122,9 @@ teardown() {
 | 
			
		||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" commit -m "added some release notes"
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run $ABRA recipe sync "$TEST_RECIPE" --no-input --patch
 | 
			
		||||
  assert_success
 | 
			
		||||
 | 
			
		||||
  run $ABRA recipe release  "$TEST_RECIPE" --no-input  --minor
 | 
			
		||||
  assert_success
 | 
			
		||||
  assert_output --partial 'no -p/--publish passed, not publishing'
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user