@@ -4,9 +4,11 @@ import (
44 "context"
55 "fmt"
66 "regexp"
7+ "slices"
78 "strings"
89
910 apipac "github.com/openshift-pipelines/pipelines-as-code/pkg/apis/pipelinesascode/keys"
11+ pacerrors "github.com/openshift-pipelines/pipelines-as-code/pkg/errors"
1012 "github.com/openshift-pipelines/pipelines-as-code/pkg/formatting"
1113 "github.com/openshift-pipelines/pipelines-as-code/pkg/matcher"
1214 "github.com/openshift-pipelines/pipelines-as-code/pkg/params"
@@ -15,7 +17,6 @@ import (
1517 tektonv1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
1618 tektonv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
1719 "go.uber.org/zap"
18- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1920 k8scheme "k8s.io/client-go/kubernetes/scheme"
2021 yaml "sigs.k8s.io/yaml/goyaml.v2"
2122)
@@ -26,7 +27,7 @@ type TektonTypes struct {
2627 Pipelines []* tektonv1.Pipeline
2728 TaskRuns []* tektonv1.TaskRun
2829 Tasks []* tektonv1.Task
29- ValidationErrors map [ string ] string
30+ ValidationErrors [] * pacerrors. PacYamlValidations
3031}
3132
3233// Contains Fetched Resources for Event, with key equals to annotation value.
@@ -43,31 +44,34 @@ type FetchedResourcesForRun struct {
4344
4445func NewTektonTypes () TektonTypes {
4546 return TektonTypes {
46- ValidationErrors : map [ string ] string {},
47+ ValidationErrors : [] * pacerrors. PacYamlValidations {},
4748 }
4849}
4950
5051var yamlDocSeparatorRe = regexp .MustCompile (`(?m)^---\s*$` )
5152
52- // detectAtleastNameOrGenerateNameFromPipelineRun detects the name or
53+ // detectAtleastNameOrGenerateNameAndSchemaFromPipelineRun detects the name or
5354// generateName of a yaml files even if there is an error decoding it as tekton types.
54- func detectAtleastNameOrGenerateNameFromPipelineRun (data string ) string {
55- var metadataName struct {
56- Metadata metav1.ObjectMeta
55+ func detectAtleastNameOrGenerateNameAndSchemaFromPipelineRun (data string ) (string , string ) {
56+ var genericKubeObj struct {
57+ APIVersion string `yaml:"apiVersion"`
58+ Metadata struct {
59+ Name string `yaml:"name,omitempty"`
60+ GenerateName string `yaml:"generateName,omitempty"`
61+ } `yaml:"metadata"`
5762 }
58- err := yaml .Unmarshal ([]byte (data ), & metadataName )
63+ err := yaml .Unmarshal ([]byte (data ), & genericKubeObj )
5964 if err != nil {
60- return ""
65+ return "nokube" , " "
6166 }
62- if metadataName .Metadata .Name != "" {
63- return metadataName .Metadata .Name
67+ if genericKubeObj .Metadata .Name != "" {
68+ return genericKubeObj .Metadata .Name , genericKubeObj . APIVersion
6469 }
6570
66- // TODO: yaml Unmarshal don't want to parse generatename and i have no idea why
67- if metadataName .Metadata .GenerateName != "" {
68- return metadataName .Metadata .GenerateName
71+ if genericKubeObj .Metadata .GenerateName != "" {
72+ return genericKubeObj .Metadata .GenerateName , genericKubeObj .APIVersion
6973 }
70- return "unknown"
74+ return "unknown" , genericKubeObj . APIVersion
7175}
7276
7377// getPipelineByName returns the Pipeline with the given name the first one found
@@ -106,15 +110,6 @@ func pipelineRunsWithSameName(prs []*tektonv1.PipelineRun) error {
106110 return nil
107111}
108112
109- func skippingTask (taskName string , skippedTasks []string ) bool {
110- for _ , value := range skippedTasks {
111- if value == taskName {
112- return true
113- }
114- }
115- return false
116- }
117-
118113func isTektonAPIVersion (apiVersion string ) bool {
119114 return strings .HasPrefix (apiVersion , "tekton.dev/" ) || apiVersion == ""
120115}
@@ -126,7 +121,7 @@ func inlineTasks(tasks []tektonv1.PipelineTask, ropt *Opts, remoteResource Fetch
126121 task .TaskRef .Resolver == "" &&
127122 isTektonAPIVersion (task .TaskRef .APIVersion ) &&
128123 string (task .TaskRef .Kind ) != "ClusterTask" &&
129- ! skippingTask ( task .TaskRef .Name , ropt . SkipInlining ) {
124+ ! slices . Contains ( ropt . SkipInlining , task .TaskRef .Name ) {
130125 taskResolved , ok := remoteResource .Tasks [task .TaskRef .Name ]
131126 if ! ok {
132127 return nil , fmt .Errorf ("cannot find referenced task %s. if it's a remote task make sure to add it in the annotations" , task .TaskRef .Name )
@@ -164,7 +159,12 @@ func ReadTektonTypes(ctx context.Context, log *zap.SugaredLogger, data string) (
164159
165160 obj , _ , err := decoder .Decode ([]byte (doc ), nil , nil )
166161 if err != nil {
167- types .ValidationErrors [detectAtleastNameOrGenerateNameFromPipelineRun (doc )] = err .Error ()
162+ dt , dv := detectAtleastNameOrGenerateNameAndSchemaFromPipelineRun (doc )
163+ types .ValidationErrors = append (types .ValidationErrors , & pacerrors.PacYamlValidations {
164+ Name : dt ,
165+ Err : fmt .Errorf ("error decoding yaml document: %w" , err ),
166+ Schema : dv ,
167+ })
168168 continue
169169 }
170170 switch o := obj .(type ) {
0 commit comments