From 8c6c089a656dc9c720054c0188605f37e8300746 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Wed, 17 Sep 2025 15:41:55 +0200 Subject: [PATCH] fix: forgejo-runner validate exit with error when validation fails Refs forgejo/runner#1002 --- internal/app/cmd/validate.go | 15 ++++++----- internal/app/cmd/validate_test.go | 42 ++++++++++++++++++------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/internal/app/cmd/validate.go b/internal/app/cmd/validate.go index 49395000..564922cc 100644 --- a/internal/app/cmd/validate.go +++ b/internal/app/cmd/validate.go @@ -50,12 +50,13 @@ func validate(dir, path string, isWorkflow, isAction bool) error { kind = "action" } if err != nil { - fmt.Printf("%s %s schema validation failed:\n%s\n", shortPath, kind, err.Error()) + err = fmt.Errorf("%s %s schema validation failed:\n%s", shortPath, kind, err.Error()) + fmt.Printf("%s\n", err.Error()) } else { fmt.Printf("%s %s schema validation OK\n", shortPath, kind) } - return nil + return err } func validatePath(validateArgs *validateArgs) error { @@ -115,6 +116,8 @@ func validateRepository(validateArgs *validateArgs) error { } } + var validationErrors error + if err := filepath.Walk(clonedir, func(path string, fi fs.FileInfo, err error) error { if validatePathMatch(path, ".forgejo/workflows/action") { return nil @@ -123,7 +126,7 @@ func validateRepository(validateArgs *validateArgs) error { isAction := true if validatePathMatch(path, "action") { if err := validate(clonedir, path, isWorkflow, isAction); err != nil { - return err + validationErrors = errors.Join(validationErrors, err) } } return nil @@ -141,9 +144,9 @@ func validateRepository(validateArgs *validateArgs) error { if err := filepath.Walk(workflowdir, func(path string, fi fs.FileInfo, err error) error { isWorkflow := true isAction := false - if validateHasYamlSuffix(path, "") { + if validateHasYamlSuffix(path) { if err := validate(clonedir, path, isWorkflow, isAction); err != nil { - return err + validationErrors = errors.Join(validationErrors, err) } } return nil @@ -152,7 +155,7 @@ func validateRepository(validateArgs *validateArgs) error { } } - return nil + return validationErrors } func processDirectory(validateArgs *validateArgs) { diff --git a/internal/app/cmd/validate_test.go b/internal/app/cmd/validate_test.go index d620128b..9b132d9f 100644 --- a/internal/app/cmd/validate_test.go +++ b/internal/app/cmd/validate_test.go @@ -56,9 +56,10 @@ func Test_validateCmd(t *testing.T) { stdOut: "schema validation OK", }, { - name: "PathActionNOK", - args: []string{"--action", "--path", "testdata/validate/bad-action.yml"}, - stdOut: "Expected a mapping got scalar", + name: "PathActionNOK", + args: []string{"--action", "--path", "testdata/validate/bad-action.yml"}, + stdOut: "Expected a mapping got scalar", + message: "testdata/validate/bad-action.yml action schema validation failed", }, { name: "PathWorkflowOK", @@ -66,9 +67,10 @@ func Test_validateCmd(t *testing.T) { stdOut: "schema validation OK", }, { - name: "PathWorkflowNOK", - args: []string{"--workflow", "--path", "testdata/validate/bad-workflow.yml"}, - stdOut: "Unknown Property ruins-on", + name: "PathWorkflowNOK", + args: []string{"--workflow", "--path", "testdata/validate/bad-workflow.yml"}, + stdOut: "Unknown Property ruins-on", + message: "testdata/validate/bad-workflow.yml workflow schema validation failed", }, { name: "DirectoryOK", @@ -76,14 +78,16 @@ func Test_validateCmd(t *testing.T) { stdOut: "action.yml action schema validation OK\nsubaction/action.yaml action schema validation OK\n.forgejo/workflows/action.yml workflow schema validation OK\n.forgejo/workflows/workflow1.yml workflow schema validation OK\n.forgejo/workflows/workflow2.yaml workflow schema validation OK", }, { - name: "DirectoryActionNOK", - args: []string{"--directory", "testdata/validate/bad-directory"}, - stdOut: "action.yml action schema validation failed", + name: "DirectoryActionNOK", + args: []string{"--directory", "testdata/validate/bad-directory"}, + stdOut: "action.yml action schema validation failed", + message: "action.yml action schema validation failed", }, { - name: "DirectoryWorkflowNOK", - args: []string{"--directory", "testdata/validate/bad-directory"}, - stdOut: ".forgejo/workflows/workflow1.yml workflow schema validation failed", + name: "DirectoryWorkflowNOK", + args: []string{"--directory", "testdata/validate/bad-directory"}, + stdOut: ".forgejo/workflows/workflow1.yml workflow schema validation failed", + message: ".forgejo/workflows/workflow1.yml workflow schema validation failed", }, { name: "RepositoryOK", @@ -91,14 +95,16 @@ func Test_validateCmd(t *testing.T) { stdOut: "action.yml action schema validation OK\nsubaction/action.yaml action schema validation OK\n.forgejo/workflows/action.yml workflow schema validation OK\n.forgejo/workflows/workflow1.yml workflow schema validation OK\n.forgejo/workflows/workflow2.yaml workflow schema validation OK", }, { - name: "RepositoryActionNOK", - args: []string{"--repository", "testdata/validate/bad-repository"}, - stdOut: "action.yml action schema validation failed", + name: "RepositoryActionNOK", + args: []string{"--repository", "testdata/validate/bad-repository"}, + stdOut: "action.yml action schema validation failed", + message: "action.yml action schema validation failed", }, { - name: "RepositoryWorkflowNOK", - args: []string{"--repository", "testdata/validate/bad-repository"}, - stdOut: ".forgejo/workflows/workflow1.yml workflow schema validation failed", + name: "RepositoryWorkflowNOK", + args: []string{"--repository", "testdata/validate/bad-repository"}, + stdOut: ".forgejo/workflows/workflow1.yml workflow schema validation failed", + message: ".forgejo/workflows/workflow1.yml workflow schema validation failed", }, } { t.Run(testCase.name, func(t *testing.T) {