Skip to content

Commit

Permalink
feat(runner): ensure terragrunt installation
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Marques committed Mar 1, 2024
1 parent 89c4df5 commit 13a9e67
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 9 deletions.
2 changes: 1 addition & 1 deletion internal/runner/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ func (r *Runner) install() error {
r.exec = terraformExec
case "terragrunt":
log.Infof("using terragrunt")
r.exec = terragrunt.NewTerragrunt(terraformExec, configv1alpha1.GetTerragruntVersion(r.repository, r.layer), PlanArtifact)
r.exec = terragrunt.NewTerragrunt(terraformExec, configv1alpha1.GetTerragruntVersion(r.repository, r.layer), PlanArtifact, r.config.Runner.RunnerBinaryPath)
}
err := r.exec.Install()
if err != nil {
Expand Down
89 changes: 81 additions & 8 deletions internal/runner/terragrunt/terragrunt.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package terragrunt

import (
"crypto/sha256"
"errors"
"fmt"
"io"
Expand All @@ -9,27 +10,26 @@ import (
"os/exec"
"path/filepath"
"runtime"
"strings"

"github.com/padok-team/burrito/internal/runner/terraform"
)

const (
BinWorkDir = "/runner/bin"
)

type Terragrunt struct {
execPath string
planArtifactPath string
version string
workingDir string
terraform *terraform.Terraform
runnerBinaryPath string
}

func NewTerragrunt(terraformExec *terraform.Terraform, terragruntVersion, planArtifactPath string) *Terragrunt {
func NewTerragrunt(terraformExec *terraform.Terraform, terragruntVersion, planArtifactPath string, runnerBinaryPath string) *Terragrunt {
return &Terragrunt{
version: terragruntVersion,
terraform: terraformExec,
planArtifactPath: planArtifactPath,
runnerBinaryPath: runnerBinaryPath,
}
}

Expand All @@ -43,7 +43,8 @@ func (t *Terragrunt) Install() error {
if err != nil {
return err
}
path, err := downloadTerragrunt(t.version)

path, err := ensureTerragrunt(t.version, t.runnerBinaryPath)
if err != nil {
return err
}
Expand Down Expand Up @@ -115,7 +116,79 @@ func (t *Terragrunt) Show(mode string) ([]byte, error) {
return output, nil
}

func downloadTerragrunt(version string) (string, error) {
func ensureTerragrunt(version string, runnerBinaryPath string) (string, error) {
runnerBinary := filepath.Join(runnerBinaryPath, "terragrunt")
info, err := os.Stat(runnerBinary)
if !os.IsNotExist(err) && !info.IsDir() {
hash, err := calculateFileSHA256(runnerBinary)
if err != nil {
return "", err
}

trustedHash, err := getTerragruntSHA256(version)
if err != nil {
return "", err
}

if hash == trustedHash {
return filepath.Abs(runnerBinaryPath)
}
}

path, err := downloadTerragrunt(version, runnerBinaryPath)
if err != nil {
return "", err
}
return path, nil
}

func calculateFileSHA256(filename string) (string, error) {
file, err := os.Open(filename)
if err != nil {
return "", err
}
defer file.Close()

hash := sha256.New()

if _, err := io.Copy(hash, file); err != nil {
return "", err
}

return fmt.Sprintf("%x", hash.Sum(nil)), nil
}

func getTerragruntSHA256(version string) (string, error) {
cpuArch := runtime.GOARCH
response, err := http.Get(fmt.Sprintf("https://github.com/gruntwork-io/terragrunt/releases/download/v%s/SHA256SUMS", version))
if err != nil {
return "", err
}
defer response.Body.Close()

body, err := io.ReadAll(response.Body)
if err != nil {
return "", err
}

lines := strings.Split(string(body), "\n")
for _, line := range lines {
parts := strings.Fields(line)
if len(parts) != 2 {
continue
}
sha := parts[0]
filename := parts[1]

if strings.Contains(filename, fmt.Sprintf("linux_%s", cpuArch)) {
return sha, nil
}
}

return "", errors.New("could not find a hash for this architecture in SHA256SUMS file")
}

func downloadTerragrunt(version string, runnerBinaryPath string) (string, error) {
cpuArch := runtime.GOARCH

url := fmt.Sprintf("https://github.com/gruntwork-io/terragrunt/releases/download/v%s/terragrunt_linux_%s", version, cpuArch)
Expand All @@ -126,7 +199,7 @@ func downloadTerragrunt(version string) (string, error) {
}
defer response.Body.Close()

filename := fmt.Sprintf("%s/terragrunt_%s", BinWorkDir, cpuArch)
filename := fmt.Sprintf("%s/terragrunt_%s", runnerBinaryPath, cpuArch)
file, err := os.Create(filename)
if err != nil {
return "", err
Expand Down

0 comments on commit 13a9e67

Please sign in to comment.