Compare commits

...
Sign in to create a new pull request.

9 commits

Author SHA1 Message Date
earl-warren
0ccd4cda9a Merge pull request 'fix: return an error when the argument count is wrong' (#59) from earl-warren/act:wip-arg-count into main
Reviewed-on: https://code.forgejo.org/forgejo/act/pulls/59
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-10-31 15:34:31 +00:00
Earl Warren
b1b9df5ef4
fix: return an error when the argument count is wrong
Closes forgejo/runner#307
2024-10-31 16:02:17 +01:00
earl-warren
8084844bf1 Merge pull request 'fix: debug is leaking host container and network names' (#58) from earl-warren/act:wip-debug into main
Reviewed-on: https://code.forgejo.org/forgejo/act/pulls/58
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-10-19 08:07:19 +00:00
Earl Warren
f19b377e2d
fix: debug is leaking host container and network names
Closes forgejo/runner#295
2024-10-19 08:48:50 +02:00
earl-warren
98d572ee58 Merge pull request '[FORGEJO] when a workflow decode error happen, log and do not crash' (#54) from earl-warren/act:wip-decode-fatal into main
Reviewed-on: https://code.forgejo.org/forgejo/act/pulls/54
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-09-15 16:35:43 +00:00
Earl Warren
a7db265415
[FORGEJO] when a workflow decode error happen, log and do not crash 2024-09-15 15:46:01 +02:00
Michael Kriese
d301a5b66a
chore(renovate): disable runner test data 2024-08-27 08:28:32 +02:00
earl-warren
73e39f1d49 Merge pull request 'chore: only run tests on main' (#52) from earl-warren/act:wip-ci-on-main into main
Reviewed-on: https://code.forgejo.org/forgejo/act/pulls/52
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-08-26 08:10:01 +00:00
Earl Warren
7b9d88ce2d
chore: only run tests on main
otherwise it runs twice for renovate PRs
2024-08-23 11:42:10 +02:00
7 changed files with 86 additions and 5 deletions

View file

@ -1,7 +1,9 @@
name: checks name: checks
on: on:
- push push:
- pull_request branches:
- 'main'
pull_request:
env: env:
GOPROXY: https://goproxy.io,direct GOPROXY: https://goproxy.io,direct
@ -42,5 +44,5 @@ jobs:
- name: build without docker - name: build without docker
run: go build -tags WITHOUT_DOCKER -v ./... run: go build -tags WITHOUT_DOCKER -v ./...
- name: test - name: test
run: go test -v ./pkg/jobparser run: go test -v ./pkg/jobparser ./pkg/model ./pkg/exprparser
# TODO test more packages # TODO test more packages

View file

@ -22,7 +22,6 @@ func NewDockerNetworkCreateExecutor(name string, config *types.NetworkCreate) co
if err != nil { if err != nil {
return err return err
} }
common.Logger(ctx).Debugf("%v", networks)
for _, network := range networks { for _, network := range networks {
if network.Name == name { if network.Name == name {
common.Logger(ctx).Debugf("Network %v exists", name) common.Logger(ctx).Debugf("Network %v exists", name)

View file

@ -43,6 +43,9 @@ func TestFunctionContains(t *testing.T) {
assert.Equal(t, tt.expected, output) assert.Equal(t, tt.expected, output)
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("contains('one')", DefaultStatusCheckNone)
assert.Error(t, err)
} }
func TestFunctionStartsWith(t *testing.T) { func TestFunctionStartsWith(t *testing.T) {
@ -72,6 +75,9 @@ func TestFunctionStartsWith(t *testing.T) {
assert.Equal(t, tt.expected, output) assert.Equal(t, tt.expected, output)
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("startsWith('one')", DefaultStatusCheckNone)
assert.Error(t, err)
} }
func TestFunctionEndsWith(t *testing.T) { func TestFunctionEndsWith(t *testing.T) {
@ -101,6 +107,9 @@ func TestFunctionEndsWith(t *testing.T) {
assert.Equal(t, tt.expected, output) assert.Equal(t, tt.expected, output)
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("endsWith('one')", DefaultStatusCheckNone)
assert.Error(t, err)
} }
func TestFunctionJoin(t *testing.T) { func TestFunctionJoin(t *testing.T) {
@ -128,6 +137,9 @@ func TestFunctionJoin(t *testing.T) {
assert.Equal(t, tt.expected, output) assert.Equal(t, tt.expected, output)
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("join()", DefaultStatusCheckNone)
assert.Error(t, err)
} }
func TestFunctionToJSON(t *testing.T) { func TestFunctionToJSON(t *testing.T) {
@ -154,6 +166,9 @@ func TestFunctionToJSON(t *testing.T) {
assert.Equal(t, tt.expected, output) assert.Equal(t, tt.expected, output)
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("tojson()", DefaultStatusCheckNone)
assert.Error(t, err)
} }
func TestFunctionFromJSON(t *testing.T) { func TestFunctionFromJSON(t *testing.T) {
@ -177,6 +192,9 @@ func TestFunctionFromJSON(t *testing.T) {
assert.Equal(t, tt.expected, output) assert.Equal(t, tt.expected, output)
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("fromjson()", DefaultStatusCheckNone)
assert.Error(t, err)
} }
func TestFunctionHashFiles(t *testing.T) { func TestFunctionHashFiles(t *testing.T) {
@ -248,4 +266,7 @@ func TestFunctionFormat(t *testing.T) {
} }
}) })
} }
_, err := NewInterpeter(env, Config{}).Evaluate("format()", DefaultStatusCheckNone)
assert.Error(t, err)
} }

View file

@ -593,23 +593,58 @@ func (impl *interperterImpl) evaluateFuncCall(funcCallNode *actionlint.FuncCallN
args = append(args, reflect.ValueOf(value)) args = append(args, reflect.ValueOf(value))
} }
argCountCheck := func(argCount int) error {
if len(args) != argCount {
return fmt.Errorf("'%s' expected %d arguments but got %d instead", funcCallNode.Callee, argCount, len(args))
}
return nil
}
argAtLeastCheck := func(atLeast int) error {
if len(args) < atLeast {
return fmt.Errorf("'%s' expected at least %d arguments but got %d instead", funcCallNode.Callee, atLeast, len(args))
}
return nil
}
switch strings.ToLower(funcCallNode.Callee) { switch strings.ToLower(funcCallNode.Callee) {
case "contains": case "contains":
if err := argCountCheck(2); err != nil {
return nil, err
}
return impl.contains(args[0], args[1]) return impl.contains(args[0], args[1])
case "startswith": case "startswith":
if err := argCountCheck(2); err != nil {
return nil, err
}
return impl.startsWith(args[0], args[1]) return impl.startsWith(args[0], args[1])
case "endswith": case "endswith":
if err := argCountCheck(2); err != nil {
return nil, err
}
return impl.endsWith(args[0], args[1]) return impl.endsWith(args[0], args[1])
case "format": case "format":
if err := argAtLeastCheck(1); err != nil {
return nil, err
}
return impl.format(args[0], args[1:]...) return impl.format(args[0], args[1:]...)
case "join": case "join":
if err := argAtLeastCheck(1); err != nil {
return nil, err
}
if len(args) == 1 { if len(args) == 1 {
return impl.join(args[0], reflect.ValueOf(",")) return impl.join(args[0], reflect.ValueOf(","))
} }
return impl.join(args[0], args[1]) return impl.join(args[0], args[1])
case "tojson": case "tojson":
if err := argCountCheck(1); err != nil {
return nil, err
}
return impl.toJSON(args[0]) return impl.toJSON(args[0])
case "fromjson": case "fromjson":
if err := argCountCheck(1); err != nil {
return nil, err
}
return impl.fromJSON(args[0]) return impl.fromJSON(args[0])
case "hashfiles": case "hashfiles":
if impl.env.HashFiles != nil { if impl.env.HashFiles != nil {

View file

@ -749,7 +749,7 @@ func (w *Workflow) GetJobIDs() []string {
} }
var OnDecodeNodeError = func(node yaml.Node, out interface{}, err error) { var OnDecodeNodeError = func(node yaml.Node, out interface{}, err error) {
log.Fatalf("Failed to decode node %v into %T: %v", node, out, err) log.Errorf("Failed to decode node %v into %T: %v", node, out, err)
} }
func decodeNode(node yaml.Node, out interface{}) bool { func decodeNode(node yaml.Node, out interface{}) bool {

View file

@ -153,6 +153,25 @@ jobs:
assert.Contains(t, workflow.On(), "pull_request") assert.Contains(t, workflow.On(), "pull_request")
} }
func TestReadWorkflow_DecodeNodeError(t *testing.T) {
yaml := `
on:
push:
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: echo
env:
foo: {{ a }}
`
workflow, err := ReadWorkflow(strings.NewReader(yaml))
assert.NoError(t, err, "read workflow should succeed")
assert.Nil(t, workflow.GetJob("test").Steps[0].GetEnv())
}
func TestReadWorkflow_RunsOnLabels(t *testing.T) { func TestReadWorkflow_RunsOnLabels(t *testing.T) {
yaml := ` yaml := `
name: local-action-docker-url name: local-action-docker-url

View file

@ -2,6 +2,11 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["local>forgejo/renovate-config"], "extends": ["local>forgejo/renovate-config"],
"packageRules": [ "packageRules": [
{
"description": "Disable runner test data",
"matchFileNames": ["pkg/runner/testdata/**"],
"enabled": false
},
{ {
"description": "Require approval for all dependencies", "description": "Require approval for all dependencies",
"matchDepNames": ["/.+/"], "matchDepNames": ["/.+/"],