Skip to content

Commit 9b72be0

Browse files
authored
improve error reporting on the RunSpec function (#1679)
1 parent 62d43de commit 9b72be0

File tree

1 file changed

+46
-19
lines changed

1 file changed

+46
-19
lines changed

cli/pkg/spec/spec.go

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"github.com/diggerhq/digger/cli/pkg/digger"
66
"github.com/diggerhq/digger/cli/pkg/usage"
7+
backend2 "github.com/diggerhq/digger/libs/backendapi"
78
comment_summary "github.com/diggerhq/digger/libs/comment_utils/summary"
89
"github.com/diggerhq/digger/libs/digger_config"
910
"github.com/diggerhq/digger/libs/scheduler"
@@ -14,6 +15,15 @@ import (
1415
"time"
1516
)
1617

18+
func reportError(spec spec.Spec, backendApi backend2.Api, message string, err error) {
19+
log.Printf(message)
20+
_, reportingError := backendApi.ReportProjectJobStatus(spec.VCS.RepoName, spec.Job.ProjectName, spec.JobId, "failed", time.Now(), nil, "", "")
21+
if reportingError != nil {
22+
usage.ReportErrorAndExit(spec.VCS.RepoOwner, fmt.Sprintf("Failed to run commands. %v", err), 5)
23+
}
24+
usage.ReportErrorAndExit(spec.VCS.Actor, message, 1)
25+
}
26+
1727
func RunSpec(
1828
spec spec.Spec,
1929
vcsProvider spec.VCSProvider,
@@ -26,41 +36,50 @@ func RunSpec(
2636
commentUpdaterProvider comment_summary.CommentUpdaterProvider,
2737
) error {
2838

39+
backendApi, err := backedProvider.GetBackendApi(spec.Backend)
40+
if err != nil {
41+
log.Printf("could not get backend api: %v", err)
42+
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get backend api: %v", err), 1)
43+
}
44+
2945
job, err := jobProvider.GetJob(spec.Job)
3046
if err != nil {
31-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get job: %v", err), 1)
47+
message := fmt.Sprintf("could not get job: %v", err)
48+
reportError(spec, backendApi, message, err)
3249
}
3350

3451
lock, err := lockProvider.GetLock(spec.Lock)
3552
if err != nil {
36-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get job: %v", err), 1)
37-
53+
message := fmt.Sprintf("could not get lock provider: %v", err)
54+
reportError(spec, backendApi, message, err)
3855
}
3956

4057
prService, err := vcsProvider.GetPrService(spec.VCS)
4158
if err != nil {
42-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get prservice: %v", err), 1)
59+
message := fmt.Sprintf("could not get pr service: %v", err)
60+
reportError(spec, backendApi, message, err)
4361
}
4462

4563
orgService, err := vcsProvider.GetOrgService(spec.VCS)
4664
if err != nil {
47-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get orgservice: %v", err), 1)
48-
}
49-
reporter, err := reporterProvider.GetReporter(fmt.Sprintf("%v for %v", spec.Job.JobType, job.ProjectName), spec.Reporter, prService, *spec.Job.PullRequestNumber)
50-
if err != nil {
51-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get reporter: %v", err), 1)
65+
message := fmt.Sprintf("could not get org service: %v", err)
66+
reportError(spec, backendApi, message, err)
5267
}
5368

54-
backendApi, err := backedProvider.GetBackendApi(spec.Backend)
69+
reporter, err := reporterProvider.GetReporter(fmt.Sprintf("%v for %v", spec.Job.JobType, job.ProjectName), spec.Reporter, prService, *spec.Job.PullRequestNumber)
5570
if err != nil {
56-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get backend api: %v", err), 1)
71+
message := fmt.Sprintf("could not get reporter: %v", err)
72+
reportError(spec, backendApi, message, err)
5773
}
5874

5975
policyChecker, err := policyProvider.GetPolicyProvider(spec.Policy, spec.Backend.BackendHostname, spec.Backend.BackendOrganisationName, spec.Backend.BackendJobToken)
6076
if err != nil {
61-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get policy provider: %v", err), 1)
77+
message := fmt.Sprintf("could not get policy provider: %v", err)
78+
reportError(spec, backendApi, message, err)
6279
}
6380

81+
// TODO: avoid calling GetChangedFilesHere, avoid loading digger config entirely
82+
// also see below TODO to leverage variables provider and avoid passing it to commentUpdaterProvider
6483
changedFiles, err := prService.GetChangedFiles(*spec.Job.PullRequestNumber)
6584
if err != nil {
6685
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get changed files: %v", err), 1)
@@ -71,16 +90,20 @@ func RunSpec(
7190
}
7291
log.Printf("Digger digger_config read successfully\n")
7392

93+
// TODO: instead of passing diggerConfig we simply pass the renderMode needed by comment updater provider
7494
commentUpdater, err := commentUpdaterProvider.Get(*diggerConfig)
7595
if err != nil {
76-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get comment updater: %v", err), 8)
96+
message := fmt.Sprintf("could not get comment updater: %v", err)
97+
reportError(spec, backendApi, message, err)
7798
}
7899

79100
planStorage, err := PlanStorageProvider.GetPlanStorage(spec.VCS.RepoOwner, spec.VCS.RepoName, *spec.Job.PullRequestNumber)
80101
if err != nil {
81-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("could not get plan storage: %v", err), 8)
102+
message := fmt.Sprintf("could not get planStorage: %v", err)
103+
reportError(spec, backendApi, message, err)
82104
}
83105

106+
// TODO: make this part purely based on variables providers
84107
workflow := diggerConfig.Workflows[job.ProjectWorkflow]
85108
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars)
86109
job.StateEnvVars = lo.Assign(job.StateEnvVars, stateEnvVars)
@@ -91,29 +114,33 @@ func RunSpec(
91114
fullRepoName := fmt.Sprintf("%v-%v", spec.VCS.RepoOwner, spec.VCS.RepoName)
92115
_, err = backendApi.ReportProjectJobStatus(fullRepoName, spec.Job.ProjectName, spec.JobId, "started", time.Now(), nil, "", "")
93116
if err != nil {
94-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("Failed to report jobSpec status to backend. Exiting. %v", err), 4)
117+
message := fmt.Sprintf("Failed to report jobSpec status to backend. Exiting. %v", err)
118+
reportError(spec, backendApi, message, err)
95119
}
96120

97121
commentId := spec.CommentId
98122
if err != nil {
99-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("failed to get comment ID: %v", err), 4)
123+
message := fmt.Sprintf("failed to get comment ID: %v", err)
124+
reportError(spec, backendApi, message, err)
100125
}
101126

102127
currentDir, err := os.Getwd()
103128
if err != nil {
104-
usage.ReportErrorAndExit(spec.VCS.Actor, fmt.Sprintf("Failed to get current dir. %s", err), 4)
129+
message := fmt.Sprintf("Failed to get current dir. %s", err)
130+
reportError(spec, backendApi, message, err)
105131
}
106132

107133
reportTerraformOutput := spec.Reporter.ReportTerraformOutput
108134
allAppliesSuccess, _, err := digger.RunJobs(jobs, prService, orgService, lock, reporter, planStorage, policyChecker, commentUpdater, backendApi, spec.JobId, true, reportTerraformOutput, commentId, currentDir)
109135
if !allAppliesSuccess || err != nil {
110136
serializedBatch, reportingError := backendApi.ReportProjectJobStatus(spec.VCS.RepoName, spec.Job.ProjectName, spec.JobId, "failed", time.Now(), nil, "", "")
111137
if reportingError != nil {
112-
usage.ReportErrorAndExit(spec.VCS.RepoOwner, fmt.Sprintf("Failed run commands. %s", err), 5)
138+
message := fmt.Sprintf("Failed run commands. %s", err)
139+
reportError(spec, backendApi, message, err)
113140
}
114141
commentUpdater.UpdateComment(serializedBatch.Jobs, serializedBatch.PrNumber, prService, commentId)
115142
digger.UpdateAggregateStatus(serializedBatch, prService)
116-
usage.ReportErrorAndExit(spec.VCS.RepoOwner, fmt.Sprintf("Failed to run commands. %s", err), 5)
143+
reportError(spec, backendApi, fmt.Sprintf("Failed to run commands. %s", err), err)
117144
}
118145
usage.ReportErrorAndExit(spec.VCS.RepoOwner, "Digger finished successfully", 0)
119146

0 commit comments

Comments
 (0)