diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 340136d46..308d2c271 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -52,5 +52,11 @@ jobs: - uses: actions/setup-go@v3 with: go-version: ${{ env.GO_VERSION }} + + - name: Install docker-compose + run: | + sudo apt-get update + sudo apt-get install docker-compose + - name: Run tests run: make test-server diff --git a/api/pendingactions/pendingactions.go b/api/pendingactions/pendingactions.go index 22ac3ebc4..f072b1445 100644 --- a/api/pendingactions/pendingactions.go +++ b/api/pendingactions/pendingactions.go @@ -97,7 +97,6 @@ func (service *PendingActionsService) execute(environmentID portainer.EndpointID if len(pendingActions) > 0 { log.Debug().Msgf("Found %d pending actions", len(pendingActions)) - log.Debug().Msgf("PendingActions %+v", pendingActions) } for i, endpointPendingAction := range pendingActions { diff --git a/api/stacks/deployments/compose_unpacker_cmd_builder.go b/api/stacks/deployments/compose_unpacker_cmd_builder.go index 20bf56d43..64308fa1a 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 } @@ -62,12 +63,13 @@ 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{} cmd = append(cmd, 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, stack.GitConfig.URL) @@ -124,12 +126,13 @@ func buildComposeStopCmd(stack *portainer.Stack, opts unpackerCmdBuilderOptions, return cmd } -// 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{} cmd = append(cmd, UnpackerCmdSwarmDeploy) cmd = appendGitAuthIfNeeded(cmd, stack) cmd = appendSkipTLSVerifyIfNeeded(cmd, stack) + cmd = appendForceRecreateIfNeeded(cmd, opts.forceRecreate) if opts.pullImage { cmd = append(cmd, "-f") } @@ -203,6 +206,13 @@ func appendAdditionalFiles(cmd []string, files []string) []string { return cmd } +func appendForceRecreateIfNeeded(cmd []string, forceRecreate bool) []string { + if forceRecreate { + cmd = append(cmd, "--force-recreate") + } + return cmd +} + func getRegistry(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, }) }