@@ -66,6 +66,8 @@ func RunCommandsPerProject(commandsPerProject []ProjectCommand, repoOwner string
6666 projectCommands .ProjectDir ,
6767 repoName ,
6868 projectCommands .Terragrunt ,
69+ projectCommands .ApplyStage ,
70+ projectCommands .PlanStage ,
6971 prManager ,
7072 projectLock ,
7173 diggerConfig ,
@@ -108,38 +110,50 @@ type ProjectCommand struct {
108110 ProjectWorkspace string
109111 Terragrunt bool
110112 Commands []string
113+ ApplyStage Stage
114+ PlanStage Stage
111115}
112116
113- func ConvertGithubEventToCommands (event models.Event , impactedProjects []Project ) ([]ProjectCommand , error ) {
117+ func ConvertGithubEventToCommands (event models.Event , impactedProjects []Project , workflows map [ string ] Workflow ) ([]ProjectCommand , error ) {
114118 commandsPerProject := make ([]ProjectCommand , 0 )
115119
116120 switch event .(type ) {
117121 case models.PullRequestEvent :
118122 event := event .(models.PullRequestEvent )
119123 for _ , project := range impactedProjects {
124+ workflow , ok := workflows [project .Workflow ]
125+ if ! ok {
126+ workflow = * defaultWorkflow ()
127+ }
120128 if event .Action == "closed" && event .PullRequest .Merged && event .PullRequest .Base .Ref == event .Repository .DefaultBranch {
121129 commandsPerProject = append (commandsPerProject , ProjectCommand {
122130 ProjectName : project .Name ,
123131 ProjectDir : project .Dir ,
124132 ProjectWorkspace : project .Workspace ,
125133 Terragrunt : project .Terragrunt ,
126- Commands : project .WorkflowConfiguration .OnCommitToDefault ,
134+ Commands : workflow .Configuration .OnCommitToDefault ,
135+ ApplyStage : * workflow .Apply ,
136+ PlanStage : * workflow .Plan ,
127137 })
128138 } else if event .Action == "opened" || event .Action == "reopened" || event .Action == "synchronize" {
129139 commandsPerProject = append (commandsPerProject , ProjectCommand {
130140 ProjectName : project .Name ,
131141 ProjectDir : project .Dir ,
132142 ProjectWorkspace : project .Workspace ,
133143 Terragrunt : project .Terragrunt ,
134- Commands : project .WorkflowConfiguration .OnPullRequestPushed ,
144+ Commands : workflow .Configuration .OnPullRequestPushed ,
145+ ApplyStage : * workflow .Apply ,
146+ PlanStage : * workflow .Plan ,
135147 })
136148 } else if event .Action == "closed" {
137149 commandsPerProject = append (commandsPerProject , ProjectCommand {
138150 ProjectName : project .Name ,
139151 ProjectDir : project .Dir ,
140152 ProjectWorkspace : project .Workspace ,
141153 Terragrunt : project .Terragrunt ,
142- Commands : project .WorkflowConfiguration .OnPullRequestClosed ,
154+ Commands : workflow .Configuration .OnPullRequestPushed ,
155+ ApplyStage : * workflow .Apply ,
156+ PlanStage : * workflow .Plan ,
143157 })
144158 }
145159 }
@@ -151,6 +165,10 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
151165 for _ , command := range supportedCommands {
152166 if strings .Contains (event .Comment .Body , command ) {
153167 for _ , project := range impactedProjects {
168+ workflow , ok := workflows [project .Workflow ]
169+ if ! ok {
170+ workflow = * defaultWorkflow ()
171+ }
154172 workspace := project .Workspace
155173 workspaceOverride , err := parseWorkspace (event .Comment .Body )
156174 if err != nil {
@@ -165,6 +183,8 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
165183 ProjectWorkspace : workspace ,
166184 Terragrunt : project .Terragrunt ,
167185 Commands : []string {command },
186+ ApplyStage : * workflow .Apply ,
187+ PlanStage : * workflow .Plan ,
168188 })
169189 }
170190 }
@@ -211,6 +231,8 @@ type DiggerExecutor struct {
211231 projectDir string
212232 repoName string
213233 terragrunt bool
234+ applyStage Stage
235+ planStage Stage
214236 prManager github.PullRequestManager
215237 lock utils.ProjectLock
216238 configDigger * DiggerConfig
@@ -235,7 +257,18 @@ func (d DiggerExecutor) Plan(prNumber int) {
235257 log .Fatalf ("Error locking project: %v" , err )
236258 }
237259 if res {
238- isNonEmptyPlan , stdout , stderr , err := terraformExecutor .Plan ()
260+ var initArgs []string
261+ var planArgs []string
262+
263+ for _ , step := range d .planStage .Steps {
264+ if step .Action == "init" {
265+ initArgs = append (initArgs , step .ExtraArgs ... )
266+ }
267+ if step .Action == "plan" {
268+ planArgs = append (planArgs , step .ExtraArgs ... )
269+ }
270+ }
271+ isNonEmptyPlan , stdout , stderr , err := terraformExecutor .Plan (initArgs , planArgs )
239272
240273 if err != nil {
241274 log .Fatalf ("Error executing plan: %v" , err )
@@ -257,7 +290,18 @@ func (d DiggerExecutor) Apply(prNumber int) {
257290 }
258291
259292 if res , _ := d .lock .Lock (d .LockId (), prNumber ); res {
260- stdout , stderr , err := terraformExecutor .Apply ()
293+ var initArgs []string
294+ var applyArgs []string
295+
296+ for _ , step := range d .applyStage .Steps {
297+ if step .Action == "init" {
298+ initArgs = append (initArgs , step .ExtraArgs ... )
299+ }
300+ if step .Action == "apply" {
301+ applyArgs = append (applyArgs , step .ExtraArgs ... )
302+ }
303+ }
304+ stdout , stderr , err := terraformExecutor .Apply (initArgs , applyArgs )
261305 applyOutput := cleanupTerraformApply (true , err , stdout , stderr )
262306 comment := "Apply for **" + d .LockId () + "**\n " + applyOutput
263307 d .prManager .PublishComment (prNumber , comment )
@@ -267,7 +311,7 @@ func (d DiggerExecutor) Apply(prNumber int) {
267311 fmt .Errorf ("error unlocking project: %v" , err )
268312 }
269313 } else {
270-
314+
271315 d .prManager .PublishComment (prNumber , "Error during applying. Project lock will persist" )
272316 }
273317 }
@@ -348,3 +392,33 @@ func CheckIfHelpComment(event models.Event) bool {
348392 }
349393 return false
350394}
395+
396+ func defaultWorkflow () * Workflow {
397+ return & Workflow {
398+ Configuration : & WorkflowConfiguration {
399+ OnCommitToDefault : []string {"digger unlock" },
400+ OnPullRequestPushed : []string {"digger plan" },
401+ OnPullRequestClosed : []string {"digger unlock" },
402+ },
403+ Plan : & Stage {
404+ Steps : []Step {
405+ {
406+ Action : "init" , ExtraArgs : []string {},
407+ },
408+ {
409+ Action : "plan" , ExtraArgs : []string {},
410+ },
411+ },
412+ },
413+ Apply : & Stage {
414+ Steps : []Step {
415+ {
416+ Action : "init" , ExtraArgs : []string {},
417+ },
418+ {
419+ Action : "apply" , ExtraArgs : []string {},
420+ },
421+ },
422+ },
423+ }
424+ }
0 commit comments