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+
1727func 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