diff --git a/act/container/macos_vm_environment.go b/act/container/macos_vm_environment.go index 4e30c74c..d9629ae1 100644 --- a/act/container/macos_vm_environment.go +++ b/act/container/macos_vm_environment.go @@ -164,7 +164,7 @@ func (e *MacOSVMEnvironment) CopyDir(destPath, srcPath string, useGitIgnore bool writeDone <- err }() - script := `mkdir -p "$1" && /usr/bin/tar -xf - -C "$1"` + script := `export COPYFILE_DISABLE=1; mkdir -p "$1" && /usr/bin/tar -xf - -C "$1"` cmdErr := e.runExecutor(ctx, pipeReader, e.Stdout, e.Stderr, "exec", "--stdin", e.VMName, "/bin/sh", "-c", script, "sh", destPath) _ = pipeReader.Close() writeErr := <-writeDone @@ -203,7 +203,7 @@ func (e *MacOSVMEnvironment) GetContainerArchive(ctx context.Context, srcPath st if common.Dryrun(ctx) { return nil, errors.New("DRYRUN is not supported in GetContainerArchive") } - cmd := exec.CommandContext(ctx, e.executorPath, "exec", e.VMName, "/usr/bin/tar", "-cf", "-", srcPath) + cmd := exec.CommandContext(ctx, e.executorPath, "exec", e.VMName, "/usr/bin/env", "COPYFILE_DISABLE=1", "/usr/bin/tar", "-cf", "-", srcPath) stdout, err := cmd.StdoutPipe() if err != nil { return nil, err @@ -277,7 +277,7 @@ func (e *MacOSVMEnvironment) waitReady(ctx context.Context) error { var lastErr error for { - if err := e.runExecutor(ctx, nil, io.Discard, io.Discard, "exec", e.VMName, "/bin/true"); err == nil { + if err := e.runExecutor(ctx, nil, io.Discard, io.Discard, "exec", e.VMName, "/usr/bin/true"); err == nil { return nil } else { lastErr = err diff --git a/act/container/macos_vm_environment_integration_test.go b/act/container/macos_vm_environment_integration_test.go index b3d3f041..c6bf8f4c 100644 --- a/act/container/macos_vm_environment_integration_test.go +++ b/act/container/macos_vm_environment_integration_test.go @@ -34,13 +34,17 @@ func TestMacOSVMEnvironmentIntegration(t *testing.T) { ctx := context.Background() vmName := fmt.Sprintf("gitea-runner-test-%d", time.Now().UnixNano()) + base := "/Users/admin/runner" + if os.Getenv("RUNNER_EXECUTOR_MACOS_DEV_MODE") == "1" { + base = t.TempDir() + } env, err := NewMacOSVMEnvironment(MacOSVMEnvironmentInput{ - Path: "/Users/admin/runner/scratch/" + vmName, - TmpDir: "/Users/admin/runner/scratch/" + vmName + "/tmp", - ToolCache: "/Users/admin/runner/scratch/" + vmName + "/tool_cache", + Path: base + "/scratch/" + vmName, + TmpDir: base + "/scratch/" + vmName + "/tmp", + ToolCache: base + "/scratch/" + vmName + "/tool_cache", Workdir: t.TempDir(), - GuestWorkdir: "/Users/admin/runner/workspace/" + vmName, - ActPath: "/Users/admin/runner/scratch/" + vmName + "/act", + GuestWorkdir: base + "/workspace/" + vmName, + ActPath: base + "/scratch/" + vmName + "/act", Image: image, VMName: vmName, ExecutorPath: "runner-executor-macos", @@ -55,6 +59,7 @@ func TestMacOSVMEnvironmentIntegration(t *testing.T) { require.NoError(t, env.Create(nil, nil)(ctx)) require.NoError(t, env.Start(false)(ctx)) + require.NoError(t, os.MkdirAll(env.GuestWorkdir, 0o755)) require.NoError(t, env.Copy("/tmp", &FileEntry{ Name: "gitea-runner-macos.txt", diff --git a/act/runner/run_context.go b/act/runner/run_context.go index 07d6d4fc..b31f2e50 100644 --- a/act/runner/run_context.go +++ b/act/runner/run_context.go @@ -494,6 +494,7 @@ func (rc *RunContext) startMacOSVMEnvironment() common.Executor { jobContainer.Pull(rc.Config.ForcePull), jobContainer.Create(nil, nil), jobContainer.Start(false), + jobContainer.Exec([]string{"/bin/mkdir", "-p", guestWorkdir, actPath, tmpDir, toolCache}, nil, "", "/"), rc.captureJobContainerInfo(), jobContainer.Copy(jobContainer.GetActPath()+"/", &container.FileEntry{ Name: "workflow/event.json",