Support setting shell via defaults.run (#343)

Note that we don't support the more general use of defaults, just its
run key for setting shell and working directory.

The documentation for defaults.run is here:
  https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#defaultsrun

Fixes #214.

Co-authored-by: Casey Lee <cplee@nektos.com>
This commit is contained in:
Julian Squires 2020-08-28 16:22:25 -02:30 committed by GitHub
parent b3b8961122
commit e698e8b324
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 4 deletions

View file

@ -13,10 +13,11 @@ import (
// Workflow is the structure of the files in .github/workflows // Workflow is the structure of the files in .github/workflows
type Workflow struct { type Workflow struct {
Name string `yaml:"name"` Name string `yaml:"name"`
RawOn yaml.Node `yaml:"on"` RawOn yaml.Node `yaml:"on"`
Env map[string]string `yaml:"env"` Env map[string]string `yaml:"env"`
Jobs map[string]*Job `yaml:"jobs"` Jobs map[string]*Job `yaml:"jobs"`
Defaults Defaults `yaml:"defaults"`
} }
// On events for the workflow // On events for the workflow
@ -64,6 +65,7 @@ type Job struct {
Services map[string]*ContainerSpec `yaml:"services"` Services map[string]*ContainerSpec `yaml:"services"`
Strategy *Strategy `yaml:"strategy"` Strategy *Strategy `yaml:"strategy"`
RawContainer yaml.Node `yaml:"container"` RawContainer yaml.Node `yaml:"container"`
Defaults Defaults `yaml:"defaults"`
} }
// Strategy for the job // Strategy for the job
@ -73,6 +75,17 @@ type Strategy struct {
Matrix map[string][]interface{} `yaml:"matrix"` Matrix map[string][]interface{} `yaml:"matrix"`
} }
// Default settings that will apply to all steps in the job or workflow
type Defaults struct {
Run RunDefaults `yaml:"run"`
}
// Defaults for all run steps in the job or workflow
type RunDefaults struct {
Shell string `yaml:"shell"`
WorkingDirectory string `yaml:"working-directory"`
}
// Container details for the job // Container details for the job
func (j *Job) Container() *ContainerSpec { func (j *Job) Container() *ContainerSpec {
var val *ContainerSpec var val *ContainerSpec

View file

@ -55,6 +55,7 @@ func TestRunEvent(t *testing.T) {
{"commands", "push", ""}, {"commands", "push", ""},
{"workdir", "push", ""}, {"workdir", "push", ""},
{"issue-228", "push", ""}, // TODO [igni]: Remove this once everything passes {"issue-228", "push", ""}, // TODO [igni]: Remove this once everything passes
{"defaults-run", "push", ""},
} }
log.SetLevel(log.DebugLevel) log.SetLevel(log.DebugLevel)

View file

@ -111,6 +111,12 @@ func (sc *StepContext) setupShellCommand() common.Executor {
return err return err
} }
if step.WorkingDirectory == "" {
step.WorkingDirectory = rc.Run.Job().Defaults.Run.WorkingDirectory
}
if step.WorkingDirectory == "" {
step.WorkingDirectory = rc.Run.Workflow.Defaults.Run.WorkingDirectory
}
if step.WorkingDirectory != "" { if step.WorkingDirectory != "" {
_, err = script.WriteString(fmt.Sprintf("cd %s\n", step.WorkingDirectory)) _, err = script.WriteString(fmt.Sprintf("cd %s\n", step.WorkingDirectory))
if err != nil { if err != nil {
@ -126,6 +132,13 @@ func (sc *StepContext) setupShellCommand() common.Executor {
scriptName := fmt.Sprintf("workflow/%s", step.ID) scriptName := fmt.Sprintf("workflow/%s", step.ID)
log.Debugf("Wrote command '%s' to '%s'", run, scriptName) log.Debugf("Wrote command '%s' to '%s'", run, scriptName)
containerPath := fmt.Sprintf("/github/%s", scriptName) containerPath := fmt.Sprintf("/github/%s", scriptName)
if step.Shell == "" {
step.Shell = rc.Run.Job().Defaults.Run.Shell
}
if step.Shell == "" {
step.Shell = rc.Run.Workflow.Defaults.Run.Shell
}
sc.Cmd = strings.Fields(strings.Replace(step.ShellCommand(), "{0}", containerPath, 1)) sc.Cmd = strings.Fields(strings.Replace(step.ShellCommand(), "{0}", containerPath, 1))
return rc.JobContainer.Copy("/github/", &container.FileEntry{ return rc.JobContainer.Copy("/github/", &container.FileEntry{
Name: scriptName, Name: scriptName,

View file

@ -0,0 +1,29 @@
name: defaults-run
on:
- push
defaults:
run:
shell: sh
jobs:
without-defaults:
runs-on: ubuntu-latest
steps:
- run: echo $SHELL | grep -v bash || exit 1
with-defaults:
runs-on: ubuntu-latest
defaults:
run:
shell: bash
working-directory: /tmp
steps:
- run: |
echo $SHELL | grep bash || exit 1
[ $(pwd) = /tmp ] || exit 2
override-in-step:
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- run: echo $SHELL | grep -v bash || exit 1
shell: sh