diff --git a/api/stacks/deployments/compose_unpacker_cmd_builder.go b/api/stacks/deployments/compose_unpacker_cmd_builder.go index 734e548f2..6d51c4500 100644 --- a/api/stacks/deployments/compose_unpacker_cmd_builder.go +++ b/api/stacks/deployments/compose_unpacker_cmd_builder.go @@ -31,6 +31,7 @@ const ( type unpackerCmdBuilderOptions struct { pullImage bool prune bool + forceRecreate bool composeDestination string registries []portainer.Registry } @@ -61,11 +62,12 @@ func (d *stackDeployer) buildUnpackerCmdForStack(stack *portainer.Stack, operati return fn(stack, opts, registriesStrings, envStrings), nil } -// deploy [-u username -p password] [--skip-tls-verify] [--env KEY1=VALUE1 --env KEY2=VALUE2] [...] +// deploy [-u username -p password] [--skip-tls-verify] [--force-recreate] [-k] [--env KEY1=VALUE1 --env KEY2=VALUE2] [...] func buildDeployCmd(stack *portainer.Stack, opts unpackerCmdBuilderOptions, registries []string, env []string) []string { cmd := []string{UnpackerCmdDeploy} cmd = appendGitAuthIfNeeded(cmd, stack) cmd = appendSkipTLSVerifyIfNeeded(cmd, stack) + cmd = appendForceRecreateIfNeeded(cmd, opts.forceRecreate) cmd = append(cmd, env...) cmd = append(cmd, registries...) cmd = append(cmd, @@ -125,12 +127,12 @@ func buildComposeStopCmd(stack *portainer.Stack, opts unpackerCmdBuilderOptions, return append(cmd, stack.AdditionalFiles...) } -// swarm-deploy [-u username -p password] [--skip-tls-verify] [-f] [-r] [--env KEY1=VALUE1 --env KEY2=VALUE2] [...] +// swarm-deploy [-u username -p password] [--skip-tls-verify] [--force-recreate] [-f] [-r] [-k] [--env KEY1=VALUE1 --env KEY2=VALUE2] [...] func buildSwarmDeployCmd(stack *portainer.Stack, opts unpackerCmdBuilderOptions, registries []string, env []string) []string { cmd := []string{UnpackerCmdSwarmDeploy} cmd = appendGitAuthIfNeeded(cmd, stack) cmd = appendSkipTLSVerifyIfNeeded(cmd, stack) - + cmd = appendForceRecreateIfNeeded(cmd, opts.forceRecreate) if opts.pullImage { cmd = append(cmd, "-f") } @@ -193,6 +195,13 @@ func appendSkipTLSVerifyIfNeeded(cmd []string, stack *portainer.Stack) []string return append(cmd, "--skip-tls-verify") } +func appendForceRecreateIfNeeded(cmd []string, forceRecreate bool) []string { + if forceRecreate { + cmd = append(cmd, "--force-recreate") + } + return cmd +} + func generateRegistriesStrings(registries []portainer.Registry, dataStore dataservices.DataStore) []string { cmds := []string{} diff --git a/api/stacks/deployments/deployer_remote.go b/api/stacks/deployments/deployer_remote.go index cc505fcd8..fb56c25f7 100644 --- a/api/stacks/deployments/deployer_remote.go +++ b/api/stacks/deployments/deployer_remote.go @@ -70,7 +70,8 @@ func (d *stackDeployer) DeployRemoteComposeStack( endpoint, OperationDeploy, unpackerCmdBuilderOptions{ - registries: registries, + forceRecreate: forceRecreate, + registries: registries, }, ) } @@ -119,10 +120,10 @@ func (d *stackDeployer) DeployRemoteSwarmStack( defer d.swarmStackManager.Logout(endpoint) return d.remoteStack(stack, endpoint, OperationSwarmDeploy, unpackerCmdBuilderOptions{ - - pullImage: pullImage, - prune: prune, - registries: registries, + pullImage: pullImage, + prune: prune, + forceRecreate: stack.AutoUpdate != nil && stack.AutoUpdate.ForceUpdate, + registries: registries, }) }