Skip to content

Commit c595361

Browse files
move status checks to backend (#2126)
* move aggregate status checks to backend * fix build * Update backend/controllers/projects.go Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update backend/controllers/projects.go Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update backend/controllers/projects_helpers.go Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * log error when save fails * remove rest of cli checks --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
1 parent 6e6c1b8 commit c595361

File tree

8 files changed

+161
-63
lines changed

8 files changed

+161
-63
lines changed

backend/controllers/projects.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,47 @@ func (d DiggerController) SetJobStatusForProject(c *gin.Context) {
970970
return
971971
}
972972

973+
refreshedBatch, err := models.DB.GetDiggerBatch(&batch.ID)
974+
if err != nil {
975+
slog.Error("Error getting refreshed batch",
976+
"batchId", batch.ID,
977+
"error", err,
978+
)
979+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error getting refreshed batch"})
980+
return
981+
}
982+
err = UpdateCheckStatusForBatch(d.GithubClientProvider, refreshedBatch)
983+
if err != nil {
984+
slog.Error("Error updating check status",
985+
"batchId", batch.ID,
986+
"batchId", batch.ID,
987+
"error", err,
988+
)
989+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error updating aggregate status check"})
990+
return
991+
}
992+
993+
refreshedJob, err := models.DB.GetDiggerJob(jobId)
994+
if err != nil {
995+
slog.Error("Error getting refreshed job",
996+
"jobId", jobId,
997+
"error", err,
998+
)
999+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error getting refreshed job"})
1000+
return
1001+
}
1002+
err = UpdateCheckStatusForJob(d.GithubClientProvider, refreshedJob)
1003+
if err != nil {
1004+
slog.Error("Error updating check status",
1005+
"jobId", jobId,
1006+
"batchId", batch.ID,
1007+
"jobId", jobId,
1008+
"error", err,
1009+
)
1010+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Error updating aggregate status check"})
1011+
return
1012+
}
1013+
9731014
if batch.ReportTerraformOutputs {
9741015
slog.Info("Generating Terraform outputs summary", "batchId", batch.ID)
9751016
err = CreateTerraformOutputsSummary(d.GithubClientProvider, batch)
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package controllers
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/diggerhq/digger/backend/models"
7+
"github.com/diggerhq/digger/backend/utils"
8+
orchestrator_scheduler "github.com/diggerhq/digger/libs/scheduler"
9+
"log/slog"
10+
)
11+
12+
func UpdateCheckStatusForBatch(gh utils.GithubClientProvider, batch *models.DiggerBatch) error {
13+
slog.Info("Updating PR status for batch",
14+
"batchId", batch.ID,
15+
"prNumber", batch.PrNumber,
16+
"batchStatus", batch.Status,
17+
"batchType", batch.BatchType,
18+
)
19+
20+
prService, err := utils.GetPrServiceFromBatch(batch, gh)
21+
if err != nil {
22+
slog.Error("Error getting PR service",
23+
"batchId", batch.ID,
24+
"error", err,
25+
)
26+
return fmt.Errorf("error getting github service: %v", err)
27+
}
28+
29+
isPlanBatch := batch.BatchType == orchestrator_scheduler.DiggerCommandPlan
30+
31+
serializedBatch, err := batch.MapToJsonStruct()
32+
if err != nil {
33+
slog.Error("Error mapping batch to json struct",
34+
"batchId", batch.ID,
35+
"error", err,
36+
)
37+
return fmt.Errorf("error mapping batch to json struct: %v", err)
38+
}
39+
slog.Debug("Updating PR status for batch",
40+
"batchId", batch.ID, "prNumber", batch.PrNumber, "batchStatus", batch.Status, "batchType", batch.BatchType,
41+
"newStatus", serializedBatch.ToStatusCheck())
42+
if isPlanBatch {
43+
prService.SetStatus(batch.PrNumber, serializedBatch.ToStatusCheck(), "digger/plan")
44+
prService.SetStatus(batch.PrNumber, "pending", "digger/apply")
45+
} else {
46+
prService.SetStatus(batch.PrNumber, "success", "digger/plan")
47+
prService.SetStatus(batch.PrNumber, serializedBatch.ToStatusCheck(), "digger/apply")
48+
}
49+
return nil
50+
}
51+
52+
func UpdateCheckStatusForJob(gh utils.GithubClientProvider, job *models.DiggerJob) error {
53+
batch := job.Batch
54+
slog.Info("Updating PR status for job",
55+
"jobId", job.DiggerJobID,
56+
"prNumber", batch.PrNumber,
57+
"jobStatus", job.Status,
58+
"batchType", batch.BatchType,
59+
)
60+
61+
prService, err := utils.GetPrServiceFromBatch(batch, gh)
62+
if err != nil {
63+
slog.Error("Error getting PR service",
64+
"batchId", batch.ID,
65+
"error", err,
66+
)
67+
return fmt.Errorf("error getting github service: %v", err)
68+
}
69+
70+
var jobSpec orchestrator_scheduler.JobJson
71+
err = json.Unmarshal([]byte(job.SerializedJobSpec), &jobSpec)
72+
if err != nil {
73+
slog.Error("Could not unmarshal job spec", "jobId", job.DiggerJobID, "error", err)
74+
return fmt.Errorf("could not unmarshal json string: %v", err)
75+
}
76+
77+
isPlan := jobSpec.IsPlan()
78+
status, err := models.GetStatusCheckForJob(job)
79+
if err != nil {
80+
return fmt.Errorf("could not get status check for job: %v", err)
81+
}
82+
slog.Debug("Updating PR status for job", "jobId", job.DiggerJobID, "status", status)
83+
if isPlan {
84+
prService.SetStatus(batch.PrNumber, status, jobSpec.GetProjectAlias()+"/plan")
85+
prService.SetStatus(batch.PrNumber, "neutral", jobSpec.GetProjectAlias()+"/apply")
86+
} else {
87+
//prService.SetStatus(batch.PrNumber, "success", jobSpec.GetProjectAlias()+"/plan")
88+
prService.SetStatus(batch.PrNumber, status, jobSpec.GetProjectAlias()+"/apply")
89+
}
90+
return nil
91+
}

backend/models/scheduler.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,19 @@ func (b *DiggerBatch) MapToJsonStruct() (orchestrator_scheduler.SerializedBatch,
184184

185185
return res, nil
186186
}
187+
188+
func GetStatusCheckForJob(job *DiggerJob) (string, error) {
189+
switch job.Status {
190+
case orchestrator_scheduler.DiggerJobStarted:
191+
return "pending", nil
192+
case orchestrator_scheduler.DiggerJobTriggered:
193+
return "pending", nil
194+
case orchestrator_scheduler.DiggerJobCreated:
195+
return "pending", nil
196+
case orchestrator_scheduler.DiggerJobSucceeded:
197+
return "success", nil
198+
case orchestrator_scheduler.DiggerJobFailed:
199+
return "failed", nil
200+
}
201+
return "", fmt.Errorf("unknown job status: %v", job.Status)
202+
}

backend/models/storage.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,10 @@ func (db *Database) UpdateBatchStatus(batch *DiggerBatch) error {
856856
}
857857
if allJobsSucceeded == true {
858858
batch.Status = scheduler.BatchJobSucceeded
859+
result := db.GormDB.Save(batch)
860+
if result.Error != nil {
861+
slog.Error("failed to update batch status", "batchId", batchId, "error", result.Error)
862+
}
859863
slog.Info("all jobs succeeded, marking batch as succeeded",
860864
"batchId", batchId,
861865
"jobCount", len(diggerJobs))

cli/pkg/digger/digger.go

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,6 @@ func RunJobs(jobs []orchestrator.Job, prService ci.PullRequestService, orgServic
153153
slog.Error("error Updating status comment", "error", err)
154154
return false, false, err
155155
}
156-
err = UpdateAggregateStatus(batchResult, prService)
157-
if err != nil {
158-
slog.Error("error updating aggregate status check", "error", err)
159-
return false, false, err
160-
}
161156

162157
}
163158

@@ -265,21 +260,11 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
265260
if err != nil {
266261
slog.Error("failed to send usage report", "error", err)
267262
}
268-
err = prService.SetStatus(*job.PullRequestNumber, "pending", job.GetProjectAlias()+"/plan")
269-
if err != nil {
270-
msg := fmt.Sprintf("Failed to set PR status. %v", err)
271-
return nil, msg, fmt.Errorf("%s", msg)
272-
}
273263
planSummary, planPerformed, isNonEmptyPlan, plan, planJsonOutput, err := diggerExecutor.Plan()
274264

275265
if err != nil {
276266
msg := fmt.Sprintf("Failed to Run digger plan command. %v", err)
277267
slog.Error("Failed to Run digger plan command", "error", err)
278-
err := prService.SetStatus(*job.PullRequestNumber, "failure", job.GetProjectAlias()+"/plan")
279-
if err != nil {
280-
msg := fmt.Sprintf("Failed to set PR status. %v", err)
281-
return nil, msg, fmt.Errorf("%s", msg)
282-
}
283268

284269
return nil, msg, fmt.Errorf("%s", msg)
285270
} else if planPerformed {
@@ -333,11 +318,7 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
333318
} else {
334319
reportEmptyPlanOutput(reporter, projectLock.LockId())
335320
}
336-
err := prService.SetStatus(*job.PullRequestNumber, "success", job.GetProjectAlias()+"/plan")
337-
if err != nil {
338-
msg := fmt.Sprintf("Failed to set PR status. %v", err)
339-
return nil, msg, fmt.Errorf("%s", msg)
340-
}
321+
341322
result := execution.DiggerExecutorResult{
342323
OperationType: execution.DiggerOparationTypePlan,
343324
TerraformOutput: plan,
@@ -354,11 +335,6 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
354335
if err != nil {
355336
slog.Error("failed to send usage report.", "error", err)
356337
}
357-
err = prService.SetStatus(*job.PullRequestNumber, "pending", job.GetProjectAlias()+"/apply")
358-
if err != nil {
359-
msg := fmt.Sprintf("Failed to set PR status. %v", err)
360-
return nil, msg, fmt.Errorf("%s", msg)
361-
}
362338

363339
isMerged, err := prService.IsMerged(*job.PullRequestNumber)
364340
if err != nil {
@@ -375,7 +351,6 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
375351
slog.Info("PR status Information", "mergeable", isMergeable, "merged", isMerged, "skipMergeCheck", job.SkipMergeCheck)
376352
if !isMergeable && !isMerged && !job.SkipMergeCheck {
377353
comment := reportApplyMergeabilityError(reporter)
378-
prService.SetStatus(*job.PullRequestNumber, "failure", job.GetProjectAlias()+"/apply")
379354

380355
return nil, comment, fmt.Errorf("%s", comment)
381356
} else {
@@ -421,19 +396,10 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
421396
if err != nil {
422397
//TODO reuse executor error handling
423398
slog.Error("Failed to Run digger apply command.", "error", err)
424-
err := prService.SetStatus(*job.PullRequestNumber, "failure", job.GetProjectAlias()+"/apply")
425-
if err != nil {
426-
msg := fmt.Sprintf("Failed to set PR status. %v", err)
427-
return nil, msg, fmt.Errorf("%s", msg)
428-
}
399+
429400
msg := fmt.Sprintf("Failed to run digger apply command. %v", err)
430401
return nil, msg, fmt.Errorf("%s", msg)
431402
} else if applyPerformed {
432-
err := prService.SetStatus(*job.PullRequestNumber, "success", job.GetProjectAlias()+"/apply")
433-
if err != nil {
434-
msg := fmt.Sprintf("Failed to set PR status. %v", err)
435-
return nil, msg, fmt.Errorf("%s", msg)
436-
}
437403
appliesPerProject[job.ProjectName] = true
438404
}
439405
result := execution.DiggerExecutorResult{

cli/pkg/digger/io.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

cli/pkg/spec/spec.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ func RunSpec(
164164
reportError(spec, backendApi, message, err)
165165
}
166166
commentUpdater.UpdateComment(serializedBatch.Jobs, serializedBatch.PrNumber, prService, commentId)
167-
digger.UpdateAggregateStatus(serializedBatch, prService)
168167
reportError(spec, backendApi, fmt.Sprintf("failed to run commands %v", err), err)
169168
}
170169
usage.ReportErrorAndExit(spec.VCS.RepoOwner, "Digger finished successfully", 0)

libs/scheduler/json_models.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ func (j *JobJson) IsApply() bool {
6161
return slices.Contains(j.Commands, "digger apply")
6262
}
6363

64+
func (j *JobJson) GetProjectAlias() string {
65+
if j.ProjectAlias != "" {
66+
return j.ProjectAlias
67+
}
68+
return j.ProjectName
69+
}
70+
6471
func JobToJson(job Job, jobType DiggerCommand, organisationName string, branch string, commitSha string, jobToken string, backendHostname string, project digger_config.Project) JobJson {
6572
stateRole, commandRole, region := "", "", ""
6673

0 commit comments

Comments
 (0)