Skip to content

Commit 007be7f

Browse files
authored
support terragrunt (#76)
1 parent 2bf10f9 commit 007be7f

File tree

4 files changed

+63
-8
lines changed

4 files changed

+63
-8
lines changed

pkg/digger/digger.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func RunCommandsPerProject(commandsPerProject []ProjectCommand, repoOwner string
6464
projectCommands.ProjectName,
6565
projectCommands.ProjectDir,
6666
repoName,
67+
projectCommands.Terragrunt,
6768
prManager,
6869
projectLock,
6970
diggerConfig,
@@ -104,6 +105,7 @@ type ProjectCommand struct {
104105
ProjectName string
105106
ProjectDir string
106107
ProjectWorkspace string
108+
Terragrunt bool
107109
Commands []string
108110
}
109111

@@ -119,20 +121,23 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
119121
ProjectName: project.Name,
120122
ProjectDir: project.Dir,
121123
ProjectWorkspace: project.Workspace,
124+
Terragrunt: project.Terragrunt,
122125
Commands: project.WorkflowConfiguration.OnCommitToDefault,
123126
})
124127
} else if event.Action == "opened" || event.Action == "reopened" || event.Action == "synchronize" {
125128
commandsPerProject = append(commandsPerProject, ProjectCommand{
126129
ProjectName: project.Name,
127130
ProjectDir: project.Dir,
128131
ProjectWorkspace: project.Workspace,
132+
Terragrunt: project.Terragrunt,
129133
Commands: project.WorkflowConfiguration.OnPullRequestPushed,
130134
})
131135
} else if event.Action == "closed" {
132136
commandsPerProject = append(commandsPerProject, ProjectCommand{
133137
ProjectName: project.Name,
134138
ProjectDir: project.Dir,
135139
ProjectWorkspace: project.Workspace,
140+
Terragrunt: project.Terragrunt,
136141
Commands: project.WorkflowConfiguration.OnPullRequestClosed,
137142
})
138143
}
@@ -157,6 +162,7 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
157162
ProjectName: project.Name,
158163
ProjectDir: project.Dir,
159164
ProjectWorkspace: workspace,
165+
Terragrunt: project.Terragrunt,
160166
Commands: []string{command},
161167
})
162168
}
@@ -203,6 +209,7 @@ type DiggerExecutor struct {
203209
projectName string
204210
projectDir string
205211
repoName string
212+
terragrunt bool
206213
prManager github.PullRequestManager
207214
lock utils.ProjectLock
208215
configDigger *DiggerConfig
@@ -214,7 +221,13 @@ func (d DiggerExecutor) LockId() string {
214221

215222
func (d DiggerExecutor) Plan(prNumber int) {
216223

217-
terraformExecutor := terraform.Terraform{WorkingDir: path.Join(d.workingDir, d.projectDir), Workspace: d.workspace}
224+
var terraformExecutor terraform.TerraformExecutor
225+
226+
if d.terragrunt {
227+
terraformExecutor = terraform.Terragrunt{WorkingDir: path.Join(d.workingDir, d.projectDir)}
228+
} else {
229+
terraformExecutor = terraform.Terraform{WorkingDir: path.Join(d.workingDir, d.projectDir), Workspace: d.workspace}
230+
}
218231

219232
res, err := d.lock.Lock(d.LockId(), prNumber)
220233
if err != nil {
@@ -234,7 +247,14 @@ func (d DiggerExecutor) Plan(prNumber int) {
234247
}
235248

236249
func (d DiggerExecutor) Apply(prNumber int) {
237-
terraformExecutor := terraform.Terraform{WorkingDir: path.Join(d.workingDir, d.projectDir), Workspace: d.workspace}
250+
var terraformExecutor terraform.TerraformExecutor
251+
252+
if d.terragrunt {
253+
terraformExecutor = terraform.Terragrunt{WorkingDir: path.Join(d.workingDir, d.projectDir)}
254+
} else {
255+
terraformExecutor = terraform.Terraform{WorkingDir: path.Join(d.workingDir, d.projectDir), Workspace: d.workspace}
256+
}
257+
238258
if res, _ := d.lock.Lock(d.LockId(), prNumber); res {
239259
stdout, stderr, err := terraformExecutor.Apply()
240260
applyOutput := cleanupTerraformApply(true, err, stdout, stderr)

pkg/digger/digger_config.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type Project struct {
2525
Name string `yaml:"name"`
2626
Dir string `yaml:"dir"`
2727
Workspace string `yaml:"workspace"`
28+
Terragrunt bool `yaml:"terragrunt"`
2829
WorkflowConfiguration WorkflowConfiguration `yaml:"workflow_configuration"`
2930
}
3031

@@ -33,7 +34,8 @@ var ErrDiggerConfigConflict = errors.New("more than one digger config file detec
3334
func (p *Project) UnmarshalYAML(unmarshal func(interface{}) error) error {
3435
type rawProject Project
3536
raw := rawProject{
36-
Workspace: "default",
37+
Workspace: "default",
38+
Terragrunt: false,
3739
WorkflowConfiguration: WorkflowConfiguration{
3840
OnPullRequestPushed: []string{"digger plan"},
3941
OnPullRequestClosed: []string{"digger unlock"},
@@ -73,9 +75,10 @@ func NewDiggerConfig(workingDir string) (*DiggerConfig, error) {
7375

7476
func defaultProject() Project {
7577
return Project{
76-
Name: "default",
77-
Dir: ".",
78-
Workspace: "default",
78+
Name: "default",
79+
Dir: ".",
80+
Workspace: "default",
81+
Terragrunt: false,
7982
WorkflowConfiguration: WorkflowConfiguration{
8083
OnPullRequestPushed: []string{"digger plan"},
8184
OnPullRequestClosed: []string{"digger unlock"},

pkg/terraform/tf.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,55 @@
11
package terraform
22

33
import (
4+
"bytes"
45
"context"
56
"fmt"
67
"github.com/hashicorp/terraform-exec/tfexec"
78
"log"
89
"os"
10+
"os/exec"
911
)
1012

1113
type TerraformExecutor interface {
1214
Apply() (string, string, error)
1315
Plan() (bool, string, string, error)
1416
}
1517

18+
type Terragrunt struct {
19+
WorkingDir string
20+
}
21+
1622
type Terraform struct {
1723
WorkingDir string
1824
Workspace string
1925
}
2026

21-
func (terraform *Terraform) Apply() (string, string, error) {
27+
func (terragrunt Terragrunt) Apply() (string, string, error) {
28+
return terragrunt.runTerragruntCommand("apply")
29+
}
30+
31+
func (terragrunt Terragrunt) Plan() (bool, string, string, error) {
32+
stdout, stderr, err := terragrunt.runTerragruntCommand("plan")
33+
return true, stdout, stderr, err
34+
}
35+
36+
func (terragrunt Terragrunt) runTerragruntCommand(command string) (string, string, error) {
37+
cmd := exec.Command("terragrunt", command, "--terragrunt-working-dir", terragrunt.WorkingDir)
38+
39+
var stdout, stderr bytes.Buffer
40+
cmd.Stdout = &stdout
41+
cmd.Stderr = &stderr
42+
43+
err := cmd.Run()
44+
45+
if err != nil {
46+
fmt.Println("Error:", err)
47+
}
48+
49+
return stdout.String(), stderr.String(), err
50+
}
51+
52+
func (terraform Terraform) Apply() (string, string, error) {
2253
println("digger apply")
2354
execDir := "terraform"
2455
tf, err := tfexec.NewTerraform(terraform.WorkingDir, execDir)
@@ -74,7 +105,7 @@ func (sw *StdWriter) GetString() string {
74105
return s
75106
}
76107

77-
func (terraform *Terraform) Plan() (bool, string, string, error) {
108+
func (terraform Terraform) Plan() (bool, string, string, error) {
78109
execDir := "terraform"
79110
tf, err := tfexec.NewTerraform(terraform.WorkingDir, execDir)
80111

pkg/terraform/utils.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ projects:
101101
branch: /main/
102102
dir: .
103103
workspace: default
104+
terragrunt: false
104105
workflow_configuration:
105106
on_pull_request_pushed: [digger plan]
106107
on_pull_request_closed: [digger unlock]

0 commit comments

Comments
 (0)