4
4
"fmt"
5
5
"github.com/diggerhq/digger/cli/pkg/digger"
6
6
"github.com/diggerhq/digger/cli/pkg/usage"
7
+ backend2 "github.com/diggerhq/digger/libs/backendapi"
7
8
comment_summary "github.com/diggerhq/digger/libs/comment_utils/summary"
8
9
"github.com/diggerhq/digger/libs/digger_config"
9
10
"github.com/diggerhq/digger/libs/scheduler"
@@ -14,6 +15,15 @@ import (
14
15
"time"
15
16
)
16
17
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
+
17
27
func RunSpec (
18
28
spec spec.Spec ,
19
29
vcsProvider spec.VCSProvider ,
@@ -26,41 +36,50 @@ func RunSpec(
26
36
commentUpdaterProvider comment_summary.CommentUpdaterProvider ,
27
37
) error {
28
38
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
+
29
45
job , err := jobProvider .GetJob (spec .Job )
30
46
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 )
32
49
}
33
50
34
51
lock , err := lockProvider .GetLock (spec .Lock )
35
52
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 )
38
55
}
39
56
40
57
prService , err := vcsProvider .GetPrService (spec .VCS )
41
58
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 )
43
61
}
44
62
45
63
orgService , err := vcsProvider .GetOrgService (spec .VCS )
46
64
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 )
52
67
}
53
68
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 )
55
70
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 )
57
73
}
58
74
59
75
policyChecker , err := policyProvider .GetPolicyProvider (spec .Policy , spec .Backend .BackendHostname , spec .Backend .BackendOrganisationName , spec .Backend .BackendJobToken )
60
76
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 )
62
79
}
63
80
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
64
83
changedFiles , err := prService .GetChangedFiles (* spec .Job .PullRequestNumber )
65
84
if err != nil {
66
85
usage .ReportErrorAndExit (spec .VCS .Actor , fmt .Sprintf ("could not get changed files: %v" , err ), 1 )
@@ -71,16 +90,20 @@ func RunSpec(
71
90
}
72
91
log .Printf ("Digger digger_config read successfully\n " )
73
92
93
+ // TODO: instead of passing diggerConfig we simply pass the renderMode needed by comment updater provider
74
94
commentUpdater , err := commentUpdaterProvider .Get (* diggerConfig )
75
95
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 )
77
98
}
78
99
79
100
planStorage , err := PlanStorageProvider .GetPlanStorage (spec .VCS .RepoOwner , spec .VCS .RepoName , * spec .Job .PullRequestNumber )
80
101
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 )
82
104
}
83
105
106
+ // TODO: make this part purely based on variables providers
84
107
workflow := diggerConfig .Workflows [job .ProjectWorkflow ]
85
108
stateEnvVars , commandEnvVars := digger_config .CollectTerraformEnvConfig (workflow .EnvVars )
86
109
job .StateEnvVars = lo .Assign (job .StateEnvVars , stateEnvVars )
@@ -91,29 +114,33 @@ func RunSpec(
91
114
fullRepoName := fmt .Sprintf ("%v-%v" , spec .VCS .RepoOwner , spec .VCS .RepoName )
92
115
_ , err = backendApi .ReportProjectJobStatus (fullRepoName , spec .Job .ProjectName , spec .JobId , "started" , time .Now (), nil , "" , "" )
93
116
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 )
95
119
}
96
120
97
121
commentId := spec .CommentId
98
122
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 )
100
125
}
101
126
102
127
currentDir , err := os .Getwd ()
103
128
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 )
105
131
}
106
132
107
133
reportTerraformOutput := spec .Reporter .ReportTerraformOutput
108
134
allAppliesSuccess , _ , err := digger .RunJobs (jobs , prService , orgService , lock , reporter , planStorage , policyChecker , commentUpdater , backendApi , spec .JobId , true , reportTerraformOutput , commentId , currentDir )
109
135
if ! allAppliesSuccess || err != nil {
110
136
serializedBatch , reportingError := backendApi .ReportProjectJobStatus (spec .VCS .RepoName , spec .Job .ProjectName , spec .JobId , "failed" , time .Now (), nil , "" , "" )
111
137
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 )
113
140
}
114
141
commentUpdater .UpdateComment (serializedBatch .Jobs , serializedBatch .PrNumber , prService , commentId )
115
142
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 )
117
144
}
118
145
usage .ReportErrorAndExit (spec .VCS .RepoOwner , "Digger finished successfully" , 0 )
119
146
0 commit comments