Skip to content

Commit c278914

Browse files
authored
Merge pull request #1721 from ben-of-codecraft/feature/skip-merge-workflow-option
Feature: Added in skip_merge_check option to workflow configuration
2 parents 0b17bfe + 4610ebe commit c278914

File tree

14 files changed

+104
-8
lines changed

14 files changed

+104
-8
lines changed

cli/pkg/digger/digger.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,10 @@ func run(command string, job orchestrator.Job, policyChecker policy.Checker, org
358358
msg := fmt.Sprintf("Failed to check if PR is mergeable. %v", err)
359359
return nil, msg, fmt.Errorf(msg)
360360
}
361-
log.Printf("PR status, mergeable: %v, merged: %v\n", isMergeable, isMerged)
362-
if !isMergeable && !isMerged {
361+
log.Printf("PR status, mergeable: %v, merged: %v and skipMergeCheck %v\n", isMergeable, isMerged, job.SkipMergeCheck)
362+
if !isMergeable && !isMerged && !job.SkipMergeCheck {
363363
comment := reportApplyMergeabilityError(reporter)
364+
prService.SetStatus(*job.PullRequestNumber, "failure", job.ProjectName+"/apply")
364365

365366
return nil, comment, fmt.Errorf(comment)
366367
} else {
@@ -633,7 +634,7 @@ func RunJob(
633634
return fmt.Errorf(msg)
634635
}
635636
planIsAllowed, messages, err := policyChecker.CheckPlanPolicy(SCMrepository, SCMOrganisation, job.ProjectName, job.ProjectDir, planJsonOutput)
636-
log.Printf(strings.Join(messages, "\n"))
637+
log.Print(strings.Join(messages, "\n"))
637638
if err != nil {
638639
msg := fmt.Sprintf("Failed to validate plan %v", err)
639640
log.Printf(msg)

docs/ce/reference/digger.yml.mdx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,12 @@ workflows:
175175

176176
### WorkflowConfiguration
177177

178-
| Key | Type | Default | Required | Description | Notes |
179-
| ---------------------- | ----------------------------------------------------------------------- | ------- | -------- | ------------------------------------------------------------- | ----- |
180-
| on_pull_request_pushed | array of enums\[digger plan, digger apply, digger lock, digger unlock\] | \[\] | no | list of stages to run when pull request is pushed | |
181-
| on_pull_request_closed | array of enums\[digger plan, digger apply, digger lock, digger unlock\] | \[\] | no | list of stages to run when pull request is closed | |
182-
| on_commit_to_default | array of enums\[digger plan, digger apply, digger lock, digger unlock\] | \[\] | no | list of stages to run when commit is pushed to default branch | |
178+
| Key | Type | Default | Required | Description | Notes |
179+
| ---------------------- | ----------------------------------------------------------------------- | ------- | -------- | -------------------------------------------------------------------- | ----- |
180+
| on_pull_request_pushed | array of enums\[digger plan, digger apply, digger lock, digger unlock\] | \[\] | no | list of stages to run when pull request is pushed | |
181+
| on_pull_request_closed | array of enums\[digger plan, digger apply, digger lock, digger unlock\] | \[\] | no | list of stages to run when pull request is closed | |
182+
| on_commit_to_default | array of enums\[digger plan, digger apply, digger lock, digger unlock\] | \[\] | no | list of stages to run when commit is pushed to default branch | |
183+
| skip_merge_check | boolean | false | no | Allow a workflow to skip mergeability checks and run digger commands | |
183184

184185
### Step
185186

libs/ci/azure/azure.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,9 @@ func ProcessAzureReposEvent(azureEvent interface{}, diggerConfig *digger_config2
433433
func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []digger_config2.Project, requestedProject *digger_config2.Project, workflows map[string]digger_config2.Workflow) ([]scheduler.Job, bool, error) {
434434
jobs := make([]scheduler.Job, 0)
435435
//&dependencyGraph, diggerProjectNamespace, parsedAzureContext.BaseUrl, parsedAzureContext.EventType, prNumber,
436+
437+
438+
436439
switch parseAzureContext.EventType {
437440
case AzurePrCreated, AzurePrUpdated, AzurePrReopened:
438441
for _, project := range impactedProjects {
@@ -441,6 +444,13 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
441444
return nil, false, fmt.Errorf("failed to find workflow digger_config '%s' for project '%s'", project.Workflow, project.Name)
442445
}
443446

447+
var skipMerge bool
448+
if workflow.Configuration != nil {
449+
skipMerge = workflow.Configuration.SkipMergeCheck
450+
} else {
451+
skipMerge = false
452+
}
453+
444454
prNumber := parseAzureContext.Event.(AzurePrEvent).Resource.PullRequestId
445455
stateEnvVars, commandEnvVars := digger_config2.CollectTerraformEnvConfig(workflow.EnvVars, true)
446456
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
@@ -461,6 +471,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
461471
CommandEnvVars: commandEnvVars,
462472
StateEnvProvider: StateEnvProvider,
463473
CommandEnvProvider: CommandEnvProvider,
474+
SkipMergeCheck: skipMerge,
464475
})
465476
}
466477
return jobs, true, nil
@@ -471,6 +482,13 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
471482
return nil, false, fmt.Errorf("failed to find workflow digger_config '%s' for project '%s'", project.Workflow, project.Name)
472483
}
473484

485+
var skipMerge bool
486+
if workflow.Configuration != nil {
487+
skipMerge = workflow.Configuration.SkipMergeCheck
488+
} else {
489+
skipMerge = false
490+
}
491+
474492
prNumber := parseAzureContext.Event.(AzurePrEvent).Resource.PullRequestId
475493
stateEnvVars, commandEnvVars := digger_config2.CollectTerraformEnvConfig(workflow.EnvVars, true)
476494
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
@@ -491,6 +509,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
491509
CommandEnvVars: commandEnvVars,
492510
StateEnvProvider: StateEnvProvider,
493511
CommandEnvProvider: CommandEnvProvider,
512+
SkipMergeCheck: skipMerge,
494513
})
495514
}
496515
return jobs, true, nil
@@ -502,6 +521,14 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
502521
if !ok {
503522
return nil, false, fmt.Errorf("failed to find workflow digger_config '%s' for project '%s'", project.Workflow, project.Name)
504523
}
524+
525+
var skipMerge bool
526+
if workflow.Configuration != nil {
527+
skipMerge = workflow.Configuration.SkipMergeCheck
528+
} else {
529+
skipMerge = false
530+
}
531+
505532
stateEnvVars, commandEnvVars := digger_config2.CollectTerraformEnvConfig(workflow.EnvVars, true)
506533
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
507534
jobs = append(jobs, scheduler.Job{
@@ -521,6 +548,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
521548
CommandEnvVars: commandEnvVars,
522549
StateEnvProvider: StateEnvProvider,
523550
CommandEnvProvider: CommandEnvProvider,
551+
SkipMergeCheck: skipMerge,
524552
})
525553
}
526554
return jobs, true, nil
@@ -557,6 +585,14 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
557585
if !ok {
558586
return nil, false, fmt.Errorf("failed to find workflow digger_config '%s' for project '%s'", project.Workflow, project.Name)
559587
}
588+
589+
var skipMerge bool
590+
if workflow.Configuration != nil {
591+
skipMerge = workflow.Configuration.SkipMergeCheck
592+
} else {
593+
skipMerge = false
594+
}
595+
560596
stateEnvVars, commandEnvVars := digger_config2.CollectTerraformEnvConfig(workflow.EnvVars, true)
561597
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
562598
jobs = append(jobs, scheduler.Job{
@@ -576,6 +612,7 @@ func ConvertAzureEventToCommands(parseAzureContext Azure, impactedProjects []dig
576612
CommandEnvVars: commandEnvVars,
577613
StateEnvProvider: StateEnvProvider,
578614
CommandEnvProvider: CommandEnvProvider,
615+
SkipMergeCheck: skipMerge,
579616
})
580617
}
581618
}

