From e9ae7894e38ed276c41e6cd7b958a81da79249ad Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 3 Nov 2021 19:47:47 +0100 Subject: [PATCH] fix: set `sh` as default shell for containers (#853) * fix: set default shell for containers to sh This matches GitHub Actions behaviour where, runners use bash since it's guaranteed to exist there while containers use sh for compatibility * tests: fixup for default shell --- pkg/runner/runner_test.go | 1 + pkg/runner/step_context.go | 6 ++++++ .../testdata/container-hostname/push.yml | 4 ++++ pkg/runner/testdata/shells/bash/push.yml | 17 +++++++++++++-- pkg/runner/testdata/shells/defaults/push.yml | 21 +++++++++++++++++++ pkg/runner/testdata/shells/pwsh/push.yml | 7 +++++++ pkg/runner/testdata/shells/python/push.yml | 8 +++++++ pkg/runner/testdata/shells/sh/push.yml | 15 ++++++++++++- 8 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 pkg/runner/testdata/shells/defaults/push.yml diff --git a/pkg/runner/runner_test.go b/pkg/runner/runner_test.go index d0e8fe5..aacf433 100644 --- a/pkg/runner/runner_test.go +++ b/pkg/runner/runner_test.go @@ -97,6 +97,7 @@ func TestRunEvent(t *testing.T) { {"testdata", "fail", "push", "exit with `FAILURE`: 1", platforms, ""}, {"testdata", "runs-on", "push", "", platforms, ""}, {"testdata", "checkout", "push", "", platforms, ""}, + {"testdata", "shells/defaults", "push", "", platforms, ""}, {"testdata", "shells/pwsh", "push", "", map[string]string{"ubuntu-latest": "ghcr.io/justingrote/act-pwsh:latest"}, ""}, // custom image with pwsh {"testdata", "shells/bash", "push", "", platforms, ""}, {"testdata", "shells/python", "push", "", map[string]string{"ubuntu-latest": "node:12-buster"}, ""}, // slim doesn't have python diff --git a/pkg/runner/step_context.go b/pkg/runner/step_context.go index dca156c..b06df3e 100644 --- a/pkg/runner/step_context.go +++ b/pkg/runner/step_context.go @@ -183,6 +183,7 @@ func (sc *StepContext) setupEnv(ctx context.Context) (ExpressionEvaluator, error return evaluator, nil } +// nolint:gocyclo func (sc *StepContext) setupShellCommand() common.Executor { rc := sc.RunContext step := sc.Step @@ -237,6 +238,11 @@ func (sc *StepContext) setupShellCommand() common.Executor { if step.Shell == "" { step.Shell = rc.Run.Workflow.Defaults.Run.Shell } + if rc.Run.Job().Container() != nil { + if rc.Run.Job().Container().Image != "" && step.Shell == "" { + step.Shell = "sh" + } + } scCmd := step.ShellCommand() var finalCMD []string diff --git a/pkg/runner/testdata/container-hostname/push.yml b/pkg/runner/testdata/container-hostname/push.yml index ab055cb..b3209eb 100644 --- a/pkg/runner/testdata/container-hostname/push.yml +++ b/pkg/runner/testdata/container-hostname/push.yml @@ -1,6 +1,10 @@ name: container-hostname on: push +defaults: + run: + shell: bash + jobs: with-hostname: runs-on: ubuntu-latest diff --git a/pkg/runner/testdata/shells/bash/push.yml b/pkg/runner/testdata/shells/bash/push.yml index 084402b..7032899 100644 --- a/pkg/runner/testdata/shells/bash/push.yml +++ b/pkg/runner/testdata/shells/bash/push.yml @@ -5,6 +5,19 @@ jobs: steps: - shell: bash run: | - if [[ -n "$PATH" ]] ; then - echo "I'm Bash!" + if [[ -n "$BASH" ]]; then + echo "I'm $BASH!" + else + exit 1 + fi + check-container: + runs-on: ubuntu-latest + container: node:12-buster-slim + steps: + - shell: bash + run: | + if [[ -n "$BASH" ]]; then + echo "I'm $BASH!" + else + exit 1 fi diff --git a/pkg/runner/testdata/shells/defaults/push.yml b/pkg/runner/testdata/shells/defaults/push.yml new file mode 100644 index 0000000..0b0204a --- /dev/null +++ b/pkg/runner/testdata/shells/defaults/push.yml @@ -0,0 +1,21 @@ +on: push +jobs: + check: # GHA uses `bash` as default for runners + runs-on: ubuntu-latest + steps: + - run: | + if [[ -n "$BASH" ]]; then + echo "I'm $BASH!" + else + exit 1 + fi + check-container: # GHA uses `sh` as default for containers + runs-on: ubuntu-latest + container: alpine:latest + steps: + - run: | + if [ -z ${BASH+x} ]; then + echo "I'm sh!" + else + exit 1 + fi diff --git a/pkg/runner/testdata/shells/pwsh/push.yml b/pkg/runner/testdata/shells/pwsh/push.yml index 23095f8..0aa89f7 100644 --- a/pkg/runner/testdata/shells/pwsh/push.yml +++ b/pkg/runner/testdata/shells/pwsh/push.yml @@ -6,3 +6,10 @@ jobs: - shell: pwsh run: | $PSVersionTable + check-container: + runs-on: ubuntu-latest + container: ghcr.io/justingrote/act-pwsh:latest + steps: + - shell: pwsh + run: | + $PSVersionTable diff --git a/pkg/runner/testdata/shells/python/push.yml b/pkg/runner/testdata/shells/python/push.yml index 7d1b31a..19870c4 100644 --- a/pkg/runner/testdata/shells/python/push.yml +++ b/pkg/runner/testdata/shells/python/push.yml @@ -7,3 +7,11 @@ jobs: run: | import platform print(platform.python_version()) + check-container: + runs-on: ubuntu-latest + container: node:12-buster + steps: + - shell: python + run: | + import platform + print(platform.python_version()) diff --git a/pkg/runner/testdata/shells/sh/push.yml b/pkg/runner/testdata/shells/sh/push.yml index f308e1a..0c752be 100644 --- a/pkg/runner/testdata/shells/sh/push.yml +++ b/pkg/runner/testdata/shells/sh/push.yml @@ -5,6 +5,19 @@ jobs: steps: - shell: sh run: | - if [ -n "$PATH" ] ; then + if [ -z ${BASH+x} ]; then echo "I'm sh!" + else + exit 1 + fi + check-container: + runs-on: ubuntu-latest + container: alpine:latest + steps: + - shell: sh + run: | + if [ -z ${BASH+x} ]; then + echo "I'm sh!" + else + exit 1 fi