Skip to content

Commit 4078f6f

Browse files
authored
(fix) unsuccessful plan and apply shouldn't report successful status (#292)
* fix unsuccesfull plans and applies reporting good status
1 parent de3436d commit 4078f6f

File tree

2 files changed

+39
-29
lines changed

2 files changed

+39
-29
lines changed

pkg/digger/digger.go

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -104,25 +104,23 @@ func RunCommandsPerProject(commandsPerProject []ProjectCommand, repoOwner string
104104
case "digger plan":
105105
utils.SendUsageRecord(repoOwner, eventName, "plan")
106106
ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/plan")
107-
err := diggerExecutor.Plan(prNumber)
107+
planPerformed, err := diggerExecutor.Plan(prNumber)
108108
if err != nil {
109109
log.Printf("Failed to run digger plan command. %v", err)
110110
ciService.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/plan")
111-
112111
return false, fmt.Errorf("failed to run digger plan command. %v", err)
113-
} else {
112+
} else if planPerformed {
114113
ciService.SetStatus(prNumber, "success", projectCommands.ProjectName+"/plan")
115114
}
116115
case "digger apply":
117116
utils.SendUsageRecord(repoName, eventName, "apply")
118117
ciService.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/apply")
119-
err := diggerExecutor.Apply(prNumber)
118+
applyPerformed, err := diggerExecutor.Apply(prNumber)
120119
if err != nil {
121120
log.Printf("Failed to run digger apply command. %v", err)
122121
ciService.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/apply")
123-
124122
return false, fmt.Errorf("failed to run digger apply command. %v", err)
125-
} else {
123+
} else if applyPerformed {
126124
ciService.SetStatus(prNumber, "success", projectCommands.ProjectName+"/apply")
127125
appliesPerProject[projectCommands.ProjectName] = true
128126
}
@@ -430,13 +428,13 @@ func (d DiggerExecutor) storedPlanFilePath() string {
430428
return path.Join(d.RepoOwner, d.planFileName())
431429
}
432430

433-
func (d DiggerExecutor) Plan(prNumber int) error {
434-
res, err := d.ProjectLock.Lock(prNumber)
431+
func (d DiggerExecutor) Plan(prNumber int) (bool, error) {
432+
locked, err := d.ProjectLock.Lock(prNumber)
435433
if err != nil {
436-
return fmt.Errorf("error locking project: %v", err)
434+
return false, fmt.Errorf("error locking project: %v", err)
437435
}
438-
log.Printf("Lock result: %t\n", res)
439-
if res {
436+
log.Printf("Lock result: %t\n", locked)
437+
if locked {
440438
var planSteps []configuration.Step
441439

442440
if d.PlanStage != nil {
@@ -455,32 +453,32 @@ func (d DiggerExecutor) Plan(prNumber int) error {
455453
if step.Action == "init" {
456454
_, _, err := d.TerraformExecutor.Init(step.ExtraArgs, d.StateEnvVars)
457455
if err != nil {
458-
return fmt.Errorf("error running init: %v", err)
456+
return false, fmt.Errorf("error running init: %v", err)
459457
}
460458
}
461459
if step.Action == "plan" {
462460
planArgs := []string{"-out", d.planFileName()}
463461
planArgs = append(planArgs, step.ExtraArgs...)
464462
isNonEmptyPlan, stdout, stderr, err := d.TerraformExecutor.Plan(planArgs, d.CommandEnvVars)
465463
if err != nil {
466-
return fmt.Errorf("error executing plan: %v", err)
464+
return false, fmt.Errorf("error executing plan: %v", err)
467465
}
468466
if d.PlanStorage != nil {
469467
planExists, err := d.PlanStorage.PlanExists(d.storedPlanFilePath())
470468
if err != nil {
471-
return fmt.Errorf("error checking if plan exists: %v", err)
469+
return false, fmt.Errorf("error checking if plan exists: %v", err)
472470
}
473471

474472
if planExists {
475473
err = d.PlanStorage.DeleteStoredPlan(d.storedPlanFilePath())
476474
if err != nil {
477-
return fmt.Errorf("error deleting plan: %v", err)
475+
return false, fmt.Errorf("error deleting plan: %v", err)
478476
}
479477
}
480478

481479
err = d.PlanStorage.StorePlan(d.localPlanFilePath(), d.storedPlanFilePath())
482480
if err != nil {
483-
return fmt.Errorf("error storing plan: %v", err)
481+
return false, fmt.Errorf("error storing plan: %v", err)
484482
}
485483
}
486484
plan := cleanupTerraformPlan(isNonEmptyPlan, err, stdout, stderr)
@@ -496,34 +494,41 @@ func (d DiggerExecutor) Plan(prNumber int) error {
496494
log.Printf("Running %v for **%v**\n", step.Value, d.ProjectLock.LockId())
497495
_, _, err := d.CommandRunner.Run(d.ProjectPath, step.Shell, commands)
498496
if err != nil {
499-
return fmt.Errorf("error running command: %v", err)
497+
return false, fmt.Errorf("error running command: %v", err)
500498
}
501499
}
502500
}
501+
return true, nil
503502
}
504-
return nil
503+
return false, nil
505504
}
506505

507-
func (d DiggerExecutor) Apply(prNumber int) error {
506+
func (d DiggerExecutor) Apply(prNumber int) (bool, error) {
508507
var plansFilename *string
509508
if d.PlanStorage != nil {
510509
var err error
511510
plansFilename, err = d.PlanStorage.RetrievePlan(d.localPlanFilePath(), d.storedPlanFilePath())
512511
if err != nil {
513-
return fmt.Errorf("error retrieving plan: %v", err)
512+
return false, fmt.Errorf("error retrieving plan: %v", err)
514513
}
515514
}
516515

517516
isMergeable, err := d.CIService.IsMergeable(prNumber)
518517
if err != nil {
519-
return fmt.Errorf("error validating is PR is mergeable: %v", err)
518+
return false, fmt.Errorf("error validating is PR is mergeable: %v", err)
520519
}
521520
if !isMergeable {
522521
comment := "Cannot perform Apply since the PR is not currently mergeable."
523522
d.CIService.PublishComment(prNumber, comment)
523+
return false, nil
524524
} else {
525+
locked, err := d.ProjectLock.Lock(prNumber)
526+
527+
if err != nil {
528+
return false, fmt.Errorf("error locking project: %v", err)
529+
}
525530

526-
if res, _ := d.ProjectLock.Lock(prNumber); res {
531+
if locked {
527532
var applySteps []configuration.Step
528533

529534
if d.ApplyStage != nil {
@@ -543,7 +548,7 @@ func (d DiggerExecutor) Apply(prNumber int) error {
543548
if step.Action == "init" {
544549
_, _, err := d.TerraformExecutor.Init(step.ExtraArgs, d.StateEnvVars)
545550
if err != nil {
546-
return fmt.Errorf("error running init: %v", err)
551+
return false, fmt.Errorf("error running init: %v", err)
547552
}
548553
}
549554
if step.Action == "apply" {
@@ -553,7 +558,7 @@ func (d DiggerExecutor) Apply(prNumber int) error {
553558
d.CIService.PublishComment(prNumber, comment)
554559
if err != nil {
555560
d.CIService.PublishComment(prNumber, "Error during applying.")
556-
return fmt.Errorf("error executing apply: %v", err)
561+
return false, fmt.Errorf("error executing apply: %v", err)
557562
}
558563
}
559564
if step.Action == "run" {
@@ -565,13 +570,15 @@ func (d DiggerExecutor) Apply(prNumber int) error {
565570
log.Printf("Running %v for **%v**\n", step.Value, d.ProjectLock.LockId())
566571
_, _, err := d.CommandRunner.Run(d.ProjectPath, step.Shell, commands)
567572
if err != nil {
568-
return fmt.Errorf("error running command: %v", err)
573+
return false, fmt.Errorf("error running command: %v", err)
569574
}
570575
}
571576
}
577+
return true, nil
578+
} else {
579+
return false, nil
572580
}
573581
}
574-
return nil
575582
}
576583

577584
func (d DiggerExecutor) Unlock(prNumber int) error {

pkg/gitlab/gitlab.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -370,24 +370,27 @@ func RunCommandsPerProject(commandsPerProject []digger.ProjectCommand, gitLabCon
370370
case "digger plan":
371371
utils.SendUsageRecord(repoOwner, eventName, "plan")
372372
service.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/plan")
373-
err := diggerExecutor.Plan(prNumber)
373+
planPerformed, err := diggerExecutor.Plan(prNumber)
374374
if err != nil {
375375
log.Printf("Failed to run digger plan command. %v", err)
376376
service.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/plan")
377377

378378
return false, fmt.Errorf("failed to run digger plan command. %v", err)
379+
} else if !planPerformed {
380+
service.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/plan")
379381
} else {
380382
service.SetStatus(prNumber, "success", projectCommands.ProjectName+"/plan")
381383
}
382384
case "digger apply":
383385
utils.SendUsageRecord(repoName, eventName, "apply")
384386
service.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/apply")
385-
err := diggerExecutor.Apply(prNumber)
387+
applyPerformed, err := diggerExecutor.Apply(prNumber)
386388
if err != nil {
387389
log.Printf("Failed to run digger apply command. %v", err)
388390
service.SetStatus(prNumber, "failure", projectCommands.ProjectName+"/apply")
389-
390391
return false, fmt.Errorf("failed to run digger apply command. %v", err)
392+
} else if !applyPerformed {
393+
service.SetStatus(prNumber, "pending", projectCommands.ProjectName+"/apply")
391394
} else {
392395
service.SetStatus(prNumber, "success", projectCommands.ProjectName+"/apply")
393396
appliesPerProject[projectCommands.ProjectName] = true

0 commit comments

Comments
 (0)