diff --git a/pkg/container/docker_volume.go b/pkg/container/docker_volume.go index 787a49a..4a50261 100644 --- a/pkg/container/docker_volume.go +++ b/pkg/container/docker_volume.go @@ -3,11 +3,34 @@ package container import ( "context" + "github.com/docker/docker/api/types/filters" "github.com/nektos/act/pkg/common" ) -// NewDockerVolumeRemoveExecutor function func NewDockerVolumeRemoveExecutor(volume string, force bool) common.Executor { + return func(ctx context.Context) error { + cli, err := GetDockerClient(ctx) + if err != nil { + return err + } + + list, err := cli.VolumeList(ctx, filters.NewArgs()) + if err != nil { + return err + } + + for _, vol := range list.Volumes { + if vol.Name == volume { + return removeExecutor(volume, force)(ctx) + } + } + + // Volume not found - do nothing + return nil + } +} + +func removeExecutor(volume string, force bool) common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) logger.Debugf("%sdocker volume rm %s", logPrefix, volume) @@ -23,5 +46,4 @@ func NewDockerVolumeRemoveExecutor(volume string, force bool) common.Executor { return cli.VolumeRemove(ctx, volume, force) } - } diff --git a/pkg/runner/expression_test.go b/pkg/runner/expression_test.go index c713a75..b6ea14a 100644 --- a/pkg/runner/expression_test.go +++ b/pkg/runner/expression_test.go @@ -83,7 +83,6 @@ func TestEvaluate(t *testing.T) { {"matrix.os", "Linux", ""}, {"matrix.foo", "bar", ""}, {"env.key", "value", ""}, - } for _, table := range tables { @@ -121,8 +120,8 @@ func TestInterpolate(t *testing.T) { }, } ee := rc.NewExpressionEvaluator() - tables := []struct{ - in string + tables := []struct { + in string out string }{ {" ${{1}} to ${{2}} ", " 1 to 2 "}, diff --git a/pkg/runner/run_context.go b/pkg/runner/run_context.go index cb4a259..a3f49f5 100644 --- a/pkg/runner/run_context.go +++ b/pkg/runner/run_context.go @@ -115,7 +115,7 @@ func (rc *RunContext) startJobContainer() common.Executor { return common.NewPipelineExecutor( rc.JobContainer.Pull(rc.Config.ForcePull), - rc.JobContainer.Remove().IfBool(!rc.Config.ReuseContainers), + rc.stopJobContainer(), rc.JobContainer.Create(), rc.JobContainer.Start(false), rc.JobContainer.CopyDir(copyToPath, rc.Config.Workdir+"/.").IfBool(copyWorkspace), @@ -136,6 +136,8 @@ func (rc *RunContext) execJobContainer(cmd []string, env map[string]string) comm return rc.JobContainer.Exec(cmd, env)(ctx) } } + +// stopJobContainer removes the job container (if it exists) and its volume (if it exists) if !rc.Config.ReuseContainers func (rc *RunContext) stopJobContainer() common.Executor { return func(ctx context.Context) error { if rc.JobContainer != nil && !rc.Config.ReuseContainers { diff --git a/pkg/runner/run_context_test.go b/pkg/runner/run_context_test.go index af07b8e..759f54c 100644 --- a/pkg/runner/run_context_test.go +++ b/pkg/runner/run_context_test.go @@ -16,8 +16,8 @@ func TestRunContext_EvalBool(t *testing.T) { Workdir: ".", }, Env: map[string]string{ - "TRUE": "true", - "FALSE": "false", + "TRUE": "true", + "FALSE": "false", "SOME_TEXT": "text", }, Run: &model.Run{ @@ -52,8 +52,8 @@ func TestRunContext_EvalBool(t *testing.T) { rc.ExprEval = rc.NewExpressionEvaluator() tables := []struct { - in string - out bool + in string + out bool }{ // The basic ones {"true", true},