libs/ci/generic/events.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ func CreateJobsForProjects(projects []digger_config.Project, command string, eve
147147
return nil, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
148148
}
149149

150+
var skipMerge bool
151+
if workflow.Configuration != nil {
152+
skipMerge = workflow.Configuration.SkipMergeCheck
153+
} else {
154+
skipMerge = false
155+
}
156+
150157
runEnvVars := GetRunEnvVars(defaultBranch, prBranch, project.Name, project.Dir)
151158
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars, false)
152159
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
@@ -170,6 +177,7 @@ func CreateJobsForProjects(projects []digger_config.Project, command string, eve
170177
RequestedBy: requestedBy,
171178
StateEnvProvider: StateEnvProvider,
172179
CommandEnvProvider: CommandEnvProvider,
180+
SkipMergeCheck: skipMerge,
173181
})
174182
}
175183
return jobs, nil

libs/ci/github/github.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,13 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
445445
return nil, false, fmt.Errorf("failed to find workflow config '%s' for project '%s'", project.Workflow, project.Name)
446446
}
447447

448+
var skipMerge bool
449+
if workflow.Configuration != nil {
450+
skipMerge = workflow.Configuration.SkipMergeCheck
451+
} else {
452+
skipMerge = false
453+
}
454+
448455
runEnvVars := generic.GetRunEnvVars(defaultBranch, prBranch, project.Name, project.Dir)
449456

