Skip to content

Commit 706ecf2

Browse files
authored
improve efficiency in terragrunt generation (#1854)
* improve efficiency in terragrunt generation
1 parent 24badb0 commit 706ecf2

File tree

5 files changed

+73
-53
lines changed

5 files changed

+73
-53
lines changed

backend/controllers/github.go

+1
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ func handlePullRequestEvent(gh utils.GithubClientProvider, payload *github.PullR
376376
diggerYmlStr, ghService, config, projectsGraph, _, _, changedFiles, err := getDiggerConfigForPR(gh, organisationId, prLabelsStr, installationId, repoFullName, repoOwner, repoName, cloneURL, prNumber)
377377
if err != nil {
378378
log.Printf("getDiggerConfigForPR error: %v", err)
379+
commentReporterManager.UpdateComment(fmt.Sprintf(":x: Error loading digger config: %v", err))
379380
return fmt.Errorf("error getting digger config")
380381
}
381382

libs/digger_config/digger_config.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,7 @@ func hydrateDiggerConfigYamlWithTerragrunt(configYaml *DiggerConfigYaml, parsing
536536
parsingConfig.PreserveProjects,
537537
parsingConfig.UseProjectMarkers,
538538
executionOrderGroups,
539+
parsingConfig.TriggerProjectsFromDirOnly,
539540
)
540541
if err != nil {
541542
return fmt.Errorf("failed to autogenerate digger_config, error during parse: %v", err)
@@ -562,10 +563,6 @@ func hydrateDiggerConfigYamlWithTerragrunt(configYaml *DiggerConfigYaml, parsing
562563
projectDir := path.Join(pathPrefix, atlantisProject.Dir)
563564
atlantisProject.Autoplan.WhenModified, err = GetPatternsRelativeToRepo(projectDir, atlantisProject.Autoplan.WhenModified)
564565

565-
if parsingConfig.TriggerProjectsFromDirOnly {
566-
atlantisProject.Autoplan.WhenModified, err = FilterPathsOutsideOfProjectPath(projectDir, atlantisProject.Autoplan.WhenModified)
567-
}
568-
569566
if err != nil {
570567
return fmt.Errorf("could not normalize patterns: %v", err)
571568
}

libs/digger_config/terragrunt/atlantis/generate.go

+71-28
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,33 @@ func getDependencies(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, g
312312
}
313313
}
314314

315+
func createBaseProject(dir string, workflow string, terraformVersion string, applyRequirements *[]string, autoPlan bool, dependencies []string, createProjectName bool, createWorkspace bool) *AtlantisProject {
316+
project := &AtlantisProject{
317+
Dir: filepath.ToSlash(dir),
318+
Workflow: workflow,
319+
TerraformVersion: terraformVersion,
320+
ApplyRequirements: applyRequirements,
321+
Autoplan: AutoplanConfig{
322+
Enabled: autoPlan,
323+
WhenModified: uniqueStrings(dependencies),
324+
},
325+
}
326+
327+
if createProjectName || createWorkspace {
328+
projectName := projectNameFromDir(project.Dir)
329+
if createProjectName {
330+
project.Name = projectName
331+
}
332+
if createWorkspace {
333+
project.Workspace = projectName
334+
}
335+
}
336+
337+
return project
338+
}
339+
315340
// Creates an AtlantisProject for a directory
316-
func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, gitRoot string, cascadeDependencies bool, defaultWorkflow string, defaultApplyRequirements []string, autoPlan bool, defaultTerraformVersion string, createProjectName bool, createWorkspace bool, sourcePath string) (*AtlantisProject, []string, error) {
341+
func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, gitRoot string, cascadeDependencies bool, defaultWorkflow string, defaultApplyRequirements []string, autoPlan bool, defaultTerraformVersion string, createProjectName bool, createWorkspace bool, sourcePath string, triggerProjectsFromDirOnly bool) (*AtlantisProject, []string, error) {
317342
options, err := options.NewTerragruntOptionsWithConfigPath(sourcePath)
318343

319344
var potentialProjectDependencies []string
@@ -324,6 +349,39 @@ func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, git
324349
options.RunTerragrunt = terraform.Run
325350
options.Env = getEnvs()
326351

352+
// All dependencies depend on their own .hcl file, and any tf files in their directory
353+
relativeDependencies := []string{
354+
"*.hcl",
355+
"*.tf*",
356+
}
357+
358+
// Clean up the relative path to the format Atlantis expects
359+
absoluteSourceDir := filepath.Dir(sourcePath) + string(filepath.Separator)
360+
relativeSourceDir := strings.TrimPrefix(absoluteSourceDir, gitRoot)
361+
relativeSourceDir = strings.TrimSuffix(relativeSourceDir, string(filepath.Separator))
362+
if relativeSourceDir == "" {
363+
relativeSourceDir = "."
364+
}
365+
366+
if triggerProjectsFromDirOnly {
367+
// TODO: Figure out easy way to make it also work with other values of gitRoot through prefix matching
368+
if relativeSourceDir == "." {
369+
return nil, potentialProjectDependencies, nil
370+
}
371+
372+
project := createBaseProject(
373+
relativeSourceDir,
374+
defaultWorkflow,
375+
defaultTerraformVersion,
376+
&defaultApplyRequirements,
377+
autoPlan,
378+
relativeDependencies,
379+
createProjectName,
380+
createWorkspace,
381+
)
382+
return project, potentialProjectDependencies, nil
383+
}
384+
327385
dependencies, err := getDependencies(ignoreParentTerragrunt, ignoreDependencyBlocks, gitRoot, cascadeDependencies, sourcePath, options)
328386
if err != nil {
329387
return nil, potentialProjectDependencies, err
@@ -334,8 +392,6 @@ func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, git
334392
return nil, potentialProjectDependencies, nil
335393
}
336394

337-
absoluteSourceDir := filepath.Dir(sourcePath) + string(filepath.Separator)
338-
339395
locals, err := parseLocals(sourcePath, options, nil)
340396
if err != nil {
341397
return nil, potentialProjectDependencies, err
@@ -346,12 +402,6 @@ func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, git
346402
return nil, potentialProjectDependencies, nil
347403
}
348404

349-
// All dependencies depend on their own .hcl file, and any tf files in their directory
350-
relativeDependencies := []string{
351-
"*.hcl",
352-
"*.tf*",
353-
}
354-
355405
// Add other dependencies based on their relative paths. We always want to output with Unix path separators
356406
for _, dependencyPath := range dependencies {
357407
absolutePath := dependencyPath
@@ -368,13 +418,6 @@ func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, git
368418
relativeDependencies = append(relativeDependencies, filepath.ToSlash(relativePath))
369419
}
370420

371-
// Clean up the relative path to the format Atlantis expects
372-
relativeSourceDir := strings.TrimPrefix(absoluteSourceDir, gitRoot)
373-
relativeSourceDir = strings.TrimSuffix(relativeSourceDir, string(filepath.Separator))
374-
if relativeSourceDir == "" {
375-
relativeSourceDir = "."
376-
}
377-
378421
workflow := defaultWorkflow
379422
if locals.AtlantisWorkflow != "" {
380423
workflow = locals.AtlantisWorkflow
@@ -398,16 +441,16 @@ func createProject(ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, git
398441
terraformVersion = locals.TerraformVersion
399442
}
400443

401-
project := &AtlantisProject{
402-
Dir: filepath.ToSlash(relativeSourceDir),
403-
Workflow: workflow,
404-
TerraformVersion: terraformVersion,
405-
ApplyRequirements: applyRequirements,
406-
Autoplan: AutoplanConfig{
407-
Enabled: resolvedAutoPlan,
408-
WhenModified: uniqueStrings(relativeDependencies),
409-
},
410-
}
444+
project := createBaseProject(
445+
relativeSourceDir,
446+
workflow,
447+
terraformVersion,
448+
applyRequirements,
449+
resolvedAutoPlan,
450+
relativeDependencies,
451+
createProjectName,
452+
createWorkspace,
453+
)
411454

412455
projectName := projectNameFromDir(project.Dir)
413456

@@ -660,7 +703,7 @@ func getAllTerragruntProjectHclFiles(projectHclFiles []string, gitRoot string) m
660703
return uniqueHclFileAbsPaths
661704
}
662705

663-
func Parse(gitRoot string, projectHclFiles []string, createHclProjectExternalChilds bool, autoMerge bool, parallel bool, filterPath string, createHclProjectChilds bool, ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, cascadeDependencies bool, defaultWorkflow string, defaultApplyRequirements []string, autoPlan bool, defaultTerraformVersion string, createProjectName bool, createWorkspace bool, preserveProjects bool, useProjectMarkers bool, executionOrderGroups bool) (*AtlantisConfig, map[string][]string, error) {
706+
func Parse(gitRoot string, projectHclFiles []string, createHclProjectExternalChilds bool, autoMerge bool, parallel bool, filterPath string, createHclProjectChilds bool, ignoreParentTerragrunt bool, ignoreDependencyBlocks bool, cascadeDependencies bool, defaultWorkflow string, defaultApplyRequirements []string, autoPlan bool, defaultTerraformVersion string, createProjectName bool, createWorkspace bool, preserveProjects bool, useProjectMarkers bool, executionOrderGroups bool, triggerProjectsFromDirOnly bool) (*AtlantisConfig, map[string][]string, error) {
664707
// Ensure the gitRoot has a trailing slash and is an absolute path
665708
absoluteGitRoot, err := filepath.Abs(gitRoot)
666709
if err != nil {
@@ -726,7 +769,7 @@ func Parse(gitRoot string, projectHclFiles []string, createHclProjectExternalChi
726769

727770
errGroup.Go(func() error {
728771
defer sem.Release(1)
729-
project, projDeps, err := createProject(ignoreParentTerragrunt, ignoreDependencyBlocks, gitRoot, cascadeDependencies, defaultWorkflow, defaultApplyRequirements, autoPlan, defaultTerraformVersion, createProjectName, createWorkspace, terragruntPath)
772+
project, projDeps, err := createProject(ignoreParentTerragrunt, ignoreDependencyBlocks, gitRoot, cascadeDependencies, defaultWorkflow, defaultApplyRequirements, autoPlan, defaultTerraformVersion, createProjectName, createWorkspace, terragruntPath, triggerProjectsFromDirOnly)
730773
if err != nil {
731774
return err
732775
}

libs/digger_config/utils.go

-11
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"log"
66
"path"
77
"path/filepath"
8-
"strings"
98
)
109

1110
func GetPatternsRelativeToRepo(projectPath string, patterns []string) ([]string, error) {
@@ -16,16 +15,6 @@ func GetPatternsRelativeToRepo(projectPath string, patterns []string) ([]string,
1615
return res, nil
1716
}
1817

19-
func FilterPathsOutsideOfProjectPath(projectPath string, patterns []string) ([]string, error) {
20-
res := make([]string, 0)
21-
for _, pattern := range patterns {
22-
if strings.HasPrefix(pattern, projectPath) {
23-
res = append(res, pattern)
24-
}
25-
}
26-
return res, nil
27-
}
28-
2918
func NormalizeFileName(fileName string) string {
3019
res, err := filepath.Abs(path.Join("/", fileName))
3120
if err != nil {

libs/digger_config/utils_test.go

-10
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,3 @@ func TestGetPatternsRelativeToRepo(t *testing.T) {
4545
assert.Equal(t, "myProject/terraform/environments/devel/*.hcl", res[0])
4646

4747
}
48-
49-
func TestFilterPathsOutsideOfProjectPath(t *testing.T) {
50-
projectDir := "staging/aws/us-east-1/k8s"
51-
includePatterns := []string{"staging/aws/us-east-1/k8s/*.hcl", "staging/terragrunt-root.hcl vpc/*.tf*", "staging/aws/us-east-1/aws_region.tfvars", "staging/aws/aws_assume_role_arn.tfvars", "staging/aws/us-east-1/k8s/*.tf*"}
52-
res, _ := FilterPathsOutsideOfProjectPath(projectDir, includePatterns)
53-
assert.Equal(t, 2, len(res))
54-
assert.Equal(t, "staging/aws/us-east-1/k8s/*.hcl", res[0])
55-
assert.Equal(t, "staging/aws/us-east-1/k8s/*.tf*", res[1])
56-
57-
}

0 commit comments

Comments
 (0)