@@ -4,9 +4,11 @@ import (
4
4
"context"
5
5
"fmt"
6
6
"regexp"
7
+ "slices"
7
8
"strings"
8
9
9
10
apipac "github.com/openshift-pipelines/pipelines-as-code/pkg/apis/pipelinesascode/keys"
11
+ pacerrors "github.com/openshift-pipelines/pipelines-as-code/pkg/errors"
10
12
"github.com/openshift-pipelines/pipelines-as-code/pkg/formatting"
11
13
"github.com/openshift-pipelines/pipelines-as-code/pkg/matcher"
12
14
"github.com/openshift-pipelines/pipelines-as-code/pkg/params"
@@ -15,7 +17,6 @@ import (
15
17
tektonv1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
16
18
tektonv1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
17
19
"go.uber.org/zap"
18
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
19
20
k8scheme "k8s.io/client-go/kubernetes/scheme"
20
21
yaml "sigs.k8s.io/yaml/goyaml.v2"
21
22
)
@@ -26,7 +27,7 @@ type TektonTypes struct {
26
27
Pipelines []* tektonv1.Pipeline
27
28
TaskRuns []* tektonv1.TaskRun
28
29
Tasks []* tektonv1.Task
29
- ValidationErrors map [ string ] string
30
+ ValidationErrors [] * pacerrors. PacYamlValidations
30
31
}
31
32
32
33
// Contains Fetched Resources for Event, with key equals to annotation value.
@@ -43,31 +44,34 @@ type FetchedResourcesForRun struct {
43
44
44
45
func NewTektonTypes () TektonTypes {
45
46
return TektonTypes {
46
- ValidationErrors : map [ string ] string {},
47
+ ValidationErrors : [] * pacerrors. PacYamlValidations {},
47
48
}
48
49
}
49
50
50
51
var yamlDocSeparatorRe = regexp .MustCompile (`(?m)^---\s*$` )
51
52
52
- // detectAtleastNameOrGenerateNameFromPipelineRun detects the name or
53
+ // detectAtleastNameOrGenerateNameAndSchemaFromPipelineRun detects the name or
53
54
// 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"`
57
62
}
58
- err := yaml .Unmarshal ([]byte (data ), & metadataName )
63
+ err := yaml .Unmarshal ([]byte (data ), & genericKubeObj )
59
64
if err != nil {
60
- return ""
65
+ return "nokube" , " "
61
66
}
62
- if metadataName .Metadata .Name != "" {
63
- return metadataName .Metadata .Name
67
+ if genericKubeObj .Metadata .Name != "" {
68
+ return genericKubeObj .Metadata .Name , genericKubeObj . APIVersion
64
69
}
65
70
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
69
73
}
70
- return "unknown"
74
+ return "unknown" , genericKubeObj . APIVersion
71
75
}
72
76
73
77
// getPipelineByName returns the Pipeline with the given name the first one found
@@ -106,15 +110,6 @@ func pipelineRunsWithSameName(prs []*tektonv1.PipelineRun) error {
106
110
return nil
107
111
}
108
112
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
-
118
113
func isTektonAPIVersion (apiVersion string ) bool {
119
114
return strings .HasPrefix (apiVersion , "tekton.dev/" ) || apiVersion == ""
120
115
}
@@ -126,7 +121,7 @@ func inlineTasks(tasks []tektonv1.PipelineTask, ropt *Opts, remoteResource Fetch
126
121
task .TaskRef .Resolver == "" &&
127
122
isTektonAPIVersion (task .TaskRef .APIVersion ) &&
128
123
string (task .TaskRef .Kind ) != "ClusterTask" &&
129
- ! skippingTask ( task .TaskRef .Name , ropt . SkipInlining ) {
124
+ ! slices . Contains ( ropt . SkipInlining , task .TaskRef .Name ) {
130
125
taskResolved , ok := remoteResource .Tasks [task .TaskRef .Name ]
131
126
if ! ok {
132
127
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) (
164
159
165
160
obj , _ , err := decoder .Decode ([]byte (doc ), nil , nil )
166
161
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
+ })
168
168
continue
169
169
}
170
170
switch o := obj .(type ) {
0 commit comments