Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions db/Template.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ type TerraformTemplateParams struct {
AutoApprove bool `json:"auto_approve,omitempty"`
OverrideBackend bool `json:"override_backend,omitempty"` // override backend if internal backend is used
BackendFilename string `json:"backend_filename,omitempty"`
TfPath string `json:"tf_path,omitempty"` // path to terraform binary (terraform, tofu, etc.) - used for Terragrunt
}

type SurveyVarEnumValue struct {
Expand Down
26 changes: 21 additions & 5 deletions db_lib/TerraformApp.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import (
"github.com/semaphoreui/semaphore/util"
)

const (
// DefaultTerraformBinary is the default terraform binary used by Terragrunt
DefaultTerraformBinary = "terraform"
)

type TerraformApp struct {
Logger task_logger.Logger
Template db.Template
Expand All @@ -25,6 +30,7 @@ type TerraformApp struct {
Name string // Name is the name of the terraform binary
PlanHasNoChanges bool // PlanHasNoChanges is true if terraform plan has no changes
backendFilename string // backendFilename is the name of the backend file
tfPath string // tfPath is the path to terraform/tofu binary for Terragrunt
}

type terraformReader struct {
Expand Down Expand Up @@ -106,6 +112,13 @@ func (t *TerraformApp) SetLogger(logger task_logger.Logger) task_logger.Logger {
return logger
}

func (t *TerraformApp) getTfPath() string {
if t.tfPath != "" {
return t.tfPath
}
return DefaultTerraformBinary
}

func (t *TerraformApp) init(environmentVars []string, keyInstaller AccessKeyInstaller, params *db.TerraformTaskParams) error {

keyInstallation, err := keyInstaller.Install(t.Inventory.SSHKey, db.AccessKeyRoleGit, t.Logger)
Expand All @@ -127,7 +140,7 @@ func (t *TerraformApp) init(environmentVars []string, keyInstaller AccessKeyInst
}

if t.Name == string(db.AppTerragrunt) {
args = append(args, "--tf-path=terraform")
args = append(args, fmt.Sprintf("--tf-path=%s", t.getTfPath()))
}

cmd := t.makeCmd(t.Name, args, environmentVars)
Expand Down Expand Up @@ -163,7 +176,7 @@ func (t *TerraformApp) isWorkspacesSupported(environmentVars []string) bool {
args := []string{"workspace", "list"}
if t.Name == string(db.AppTerragrunt) {
args = append([]string{"run", "--"}, args...)
args = append(args, "--tf-path=terraform")
args = append(args, fmt.Sprintf("--tf-path=%s", t.getTfPath()))
}
cmd := t.makeCmd(t.Name, args, environmentVars)
err := cmd.Run()
Expand All @@ -178,7 +191,7 @@ func (t *TerraformApp) selectWorkspace(workspace string, environmentVars []strin
args := []string{"workspace", "select", "-or-create=true", workspace}
if t.Name == string(db.AppTerragrunt) {
args = append([]string{"run", "--"}, args...)
args = append(args, "--tf-path=terraform")
args = append(args, fmt.Sprintf("--tf-path=%s", t.getTfPath()))
}
cmd := t.makeCmd(t.Name, args, environmentVars)
t.Logger.LogCmd(cmd)
Expand Down Expand Up @@ -219,6 +232,9 @@ func (t *TerraformApp) InstallRequirements(args LocalAppInstallingArgs) (err err
tpl := args.TplParams.(*db.TerraformTemplateParams)
p := args.Params.(*db.TerraformTaskParams)

// Set tfPath from template params, getTfPath() will handle default if empty
t.tfPath = tpl.TfPath

if tpl.OverrideBackend {
t.backendFilename = "backend.tf"
if tpl.BackendFilename != "" {
Expand Down Expand Up @@ -253,7 +269,7 @@ func (t *TerraformApp) InstallRequirements(args LocalAppInstallingArgs) (err err
func (t *TerraformApp) Plan(args []string, environmentVars []string, inputs map[string]string, cb func(*os.Process)) error {
planArgs := []string{"plan", "-lock=false"}
if t.Name == string(db.AppTerragrunt) {
planArgs = append(planArgs, "--tf-path=terraform")
planArgs = append(planArgs, fmt.Sprintf("--tf-path=%s", t.getTfPath()))
}
planArgs = append(planArgs, args...)
cmd := t.makeCmd(t.Name, planArgs, environmentVars)
Expand Down Expand Up @@ -285,7 +301,7 @@ func (t *TerraformApp) Plan(args []string, environmentVars []string, inputs map[
func (t *TerraformApp) Apply(args []string, environmentVars []string, inputs map[string]string, cb func(*os.Process)) error {
applyArgs := []string{"apply", "-auto-approve", "-lock=false"}
if t.Name == string(db.AppTerragrunt) {
applyArgs = append(applyArgs, "--tf-path=terraform")
applyArgs = append(applyArgs, fmt.Sprintf("--tf-path=%s", t.getTfPath()))
}
applyArgs = append(applyArgs, args...)
cmd := t.makeCmd(t.Name, applyArgs, environmentVars)
Expand Down
Loading
Loading