450457
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars, performEnvVarInterpolation)
@@ -471,6 +478,7 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
471478
RequestedBy: *payload.Sender.Login,
472479
CommandEnvProvider: CommandEnvProvider,
473480
StateEnvProvider: StateEnvProvider,
481+
SkipMergeCheck: skipMerge,
474482
})
475483
} else if *payload.Action == "opened" || *payload.Action == "reopened" || *payload.Action == "synchronize" {
476484
jobs = append(jobs, scheduler.Job{
@@ -492,6 +500,7 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
492500
RequestedBy: *payload.Sender.Login,
493501
CommandEnvProvider: CommandEnvProvider,
494502
StateEnvProvider: StateEnvProvider,
503+
SkipMergeCheck: skipMerge,
495504
})
496505
} else if *payload.Action == "closed" {
497506
jobs = append(jobs, scheduler.Job{
@@ -513,6 +522,7 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
513522
RequestedBy: *payload.Sender.Login,
514523
CommandEnvProvider: CommandEnvProvider,
515524
StateEnvProvider: StateEnvProvider,
525+
SkipMergeCheck: skipMerge,
516526
})
517527
} else if *payload.Action == "converted_to_draft" {
518528
var commands []string
@@ -541,6 +551,7 @@ func ConvertGithubPullRequestEventToJobs(payload *github.PullRequestEvent, impac
541551
RequestedBy: *payload.Sender.Login,
542552
CommandEnvProvider: CommandEnvProvider,
543553
StateEnvProvider: StateEnvProvider,
554+
SkipMergeCheck: skipMerge,
544555
})
545556
}
546557

libs/ci/gitlab/gitlab.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,13 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex
357357
return nil, true, fmt.Errorf("failed to find workflow digger_config '%s' for project '%s'", project.Workflow, project.Name)
358358
}
359359

360+
var skipMerge bool
361+
if workflow.Configuration != nil {
362+
skipMerge = workflow.Configuration.SkipMergeCheck
363+
} else {
364+
skipMerge = false
365+
}
366+
360367
stateEnvVars, commandEnvVars := digger_config.CollectTerraformEnvConfig(workflow.EnvVars, true)
361368
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
362369
jobs = append(jobs, scheduler.Job{
@@ -376,6 +383,7 @@ func ConvertGitLabEventToCommands(event GitLabEvent, gitLabContext *GitLabContex
376383
CommandEnvVars: commandEnvVars,
377384
StateEnvProvider: StateEnvProvider,
378385
CommandEnvProvider: CommandEnvProvider,
386+
SkipMergeCheck: skipMerge,
379387
})
380388
}
381389
return jobs, true, nil

