diff --git a/act/artifactcache/handler.go b/act/artifactcache/handler.go index c48bb1a9..28bacec5 100644 --- a/act/artifactcache/handler.go +++ b/act/artifactcache/handler.go @@ -431,7 +431,12 @@ func findCache(db *bolthold.Store, repo string, keys []string, version string) ( return nil, fmt.Errorf("find cache: %w", err) } return cache, nil + } else if cache.Complete { + return cache, nil } + } + + for _, prefix := range keys { prefixPattern := fmt.Sprintf("^%s", regexp.QuoteMeta(prefix)) re, err := regexp.Compile(prefixPattern) if err != nil { diff --git a/act/container/docker_run.go b/act/container/docker_run.go index d7f54d35..02e4dbfb 100644 --- a/act/container/docker_run.go +++ b/act/container/docker_run.go @@ -776,7 +776,7 @@ func (cr *containerReference) CopyTarStream(ctx context.Context, destPath string tw := tar.NewWriter(buf) _ = tw.WriteHeader(&tar.Header{ Name: destPath, - Mode: 777, + Mode: 0o777, Typeflag: tar.TypeDir, }) tw.Close() diff --git a/act/container/docker_run_test.go b/act/container/docker_run_test.go index 7383864a..14af789f 100644 --- a/act/container/docker_run_test.go +++ b/act/container/docker_run_test.go @@ -2,7 +2,9 @@ package container import ( "bufio" + "bytes" "context" + "fmt" "io" "net" "strings" @@ -83,6 +85,11 @@ func (m *mockDockerClient) ContainerExecInspect(ctx context.Context, execID stri return args.Get(0).(types.ContainerExecInspect), args.Error(1) } +func (m *mockDockerClient) CopyToContainer(ctx context.Context, id string, path string, content io.Reader, options types.CopyToContainerOptions) error { + args := m.Called(ctx, id, path, content, options) + return args.Error(0) +} + type endlessReader struct { io.Reader } @@ -173,6 +180,78 @@ func TestDockerExecFailure(t *testing.T) { client.AssertExpectations(t) } +func TestDockerCopyTarStream(t *testing.T) { + ctx := context.Background() + + conn := &mockConn{} + + client := &mockDockerClient{} + client.On("CopyToContainer", ctx, "123", "/", mock.Anything, mock.AnythingOfType("types.CopyToContainerOptions")).Return(nil) + client.On("CopyToContainer", ctx, "123", "/var/run/act", mock.Anything, mock.AnythingOfType("types.CopyToContainerOptions")).Return(nil) + cr := &containerReference{ + id: "123", + cli: client, + input: &NewContainerInput{ + Image: "image", + }, + } + + _ = cr.CopyTarStream(ctx, "/var/run/act", &bytes.Buffer{}) + + conn.AssertExpectations(t) + client.AssertExpectations(t) +} + +func TestDockerCopyTarStreamErrorInCopyFiles(t *testing.T) { + ctx := context.Background() + + conn := &mockConn{} + + merr := fmt.Errorf("Failure") + + client := &mockDockerClient{} + client.On("CopyToContainer", ctx, "123", "/", mock.Anything, mock.AnythingOfType("types.CopyToContainerOptions")).Return(merr) + client.On("CopyToContainer", ctx, "123", "/", mock.Anything, mock.AnythingOfType("types.CopyToContainerOptions")).Return(merr) + cr := &containerReference{ + id: "123", + cli: client, + input: &NewContainerInput{ + Image: "image", + }, + } + + err := cr.CopyTarStream(ctx, "/var/run/act", &bytes.Buffer{}) + assert.ErrorIs(t, err, merr) + + conn.AssertExpectations(t) + client.AssertExpectations(t) +} + +func TestDockerCopyTarStreamErrorInMkdir(t *testing.T) { + ctx := context.Background() + + conn := &mockConn{} + + merr := fmt.Errorf("Failure") + + client := &mockDockerClient{} + client.On("CopyToContainer", ctx, "123", "/", mock.Anything, mock.AnythingOfType("types.CopyToContainerOptions")).Return(nil) + client.On("CopyToContainer", ctx, "123", "/var/run/act", mock.Anything, mock.AnythingOfType("types.CopyToContainerOptions")).Return(merr) + cr := &containerReference{ + id: "123", + cli: client, + input: &NewContainerInput{ + Image: "image", + }, + } + + err := cr.CopyTarStream(ctx, "/var/run/act", &bytes.Buffer{}) + assert.ErrorIs(t, err, merr) + + conn.AssertExpectations(t) + client.AssertExpectations(t) +} + // Type assert containerReference implements ExecutionsEnvironment var _ ExecutionsEnvironment = &containerReference{} diff --git a/act/model/workflow.go b/act/model/workflow.go index 7b28ceb0..6d068e95 100644 --- a/act/model/workflow.go +++ b/act/model/workflow.go @@ -367,7 +367,7 @@ func environment(yml yaml.Node) map[string]string { return env } -// Environments returns string-based key=value map for a job +// Environment returns string-based key=value map for a job func (j *Job) Environment() map[string]string { return environment(j.Env) } @@ -604,7 +604,7 @@ func (s *Step) String() string { return s.ID } -// Environments returns string-based key=value map for a step +// Environment returns string-based key=value map for a step func (s *Step) Environment() map[string]string { return environment(s.Env) } diff --git a/act/runner/expression.go b/act/runner/expression.go index ae3f145c..ef89fceb 100644 --- a/act/runner/expression.go +++ b/act/runner/expression.go @@ -106,7 +106,7 @@ func (rc *RunContext) NewExpressionEvaluatorWithEnv(ctx context.Context, env map //go:embed hashfiles/index.js var hashfiles string -// NewExpressionEvaluator creates a new evaluator +// NewStepExpressionEvaluator creates a new evaluator func (rc *RunContext) NewStepExpressionEvaluator(ctx context.Context, step step) ExpressionEvaluator { // todo: cleanup EvaluationEnvironment creation job := rc.Run.Job() diff --git a/act/runner/logger.go b/act/runner/logger.go index 68902931..ef93a02b 100644 --- a/act/runner/logger.go +++ b/act/runner/logger.go @@ -52,7 +52,7 @@ func Masks(ctx context.Context) *[]string { return &[]string{} } -// WithLogger adds a value to the context for the logger +// WithMasks adds a value to the context for the logger func WithMasks(ctx context.Context, masks *[]string) context.Context { return context.WithValue(ctx, masksContextKeyVal, masks) }