diff --git a/cmd/kube-score/main.go b/cmd/kube-score/main.go index deb1d0f6..84b03535 100644 --- a/cmd/kube-score/main.go +++ b/cmd/kube-score/main.go @@ -212,8 +212,8 @@ Use "-" as filename to read from STDIN.`, execName(binName)) return fmt.Errorf("failed to initializer parser: %w", err) } - parsedFiles, err := p.ParseFiles(allFilePointers) - if err != nil { + parsedFiles, parseErr := p.ParseFiles(allFilePointers) + if parseErr != nil && parsedFiles == nil { return fmt.Errorf("failed to parse files: %w", err) } @@ -231,7 +231,11 @@ Use "-" as filename to read from STDIN.`, execName(binName)) case *exitOneOnWarning && scoreCard.AnyBelowOrEqualToGrade(scorecard.GradeWarning): exitCode = 1 default: - exitCode = 0 + if parseErr != nil { + exitCode = 1 + } else { + exitCode = 0 + } } var r io.Reader diff --git a/parser/parse.go b/parser/parse.go index ffba172a..2f51e599 100644 --- a/parser/parse.go +++ b/parser/parse.go @@ -158,6 +158,7 @@ func Empty() ks.AllTypes { func (p *Parser) ParseFiles(files []ks.NamedReader) (ks.AllTypes, error) { s := &parsedObjects{} + errorOccured := false for _, namedReader := range files { fullFile, err := io.ReadAll(namedReader) if err != nil { @@ -179,14 +180,17 @@ func (p *Parser) ParseFiles(files []ks.NamedReader) (ks.AllTypes, error) { if len(bytes.TrimSpace(fileContents)) > 0 { if err := p.detectAndDecode(s, namedReader.Name(), offset, fileContents); err != nil { - return nil, err + errorOccured = true + log.Printf("Failed to parse '%s': %v", namedReader.Name(), err) } } offset += 2 + bytes.Count(fileContents, []byte("\n")) } } - + if errorOccured { + return s, fmt.Errorf("one or more files failed to parse") + } return s, nil } diff --git a/parser/parse_test.go b/parser/parse_test.go index d7c7b8eb..7c53519d 100644 --- a/parser/parse_test.go +++ b/parser/parse_test.go @@ -17,7 +17,7 @@ func TestParse(t *testing.T) { }{ { "testdata/invalid-yaml.yaml", - fmt.Errorf("Failed to parse /v1, Kind=Service: err=json: cannot unmarshal string into Go struct field ServicePort.spec.ports.nodePort of type int32"), + fmt.Errorf("one or more files failed to parse"), }, { "testdata/valid-yaml.yaml", nil,