libs/ci/gitlab/webhooks.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ func ConvertGithubPullRequestEventToJobs(payload *gitlab.MergeEvent, impactedPro
5151
namespace := payload.Project.PathWithNamespace
5252
sender := payload.User.Username
5353

54+
55+
var skipMerge bool
56+
if workflow.Configuration != nil {
57+
skipMerge = workflow.Configuration.SkipMergeCheck
58+
} else {
59+
skipMerge = false
60+
}
61+
5462
StateEnvProvider, CommandEnvProvider := scheduler.GetStateAndCommandProviders(project)
5563
if payload.ObjectAttributes.Action == "merge" && payload.ObjectAttributes.TargetBranch == defaultBranch {
5664
jobs = append(jobs, scheduler.Job{
@@ -71,6 +79,7 @@ func ConvertGithubPullRequestEventToJobs(payload *gitlab.MergeEvent, impactedPro
7179
RequestedBy: sender,
7280
CommandEnvProvider: CommandEnvProvider,
7381
StateEnvProvider: StateEnvProvider,
82+
SkipMergeCheck: skipMerge,
7483
})
7584
} else if payload.ObjectAttributes.Action == "open" || payload.ObjectAttributes.Action == "reopen" || payload.ObjectAttributes.Action == "synchronize" {
7685
jobs = append(jobs, scheduler.Job{
@@ -92,6 +101,7 @@ func ConvertGithubPullRequestEventToJobs(payload *gitlab.MergeEvent, impactedPro
92101
RequestedBy: sender,
93102
CommandEnvProvider: CommandEnvProvider,
94103
StateEnvProvider: StateEnvProvider,
104+
SkipMergeCheck: skipMerge,
95105
})
96106
} else if payload.ObjectAttributes.Action == "close" {
97107
jobs = append(jobs, scheduler.Job{
@@ -113,6 +123,7 @@ func ConvertGithubPullRequestEventToJobs(payload *gitlab.MergeEvent, impactedPro
113123
RequestedBy: sender,
114124
CommandEnvProvider: CommandEnvProvider,
115125
StateEnvProvider: StateEnvProvider,
126+
SkipMergeCheck: skipMerge,
116127
})
117128
// TODO: Figure how to detect gitlab's "PR converted to draft" event
118129
} else if payload.ObjectAttributes.Action == "converted_to_draft" {
@@ -142,6 +153,7 @@ func ConvertGithubPullRequestEventToJobs(payload *gitlab.MergeEvent, impactedPro
142153
RequestedBy: sender,
143154
CommandEnvProvider: CommandEnvProvider,
144155
StateEnvProvider: StateEnvProvider,
156+
SkipMergeCheck: skipMerge,
145157
})
146158
}
147159

libs/digger_config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ type WorkflowConfiguration struct {
5555
OnPullRequestClosed []string
5656
OnPullRequestConvertedToDraft []string
5757
OnCommitToDefault []string
58+
SkipMergeCheck bool
5859
}
5960

6061
type TerraformEnvConfig struct {
@@ -86,6 +87,7 @@ func defaultWorkflow() *Workflow {
8687
OnPullRequestPushed: []string{"digger plan"},
8788
OnPullRequestConvertedToDraft: []string{},
8889
OnPullRequestClosed: []string{"digger unlock"},
90+
SkipMergeCheck: false,
8991
},
9092
Plan: &Stage{
9193
Steps: []Step{

libs/digger_config/converters.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ func copyWorkflowConfiguration(config *WorkflowConfigurationYaml) *WorkflowConfi
121121
result.OnPullRequestPushed = config.OnPullRequestPushed
122122
result.OnCommitToDefault = config.OnCommitToDefault
123123
result.OnPullRequestConvertedToDraft = config.OnPullRequestConvertedToDraft
124+
result.SkipMergeCheck = config.SkipMergeCheck
124125
return &result
125126
}
126127

libs/digger_config/digger_config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ func LoadDiggerConfigYaml(workingDir string, generateProjects bool, changedFiles
358358
}
359359
}
360360

361+
361362
return configYaml, nil
362363
}
363364

0 commit comments

Comments
 (0)