@@ -13,13 +13,15 @@ import (
13
13
14
14
"github.com/pkg/errors"
15
15
pipelinev1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1"
16
+ pipelinev1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
16
17
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17
18
"sigs.k8s.io/yaml"
18
19
)
19
20
20
21
const (
21
22
// TektonAPIVersion the default tekton API version
22
- TektonAPIVersion = "tekton.dev/v1"
23
+ TektonAPIVersion = "tekton.dev/v1"
24
+ TektonAPIVersionV1B1 = "tekton.dev/v1beta1"
23
25
24
26
// DefaultParameters the annotation used to disable default parameters
25
27
DefaultParameters = "lighthouse.jenkins-x.io/defaultParameters"
@@ -75,126 +77,150 @@ func LoadTektonResourceAsPipelineRun(resolver *UsesResolver, data []byte) (*pipe
75
77
}
76
78
message := resolver .Message
77
79
dir := resolver .Dir
78
- kindPrefix := "kind:"
79
- kind := "PipelineRun"
80
- lines := strings .Split (string (data ), "\n " )
81
- for _ , line := range lines {
82
- if ! strings .HasPrefix (line , kindPrefix ) {
83
- continue
84
- }
85
- k := strings .TrimSpace (line [len (kindPrefix ):])
86
- if k != "" {
87
- kind = k
88
- break
89
- }
80
+
81
+ var meta struct {
82
+ Kind string `yaml:"kind"`
83
+ APIVersion string `yaml:"apiVersion"`
90
84
}
91
- switch kind {
85
+ if err := yaml .Unmarshal (data , & meta ); err != nil {
86
+ return nil , errors .Wrapf (err , "failed to extract metadata (kind, apiVersion) from YAML %s" , message )
87
+ }
88
+
89
+ isBeta := meta .APIVersion == TektonAPIVersionV1B1
90
+
91
+ switch meta .Kind {
92
92
case "Pipeline" :
93
93
pipeline := & pipelinev1.Pipeline {}
94
- err := yaml .Unmarshal (data , pipeline )
95
- if err != nil {
96
- return nil , errors .Wrapf (err , "failed to unmarshal Pipeline YAML %s" , message )
94
+ var err error
95
+ if isBeta {
96
+ pipeline , err = unmarshalAndConvertPipeline (data , message )
97
+ } else {
98
+ err = yaml .Unmarshal (data , pipeline )
97
99
}
98
- prs , err := ConvertPipelineToPipelineRun (pipeline , resolver .Message , resolver .DefaultValues )
99
100
if err != nil {
100
- return prs , err
101
+ return nil , err
101
102
}
102
- re , err := loadTektonRefsFromFilesPattern ( prs )
103
+ prs , err := ConvertPipelineToPipelineRun ( pipeline , resolver . Message , resolver . DefaultValues )
103
104
if err != nil {
104
105
return prs , err
105
106
}
106
- if re != nil {
107
- prs , err = loadPipelineRunRefs (resolver , prs , dir , message , re )
108
- if err != nil {
109
- return prs , err
110
- }
111
- }
112
- prs , err = inheritTaskSteps (resolver , prs )
113
- if err != nil {
114
- return prs , errors .Wrapf (err , "failed to inherit steps" )
115
- }
116
- return DefaultPipelineParameters (prs )
107
+ return resolvePipelineRunReferences (resolver , prs , dir , message )
117
108
118
109
case "PipelineRun" :
119
110
prs := & pipelinev1.PipelineRun {}
120
- err := yaml .Unmarshal (data , prs )
121
- if err != nil {
122
- return nil , errors .Wrapf (err , "failed to unmarshal PipelineRun YAML %s" , message )
123
- }
124
-
125
- re , err := loadTektonRefsFromFilesPattern (prs )
126
- if err != nil {
127
- return prs , err
128
- }
129
- if re != nil {
130
- prs , err = loadPipelineRunRefs (resolver , prs , dir , message , re )
131
- if err != nil {
132
- return prs , err
133
- }
111
+ var err error
112
+ if isBeta {
113
+ prs , err = unmarshalAndConvertPipelineRun (data , message )
114
+ } else {
115
+ err = yaml .Unmarshal (data , prs )
134
116
}
135
- prs , err = inheritTaskSteps (resolver , prs )
136
117
if err != nil {
137
- return prs , errors . Wrap ( err , "failed to inherit steps" )
118
+ return nil , err
138
119
}
139
- return DefaultPipelineParameters ( prs )
120
+ return resolvePipelineRunReferences ( resolver , prs , dir , message )
140
121
141
122
case "Task" :
142
123
task := & pipelinev1.Task {}
143
- err := yaml .Unmarshal (data , task )
144
- if err != nil {
145
- return nil , errors .Wrapf (err , "failed to unmarshal Task YAML %s" , message )
124
+ var err error
125
+ if isBeta {
126
+ task , err = unmarshalAndConvertTask (data , message )
127
+ } else {
128
+ err = yaml .Unmarshal (data , task )
146
129
}
147
- prs , err := ConvertTaskToPipelineRun (task , message , resolver .DefaultValues )
148
130
if err != nil {
149
- return prs , err
131
+ return nil , err
150
132
}
151
- re , err := loadTektonRefsFromFilesPattern ( prs )
133
+ prs , err := ConvertTaskToPipelineRun ( task , message , resolver . DefaultValues )
152
134
if err != nil {
153
135
return prs , err
154
136
}
155
- if re != nil {
156
- prs , err = loadPipelineRunRefs (resolver , prs , dir , message , re )
157
- if err != nil {
158
- return prs , err
159
- }
160
- }
161
- prs , err = inheritTaskSteps (resolver , prs )
162
- if err != nil {
163
- return prs , errors .Wrapf (err , "failed to inherit steps" )
164
- }
165
- defaultTaskName (prs )
166
- return DefaultPipelineParameters (prs )
137
+ return resolvePipelineRunReferences (resolver , prs , dir , message )
167
138
168
139
case "TaskRun" :
169
140
tr := & pipelinev1.TaskRun {}
170
- err := yaml .Unmarshal (data , tr )
141
+ var err error
142
+ if isBeta {
143
+ tr , err = unmarshalAndConvertTaskRun (data , message )
144
+ } else {
145
+ err = yaml .Unmarshal (data , tr )
146
+ }
171
147
if err != nil {
172
- return nil , errors . Wrapf ( err , "failed to unmarshal TaskRun YAML %s" , message )
148
+ return nil , err
173
149
}
174
150
prs , err := ConvertTaskRunToPipelineRun (tr , message , resolver .DefaultValues )
175
151
if err != nil {
176
152
return prs , err
177
153
}
178
- re , err := loadTektonRefsFromFilesPattern (prs )
179
- if err != nil {
154
+ return resolvePipelineRunReferences (resolver , prs , dir , message )
155
+
156
+ default :
157
+ return nil , errors .Errorf ("kind %s is not supported for %s" , meta .Kind , message )
158
+ }
159
+ }
160
+
161
+ func unmarshalAndConvertPipeline (data []byte , message string ) (* pipelinev1.Pipeline , error ) {
162
+ pV1Beta1 := & pipelinev1beta1.Pipeline {}
163
+ if err := yaml .Unmarshal (data , pV1Beta1 ); err != nil {
164
+ return nil , errors .Wrapf (err , "failed to unmarshal Pipeline v1beta1 YAML %s" , message )
165
+ }
166
+ pV1 := & pipelinev1.Pipeline {}
167
+ if err := pV1Beta1 .ConvertTo (context .TODO (), pV1 ); err != nil {
168
+ return nil , errors .Wrap (err , "failed to convert Pipeline from v1beta1 to v1" )
169
+ }
170
+ return pV1 , nil
171
+ }
172
+
173
+ func unmarshalAndConvertPipelineRun (data []byte , message string ) (* pipelinev1.PipelineRun , error ) {
174
+ prsV1Beta1 := & pipelinev1beta1.PipelineRun {}
175
+ if err := yaml .Unmarshal (data , prsV1Beta1 ); err != nil {
176
+ return nil , errors .Wrapf (err , "failed to unmarshal PipelineRun v1beta1 YAML %s" , message )
177
+ }
178
+ prsV1 := & pipelinev1.PipelineRun {}
179
+ if err := prsV1Beta1 .ConvertTo (context .TODO (), prsV1 ); err != nil {
180
+ return nil , errors .Wrap (err , "failed to convert PipelineRun from v1beta1 to v1" )
181
+ }
182
+ return prsV1 , nil
183
+ }
184
+
185
+ func unmarshalAndConvertTask (data []byte , message string ) (* pipelinev1.Task , error ) {
186
+ tV1Beta1 := & pipelinev1beta1.Task {}
187
+ if err := yaml .Unmarshal (data , tV1Beta1 ); err != nil {
188
+ return nil , errors .Wrapf (err , "failed to unmarshal Task v1beta1 YAML %s" , message )
189
+ }
190
+ tV1 := & pipelinev1.Task {}
191
+ if err := tV1Beta1 .ConvertTo (context .TODO (), tV1 ); err != nil {
192
+ return nil , errors .Wrap (err , "failed to convert Task from v1beta1 to v1" )
193
+ }
194
+ return tV1 , nil
195
+ }
196
+
197
+ func unmarshalAndConvertTaskRun (data []byte , message string ) (* pipelinev1.TaskRun , error ) {
198
+ trsV1Beta1 := & pipelinev1beta1.TaskRun {}
199
+ if err := yaml .Unmarshal (data , trsV1Beta1 ); err != nil {
200
+ return nil , errors .Wrapf (err , "failed to unmarshal TaskRun v1beta1 YAML %s" , message )
201
+ }
202
+ trsV1 := & pipelinev1.TaskRun {}
203
+ if err := trsV1Beta1 .ConvertTo (context .TODO (), trsV1 ); err != nil {
204
+ return nil , errors .Wrap (err , "failed to convert TaskRun from v1beta1 to v1" )
205
+ }
206
+ return trsV1 , nil
207
+ }
208
+
209
+ func resolvePipelineRunReferences (resolver * UsesResolver , prs * pipelinev1.PipelineRun , dir , message string ) (* pipelinev1.PipelineRun , error ) {
210
+ if re , err := loadTektonRefsFromFilesPattern (prs ); err != nil {
211
+ return prs , err
212
+ } else if re != nil {
213
+ if prs , err = loadPipelineRunRefs (resolver , prs , dir , message , re ); err != nil {
180
214
return prs , err
181
215
}
182
- if re != nil {
183
- prs , err = loadPipelineRunRefs (resolver , prs , dir , message , re )
184
- if err != nil {
185
- return prs , err
186
- }
187
- }
188
- prs , err = inheritTaskSteps (resolver , prs )
189
- if err != nil {
190
- return prs , errors .Wrapf (err , "failed to inherit steps" )
191
- }
192
- defaultTaskName (prs )
193
- return DefaultPipelineParameters (prs )
216
+ }
194
217
195
- default :
196
- return nil , errors .Errorf ( "kind %s is not supported for %s" , kind , message )
218
+ if prs , err := inheritTaskSteps ( resolver , prs ); err != nil {
219
+ return prs , errors .Wrapf ( err , "failed to inherit steps" )
197
220
}
221
+
222
+ defaultTaskName (prs ) // Renamed function for clarity
223
+ return DefaultPipelineParameters (prs )
198
224
}
199
225
200
226
func defaultTaskName (prs * pipelinev1.PipelineRun ) {
0 commit comments