diff --git a/pkg/runner/action.go b/pkg/runner/action.go index e004aafc..701696a2 100644 --- a/pkg/runner/action.go +++ b/pkg/runner/action.go @@ -382,13 +382,18 @@ func newStepContainer(ctx context.Context, step step, image string, cmd []string binds, mounts := rc.GetBindsAndMounts() networkMode := fmt.Sprintf("container:%s", rc.jobContainerName()) + var workdir string if rc.IsHostEnv(ctx) { networkMode = "default" + ext := container.LinuxContainerEnvironmentExtensions{} + workdir = ext.ToContainerPath(rc.Config.Workdir) + } else { + workdir = rc.JobContainer.ToContainerPath(rc.Config.Workdir) } stepContainer := container.NewContainer(&container.NewContainerInput{ Cmd: cmd, Entrypoint: entrypoint, - WorkingDir: rc.JobContainer.ToContainerPath(rc.Config.Workdir), + WorkingDir: workdir, Image: image, Username: rc.Config.Secrets["DOCKER_USERNAME"], Password: rc.Config.Secrets["DOCKER_PASSWORD"], diff --git a/pkg/runner/run_context.go b/pkg/runner/run_context.go index 89d2551c..bc9f8ee0 100644 --- a/pkg/runner/run_context.go +++ b/pkg/runner/run_context.go @@ -139,6 +139,14 @@ func (rc *RunContext) GetBindsAndMounts() ([]string, map[string]string) { ext := container.LinuxContainerEnvironmentExtensions{} + if hostEnv, ok := rc.JobContainer.(*container.HostEnvironment); ok { + mounts := map[string]string{} + // Permission issues? + // binds = append(binds, hostEnv.ToolCache+":/opt/hostedtoolcache") + binds = append(binds, hostEnv.GetActPath()+":"+ext.GetActPath()) + binds = append(binds, hostEnv.ToContainerPath(rc.Config.Workdir)+":"+ext.ToContainerPath(rc.Config.Workdir)) + return binds, mounts + } mounts := map[string]string{ "act-toolcache": "/opt/hostedtoolcache", name + "-env": ext.GetActPath(), diff --git a/pkg/runner/runner_test.go b/pkg/runner/runner_test.go index 252c56d7..5fa2283b 100644 --- a/pkg/runner/runner_test.go +++ b/pkg/runner/runner_test.go @@ -38,6 +38,7 @@ func init() { platforms = map[string]string{ "ubuntu-latest": baseImage, + "self-hosted": "-self-hosted", } if l := os.Getenv("ACT_TEST_LOG_LEVEL"); l != "" { @@ -325,6 +326,9 @@ func TestRunEvent(t *testing.T) { // local remote action overrides {workdir, "local-remote-action-overrides", "push", "", platforms, secrets}, + + // docker action on host executor + {workdir, "docker-action-host-env", "push", "", platforms, secrets}, } for _, table := range tables { diff --git a/pkg/runner/testdata/docker-action-host-env/action/Dockerfile b/pkg/runner/testdata/docker-action-host-env/action/Dockerfile new file mode 100644 index 00000000..d1acc28f --- /dev/null +++ b/pkg/runner/testdata/docker-action-host-env/action/Dockerfile @@ -0,0 +1,13 @@ +FROM debian:bullseye-slim + +# Install dependencies +RUN apt-get update && apt-get install -y \ + curl \ + && apt-get clean + +# Copy the entrypoint script +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +# Set the entrypoint +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/pkg/runner/testdata/docker-action-host-env/action/action.yml b/pkg/runner/testdata/docker-action-host-env/action/action.yml new file mode 100644 index 00000000..360862c0 --- /dev/null +++ b/pkg/runner/testdata/docker-action-host-env/action/action.yml @@ -0,0 +1,12 @@ +name: "Hello World Docker Action" +description: "A simple Docker action that prints Hello, World! and environment variables." +inputs: + who-to-greet: + description: "Who to greet" + required: false + default: "World" +runs: + using: "docker" + image: "Dockerfile" + args: + - ${{ inputs.who-to-greet }} \ No newline at end of file diff --git a/pkg/runner/testdata/docker-action-host-env/action/entrypoint.sh b/pkg/runner/testdata/docker-action-host-env/action/entrypoint.sh new file mode 100644 index 00000000..d526a7ac --- /dev/null +++ b/pkg/runner/testdata/docker-action-host-env/action/entrypoint.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +# Print a greeting +echo "Hello, $1!" + +# Print all environment variables +echo "Environment Variables:" +env + +ls -la "$PWD" +ls -la "$PWD/docker-action-host-env" + +if [ -f "$PWD/docker-action-host-env/Dockerfile" ]; then + echo "Dockerfile exists in workspace." +else + echo "Dockerfile does not exist in workspace." +fi diff --git a/pkg/runner/testdata/docker-action-host-env/push.yml b/pkg/runner/testdata/docker-action-host-env/push.yml new file mode 100644 index 00000000..3139ba2e --- /dev/null +++ b/pkg/runner/testdata/docker-action-host-env/push.yml @@ -0,0 +1,15 @@ +name: Hello World Docker Action Workflow + +on: [push] + +jobs: + hello_world_job: + runs-on: self-hosted + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Run Hello World Docker Action + uses: ./docker-action-host-env/action + with: + who-to-greet: "GitHub" diff --git a/pkg/runner/testdata/uses-nested-composite/push.yml b/pkg/runner/testdata/uses-nested-composite/push.yml index b7de1fb8..61262b21 100644 --- a/pkg/runner/testdata/uses-nested-composite/push.yml +++ b/pkg/runner/testdata/uses-nested-composite/push.yml @@ -1,4 +1,4 @@ -name: uses-docker-url +name: uses-nested-composite on: push jobs: