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:
parent
b3b8961122
commit
e698e8b324
4 changed files with 60 additions and 4 deletions
|
@ -17,6 +17,7 @@ type Workflow struct {
|
||||||
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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
29
pkg/runner/testdata/defaults-run/main.yaml
vendored
Normal file
29
pkg/runner/testdata/defaults-run/main.yaml
vendored
Normal 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
|
Loading…
Reference in a new issue