fix: return error if both run:/uses: keys are used (#593)

fixes https://github.com/nektos/act/issues/536
This commit is contained in:
hackercat 2021-04-01 20:36:41 +02:00 committed by GitHub
parent 5752a03dcd
commit 25779af4bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 2 deletions

View file

@ -292,11 +292,17 @@ const (
// StepTypeUsesActionRemote is all steps that have a `uses` that is a reference to a github repo // StepTypeUsesActionRemote is all steps that have a `uses` that is a reference to a github repo
StepTypeUsesActionRemote StepTypeUsesActionRemote
// StepTypeInvalid is for steps that have invalid step action
StepTypeInvalid
) )
// Type returns the type of the step // Type returns the type of the step
func (s *Step) Type() StepType { func (s *Step) Type() StepType {
if s.Run != "" { if s.Run != "" {
if s.Uses != "" {
return StepTypeInvalid
}
return StepTypeRun return StepTypeRun
} else if strings.HasPrefix(s.Uses, "docker://") { } else if strings.HasPrefix(s.Uses, "docker://") {
return StepTypeUsesDockerURL return StepTypeUsesDockerURL

View file

@ -49,7 +49,7 @@ jobs:
func TestReadWorkflow_MapEvent(t *testing.T) { func TestReadWorkflow_MapEvent(t *testing.T) {
yaml := ` yaml := `
name: local-action-docker-url name: local-action-docker-url
on: on:
push: push:
branches: branches:
- master - master
@ -82,7 +82,7 @@ jobs:
steps: steps:
- uses: ./actions/docker-url - uses: ./actions/docker-url
test2: test2:
container: container:
image: nginx:latest image: nginx:latest
env: env:
foo: bar foo: bar
@ -98,3 +98,35 @@ jobs:
assert.Contains(t, workflow.Jobs["test2"].Container().Image, "nginx:latest") assert.Contains(t, workflow.Jobs["test2"].Container().Image, "nginx:latest")
assert.Contains(t, workflow.Jobs["test2"].Container().Env["foo"], "bar") assert.Contains(t, workflow.Jobs["test2"].Container().Env["foo"], "bar")
} }
func TestReadWorkflow_StepsTypes(t *testing.T) {
yaml := `
name: invalid step definition
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: test1
uses: actions/checkout@v2
run: echo
- name: test2
run: echo
- name: test3
uses: actions/checkout@v2
- name: test4
uses: docker://nginx:latest
- name: test5
uses: ./local-action
`
workflow, err := ReadWorkflow(strings.NewReader(yaml))
assert.NoError(t, err, "read workflow should succeed")
assert.Len(t, workflow.Jobs, 1)
assert.Len(t, workflow.Jobs["test"].Steps, 5)
assert.Equal(t, workflow.Jobs["test"].Steps[0].Type(), StepTypeInvalid)
assert.Equal(t, workflow.Jobs["test"].Steps[1].Type(), StepTypeRun)
assert.Equal(t, workflow.Jobs["test"].Steps[2].Type(), StepTypeUsesActionRemote)
assert.Equal(t, workflow.Jobs["test"].Steps[3].Type(), StepTypeUsesDockerURL)
assert.Equal(t, workflow.Jobs["test"].Steps[4].Type(), StepTypeUsesActionLocal)
}

View file

@ -87,6 +87,8 @@ func (sc *StepContext) Executor() common.Executor {
sc.setupAction(actionDir, remoteAction.Path), sc.setupAction(actionDir, remoteAction.Path),
sc.runAction(actionDir, remoteAction.Path), sc.runAction(actionDir, remoteAction.Path),
) )
case model.StepTypeInvalid:
return common.NewErrorExecutor(fmt.Errorf("Invalid run/uses syntax for job:%s step:%+v", rc.Run, step))
} }
return common.NewErrorExecutor(fmt.Errorf("Unable to determine how to run job:%s step:%+v", rc.Run, step)) return common.NewErrorExecutor(fmt.Errorf("Unable to determine how to run job:%s step:%+v", rc.Run, step))

View file

@ -12,10 +12,13 @@ func TestStepContextExecutor(t *testing.T) {
"ubuntu-latest": "node:12.20.1-buster-slim", "ubuntu-latest": "node:12.20.1-buster-slim",
} }
tables := []TestJobFileInfo{ tables := []TestJobFileInfo{
{"testdata", "uses-and-run-in-one-step", "push", "Invalid run/uses syntax for job:test step:Test", platforms, "linux/amd64"},
{"testdata", "uses-github-empty", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/amd64"}, {"testdata", "uses-github-empty", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/amd64"},
{"testdata", "uses-github-noref", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/amd64"}, {"testdata", "uses-github-noref", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/amd64"},
{"testdata", "uses-github-root", "push", "", platforms, "linux/amd64"}, {"testdata", "uses-github-root", "push", "", platforms, "linux/amd64"},
{"testdata", "uses-github-path", "push", "", platforms, "linux/amd64"}, {"testdata", "uses-github-path", "push", "", platforms, "linux/amd64"},
{"testdata", "uses-and-run-in-one-step", "push", "Invalid run/uses syntax for job:test step:Test", platforms, "linux/arm64"},
{"testdata", "uses-github-empty", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/arm64"}, {"testdata", "uses-github-empty", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/arm64"},
{"testdata", "uses-github-noref", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/arm64"}, {"testdata", "uses-github-noref", "push", "Expected format {org}/{repo}[/path]@ref", platforms, "linux/arm64"},
{"testdata", "uses-github-root", "push", "", platforms, "linux/arm64"}, {"testdata", "uses-github-root", "push", "", platforms, "linux/arm64"},

View file

@ -0,0 +1,10 @@
name: uses-and-run-in-one-step
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Test
run: echo
uses: actions/checkout@v2