@@ -76,6 +76,22 @@ func getRepoFullname() (string, error) {
76
76
return repoFullname , nil
77
77
}
78
78
79
+ func GetUrlContents (url string ) (string , error ) {
80
+ resp , err := http .Get (url )
81
+ if err != nil {
82
+ return "" , fmt .Errorf ("%v" , err )
83
+ }
84
+ defer resp .Body .Close ()
85
+
86
+ body , err := io .ReadAll (resp .Body )
87
+ if err != nil {
88
+ return "" , fmt .Errorf ("%v" , err )
89
+ }
90
+
91
+ content := string (body )
92
+ return content , nil
93
+ }
94
+
79
95
func GetSpec (diggerUrl string , authToken string , command string , actor string , projectMarshalled string , diggerConfigMarshalled string , repoFullName string , defaultBanch string , prBranch string ) ([]byte , error ) {
80
96
payload := spec.GetSpecPayload {
81
97
Command : command ,
@@ -132,32 +148,57 @@ func pushToBranch(prBranch string) error {
132
148
return err
133
149
}
134
150
135
- func GetWorkflowIdAndUrlFromDiggerJobId (client * github.Client , repoOwner string , repoName string , diggerJobID string ) (* int64 , * string , error ) {
151
+ func GetWorkflowIdAndUrlFromDiggerJobId (client * github.Client , repoOwner string , repoName string , diggerJobID string ) (* int64 , * int64 , * string , error ) {
136
152
timeFilter := time .Now ().Add (- 5 * time .Minute )
137
153
runs , _ , err := client .Actions .ListRepositoryWorkflowRuns (context .Background (), repoOwner , repoName , & github.ListWorkflowRunsOptions {
138
154
Created : ">=" + timeFilter .Format (time .RFC3339 ),
139
155
})
140
156
if err != nil {
141
- return nil , nil , fmt .Errorf ("error listing workflow runs %v" , err )
157
+ return nil , nil , nil , fmt .Errorf ("error listing workflow runs %v" , err )
142
158
}
143
159
144
160
for _ , workflowRun := range runs .WorkflowRuns {
145
161
workflowjobs , _ , err := client .Actions .ListWorkflowJobs (context .Background (), repoOwner , repoName , * workflowRun .ID , nil )
146
162
if err != nil {
147
- return nil , nil , fmt .Errorf ("error listing workflow jobs for run %v %v" , workflowRun .ID , err )
163
+ return nil , nil , nil , fmt .Errorf ("error listing workflow jobs for run %v %v" , workflowRun .ID , err )
148
164
}
149
165
150
166
for _ , workflowjob := range workflowjobs .Jobs {
151
167
for _ , step := range workflowjob .Steps {
152
168
if strings .Contains (* step .Name , diggerJobID ) {
153
169
url := fmt .Sprintf ("https://github.com/%v/%v/actions/runs/%v" , repoOwner , repoName , * workflowRun .ID )
154
- return workflowRun .ID , & url , nil
170
+ return workflowRun .ID , workflowjob . ID , & url , nil
155
171
}
156
172
}
157
173
}
158
174
159
175
}
160
- return nil , nil , fmt .Errorf ("workflow not found" )
176
+ return nil , nil , nil , fmt .Errorf ("workflow not found" )
177
+ }
178
+
179
+ func cleanupDiggerOutput (output string ) string {
180
+
181
+ startingDelimeter := "<========= DIGGER RUNNING IN MANUAL MODE =========>"
182
+ endingDelimiter := "<========= DIGGER COMPLETED =========>"
183
+
184
+ startPos := 0
185
+ endPos := len (output )
186
+ // removes output of terraform -version command that terraform-exec executes on every run
187
+ i := strings .Index (output , startingDelimeter )
188
+ if i != - 1 {
189
+ startPos = i + len (startingDelimeter )
190
+ }
191
+
192
+ e := strings .Index (output , endingDelimiter )
193
+ if e != - 1 {
194
+ endPos = e
195
+ }
196
+
197
+ // This should not happen but in case we get here we avoid slice bounds out of range exception by resetting endPos
198
+ if endPos <= startPos {
199
+ endPos = len (output )
200
+ }
201
+ return output [startPos :endPos ]
161
202
}
162
203
163
204
// validateCmd represents the validate command
@@ -169,6 +210,12 @@ var execCmd = &cobra.Command{
169
210
var execConfig execConfig
170
211
viperExec .Unmarshal (& execConfig )
171
212
log .Printf ("%v - %v " , execConfig .Project , execConfig .Command )
213
+
214
+ if execConfig .Command != "digger plan" {
215
+ log .Printf ("ERROR: currently only 'digger plan' supported with exec command" )
216
+ os .Exit (1 )
217
+ }
218
+
172
219
config , _ , _ , err := digger_config .LoadDiggerConfig ("./" , true , nil )
173
220
if err != nil {
174
221
log .Printf ("Invalid digger config file: %v. Exiting." , err )
@@ -266,16 +313,41 @@ var execCmd = &cobra.Command{
266
313
repoOwner , repoName , _ := strings .Cut (repoFullname , "/" )
267
314
var logsUrl * string
268
315
var runId * int64
316
+ var jobId * int64
269
317
for {
270
- runId , logsUrl , err = GetWorkflowIdAndUrlFromDiggerJobId (client , repoOwner , repoName , spec .JobId )
318
+ runId , jobId , logsUrl , err = GetWorkflowIdAndUrlFromDiggerJobId (client , repoOwner , repoName , spec .JobId )
271
319
if err == nil {
272
320
break
273
321
}
274
322
time .Sleep (time .Second * 1 )
275
323
}
276
324
277
- log .Printf ("logs url: %v runId %v" , * logsUrl , * runId )
325
+ log .Printf ("waiting for logs to be available, you can view job in this url: %v runId %v" , * logsUrl , * runId )
326
+ log .Printf ("......" )
327
+
328
+ for {
329
+ j , _ , err := client .Actions .GetWorkflowJobByID (context .Background (), repoOwner , repoName , * jobId )
330
+ if err != nil {
331
+ log .Printf ("GetWorkflowJobByID error: %v please view the logs in the job directly" , err )
332
+ os .Exit (1 )
333
+ }
334
+ if * j .Status == "completed" {
335
+ break
336
+ }
337
+ time .Sleep (time .Second * 1 )
338
+ }
339
+
340
+ logs , _ , err := client .Actions .GetWorkflowJobLogs (context .Background (), repoOwner , repoName , * jobId , 1 )
278
341
342
+ log .Printf ("streaming logs from remote job:" )
343
+ logsContent , err := GetUrlContents (logs .String ())
344
+
345
+ if err != nil {
346
+ log .Printf ("error while fetching logs: %v" , err )
347
+ os .Exit (1 )
348
+ }
349
+ cleanedLogs := cleanupDiggerOutput (logsContent )
350
+ log .Printf ("logsContent is: %v" , cleanedLogs )
279
351
},
280
352
}
281
353
0 commit comments