diff --git a/act/container/docker_run.go b/act/container/docker_run.go index 190ee052..8dde8589 100644 --- a/act/container/docker_run.go +++ b/act/container/docker_run.go @@ -52,6 +52,7 @@ type NewContainerInput struct { Privileged bool UsernsMode string Platform string + Hostname string } // FileEntry is a file to copy to a container @@ -302,6 +303,7 @@ func (cr *containerReference) create(capAdd []string, capDrop []string) common.E WorkingDir: input.WorkingDir, Env: input.Env, Tty: isTerminal, + Hostname: input.Hostname, } mounts := make([]mount.Mount, 0) diff --git a/act/runner/run_context.go b/act/runner/run_context.go index c736ed17..79e7d917 100755 --- a/act/runner/run_context.go +++ b/act/runner/run_context.go @@ -11,6 +11,9 @@ import ( "runtime" "strings" + "github.com/google/shlex" + "github.com/spf13/pflag" + "github.com/mitchellh/go-homedir" log "github.com/sirupsen/logrus" @@ -96,6 +99,7 @@ func (rc *RunContext) GetBindsAndMounts() ([]string, map[string]string) { func (rc *RunContext) startJobContainer() common.Executor { image := rc.platformImage() + hostname := rc.hostname() return func(ctx context.Context) error { rawLogger := common.Logger(ctx).WithField("raw_output", true) @@ -136,6 +140,7 @@ func (rc *RunContext) startJobContainer() common.Executor { Privileged: rc.Config.Privileged, UsernsMode: rc.Config.UsernsMode, Platform: rc.Config.ContainerArchitecture, + Hostname: hostname, }) var copyWorkspace bool @@ -304,6 +309,28 @@ func (rc *RunContext) platformImage() string { return "" } +func (rc *RunContext) hostname() string { + job := rc.Run.Job() + c := job.Container() + if c == nil { + return "" + } + + optionsFlags := pflag.NewFlagSet("container_options", pflag.ContinueOnError) + hostname := optionsFlags.StringP("hostname", "h", "", "") + optionsArgs, err := shlex.Split(c.Options) + if err != nil { + log.Warnf("Cannot parse container options: %s", c.Options) + return "" + } + err = optionsFlags.Parse(optionsArgs) + if err != nil { + log.Warnf("Cannot parse container options: %s", c.Options) + return "" + } + return *hostname +} + func (rc *RunContext) isEnabled(ctx context.Context) bool { job := rc.Run.Job() l := common.Logger(ctx) diff --git a/act/runner/runner_test.go b/act/runner/runner_test.go index 85245c99..d0e8fe50 100644 --- a/act/runner/runner_test.go +++ b/act/runner/runner_test.go @@ -103,6 +103,7 @@ func TestRunEvent(t *testing.T) { {"testdata", "shells/sh", "push", "", platforms, ""}, {"testdata", "job-container", "push", "", platforms, ""}, {"testdata", "job-container-non-root", "push", "", platforms, ""}, + {"testdata", "container-hostname", "push", "", platforms, ""}, {"testdata", "uses-docker-url", "push", "", platforms, ""}, {"testdata", "remote-action-docker", "push", "", platforms, ""}, {"testdata", "remote-action-js", "push", "", platforms, ""}, diff --git a/act/runner/testdata/container-hostname/push.yml b/act/runner/testdata/container-hostname/push.yml new file mode 100644 index 00000000..ab055cb2 --- /dev/null +++ b/act/runner/testdata/container-hostname/push.yml @@ -0,0 +1,20 @@ +name: container-hostname +on: push + +jobs: + with-hostname: + runs-on: ubuntu-latest + container: + image: node:12-buster-slim + options: "--hostname my.host.local" + steps: + - run: | + [[ $(uname -n) == "my.host.local" ]] + + default-hostname: + runs-on: ubuntu-latest + container: + image: node:12-buster-slim + steps: + - run: | + [[ $(uname -n) ]] && [[ $(uname -n) != "my.host.local" ]]