@@ -43,6 +43,8 @@ type Reconciler struct {
43
43
eventEmitter * events.EventEmitter
44
44
globalRepo * v1alpha1.Repository
45
45
secretNS string
46
+ event * info.Event
47
+ repo * v1alpha1.Repository
46
48
}
47
49
48
50
var (
54
56
func (r * Reconciler ) ReconcileKind (ctx context.Context , pr * tektonv1.PipelineRun ) pkgreconciler.Event {
55
57
ctx = info .StoreNS (ctx , system .Namespace ())
56
58
logger := logging .FromContext (ctx ).With ("namespace" , pr .GetNamespace ())
59
+ vcx , err := r .getProvider (ctx , pr , logger )
60
+ if err != nil {
61
+ return err
62
+ }
63
+ reason := ""
64
+ if len (pr .Status .GetConditions ()) > 0 {
65
+ reason = pr .Status .Status .GetConditions ()[0 ].GetReason ()
66
+ }
67
+ if reason != "" && reason == string (tektonv1 .PipelineRunReasonRunning ) {
68
+ checkRunID := pr .GetAnnotations ()[keys .CheckRunID ]
69
+ status , err := vcx .GetStatus (ctx , r .event , checkRunID )
70
+ if err != nil {
71
+ return fmt .Errorf ("failed to get status of PipelineRun %s: %w" , pr .GetName (), err )
72
+ }
73
+
74
+ if status == "queued" {
75
+ consoleURL := r .run .Clients .ConsoleUI ().DetailURL (pr )
76
+ mt := formatting.MessageTemplate {
77
+ PipelineRunName : pr .GetName (),
78
+ Namespace : r .repo .GetNamespace (),
79
+ ConsoleName : r .run .Clients .ConsoleUI ().GetName (),
80
+ ConsoleURL : consoleURL ,
81
+ TknBinary : settings .TknBinaryName ,
82
+ TknBinaryURL : settings .TknBinaryURL ,
83
+ }
84
+
85
+ msg , err := mt .MakeTemplate (vcx .GetTemplate (provider .StartingPipelineType ))
86
+ if err != nil {
87
+ return fmt .Errorf ("cannot create message template: %w" , err )
88
+ }
89
+ status := provider.StatusOpts {
90
+ Status : "in_progress" ,
91
+ Conclusion : "pending" ,
92
+ Text : msg ,
93
+ DetailsURL : consoleURL ,
94
+ PipelineRunName : pr .GetName (),
95
+ PipelineRun : pr ,
96
+ OriginalPipelineRunName : pr .GetAnnotations ()[keys .OriginalPRName ],
97
+ }
98
+
99
+ if err := vcx .CreateStatus (ctx , r .event , status ); err != nil {
100
+ return fmt .Errorf ("cannot use the API on the provider platform to create a in_progress status: %w" , err )
101
+ }
102
+ }
103
+ }
57
104
// if pipelineRun is in completed or failed state then return
58
105
state , exist := pr .GetAnnotations ()[keys .State ]
59
106
if exist && (state == kubeinteraction .StateCompleted || state == kubeinteraction .StateFailed ) {
@@ -117,20 +164,60 @@ func (r *Reconciler) ReconcileKind(ctx context.Context, pr *tektonv1.PipelineRun
117
164
// use same pac opts across the reconciliation
118
165
pacInfo := r .run .Info .GetPacOpts ()
119
166
167
+ if repo , err := r .reportFinalStatus (ctx , logger , & pacInfo , r .event , pr , vcx ); err != nil {
168
+ msg := fmt .Sprintf ("report status: %v" , err )
169
+ r .eventEmitter .EmitMessage (repo , zap .ErrorLevel , "RepositoryReportFinalStatus" , msg )
170
+ return err
171
+ }
172
+ return nil
173
+ }
174
+
175
+ func (r * Reconciler ) getProvider (ctx context.Context , pr * tektonv1.PipelineRun , logger * zap.SugaredLogger ) (provider.Interface , error ) {
176
+ pacInfo := r .run .Info .GetPacOpts ()
120
177
detectedProvider , event , err := r .detectProvider (ctx , logger , pr )
121
178
if err != nil {
122
- msg := fmt .Sprintf ("detectProvider : %v" , err )
179
+ msg := fmt .Sprintf ("det}ectProvider : %v" , err )
123
180
r .eventEmitter .EmitMessage (nil , zap .ErrorLevel , "RepositoryDetectProvider" , msg )
124
- return nil
181
+ return nil , err
125
182
}
126
183
detectedProvider .SetPacInfo (& pacInfo )
127
184
128
- if repo , err := r . reportFinalStatus ( ctx , logger , & pacInfo , event , pr , detectedProvider ); err != nil {
129
- msg := fmt . Sprintf ( "report status: %v" , err )
130
- r . eventEmitter . EmitMessage ( repo , zap . ErrorLevel , "RepositoryReportFinalStatus" , msg )
131
- return err
185
+ repoName := pr . GetAnnotations ()[ keys . Repository ]
186
+ repo , err := r . repoLister . Repositories ( pr . Namespace ). Get ( repoName )
187
+ if err != nil {
188
+ return nil , fmt . Errorf ( "reportFinalStatus: %w" , err )
132
189
}
133
- return nil
190
+
191
+ if event .InstallationID > 0 {
192
+ event .Provider .WebhookSecret , _ = pac .GetCurrentNSWebhookSecret (ctx , r .kinteract , r .run )
193
+ } else {
194
+ secretNS := repo .GetNamespace ()
195
+ if repo .Spec .GitProvider != nil && repo .Spec .GitProvider .Secret == nil && r .globalRepo != nil && r .globalRepo .Spec .GitProvider != nil && r .globalRepo .Spec .GitProvider .Secret != nil {
196
+ secretNS = r .globalRepo .GetNamespace ()
197
+ }
198
+ secretFromRepo := pac.SecretFromRepository {
199
+ K8int : r .kinteract ,
200
+ Config : detectedProvider .GetConfig (),
201
+ Event : event ,
202
+ Repo : repo ,
203
+ WebhookType : pacInfo .WebhookType ,
204
+ Logger : logger ,
205
+ Namespace : secretNS ,
206
+ }
207
+ if err := secretFromRepo .Get (ctx ); err != nil {
208
+ return nil , fmt .Errorf ("cannot get secret from repository: %w" , err )
209
+ }
210
+ }
211
+
212
+ err = detectedProvider .SetClient (ctx , r .run , event , repo , r .eventEmitter )
213
+ if err != nil {
214
+ return nil , fmt .Errorf ("cannot set client: %w" , err )
215
+ }
216
+
217
+ r .event = event
218
+ r .repo = repo
219
+
220
+ return detectedProvider , nil
134
221
}
135
222
136
223
func (r * Reconciler ) reportFinalStatus (ctx context.Context , logger * zap.SugaredLogger , pacInfo * info.PacOpts , event * info.Event , pr * tektonv1.PipelineRun , provider provider.Interface ) (* v1alpha1.Repository , error ) {
@@ -156,28 +243,6 @@ func (r *Reconciler) reportFinalStatus(ctx context.Context, logger *zap.SugaredL
156
243
}
157
244
r .run .Clients .ConsoleUI ().SetParams (maptemplate )
158
245
159
- if event .InstallationID > 0 {
160
- event .Provider .WebhookSecret , _ = pac .GetCurrentNSWebhookSecret (ctx , r .kinteract , r .run )
161
- } else {
162
- secretFromRepo := pac.SecretFromRepository {
163
- K8int : r .kinteract ,
164
- Config : provider .GetConfig (),
165
- Event : event ,
166
- Repo : repo ,
167
- WebhookType : pacInfo .WebhookType ,
168
- Logger : logger ,
169
- Namespace : r .secretNS ,
170
- }
171
- if err := secretFromRepo .Get (ctx ); err != nil {
172
- return repo , fmt .Errorf ("cannot get secret from repository: %w" , err )
173
- }
174
- }
175
-
176
- err = provider .SetClient (ctx , r .run , event , repo , r .eventEmitter )
177
- if err != nil {
178
- return repo , fmt .Errorf ("cannot set client: %w" , err )
179
- }
180
-
181
246
finalState := kubeinteraction .StateCompleted
182
247
newPr , err := r .postFinalStatus (ctx , logger , pacInfo , provider , event , pr )
183
248
if err != nil {
0 commit comments