github.com/SAP/jenkins-library@v1.362.0/cmd/terraformExecute.go (about) 1 package cmd 2 3 import ( 4 "bytes" 5 "fmt" 6 "github.com/SAP/jenkins-library/pkg/command" 7 "github.com/SAP/jenkins-library/pkg/log" 8 "github.com/SAP/jenkins-library/pkg/piperutils" 9 "github.com/SAP/jenkins-library/pkg/telemetry" 10 "github.com/SAP/jenkins-library/pkg/terraform" 11 ) 12 13 type terraformExecuteUtils interface { 14 command.ExecRunner 15 16 FileExists(filename string) (bool, error) 17 } 18 19 type terraformExecuteUtilsBundle struct { 20 *command.Command 21 *piperutils.Files 22 } 23 24 func newTerraformExecuteUtils() terraformExecuteUtils { 25 utils := terraformExecuteUtilsBundle{ 26 Command: &command.Command{}, 27 Files: &piperutils.Files{}, 28 } 29 // Reroute command output to logging framework 30 utils.Stdout(log.Writer()) 31 utils.Stderr(log.Writer()) 32 return &utils 33 } 34 35 func terraformExecute(config terraformExecuteOptions, telemetryData *telemetry.CustomData, commonPipelineEnvironment *terraformExecuteCommonPipelineEnvironment) { 36 utils := newTerraformExecuteUtils() 37 38 err := runTerraformExecute(&config, telemetryData, utils, commonPipelineEnvironment) 39 if err != nil { 40 log.Entry().WithError(err).Fatal("step execution failed") 41 } 42 } 43 44 func runTerraformExecute(config *terraformExecuteOptions, telemetryData *telemetry.CustomData, utils terraformExecuteUtils, commonPipelineEnvironment *terraformExecuteCommonPipelineEnvironment) error { 45 if len(config.CliConfigFile) > 0 { 46 utils.AppendEnv([]string{fmt.Sprintf("TF_CLI_CONFIG_FILE=%s", config.CliConfigFile)}) 47 } 48 49 if len(config.Workspace) > 0 { 50 utils.AppendEnv([]string{fmt.Sprintf("TF_WORKSPACE=%s", config.Workspace)}) 51 } 52 53 args := []string{} 54 55 if piperutils.ContainsString([]string{"apply", "destroy"}, config.Command) { 56 args = append(args, "-auto-approve") 57 } 58 59 if piperutils.ContainsString([]string{"apply", "plan"}, config.Command) && config.TerraformSecrets != "" { 60 args = append(args, fmt.Sprintf("-var-file=%s", config.TerraformSecrets)) 61 } 62 63 if piperutils.ContainsString([]string{"init", "validate", "plan", "apply", "destroy"}, config.Command) { 64 args = append(args, "-no-color") 65 } 66 67 if config.AdditionalArgs != nil { 68 args = append(args, config.AdditionalArgs...) 69 } 70 71 if config.Init { 72 err := runTerraform(utils, "init", []string{"-no-color"}, config.GlobalOptions) 73 74 if err != nil { 75 return err 76 } 77 } 78 79 err := runTerraform(utils, config.Command, args, config.GlobalOptions) 80 81 if err != nil { 82 return err 83 } 84 85 var outputBuffer bytes.Buffer 86 utils.Stdout(&outputBuffer) 87 88 err = runTerraform(utils, "output", []string{"-json"}, config.GlobalOptions) 89 90 if err != nil { 91 return err 92 } 93 94 commonPipelineEnvironment.custom.terraformOutputs, err = terraform.ReadOutputs(outputBuffer.String()) 95 96 return err 97 } 98 99 func runTerraform(utils terraformExecuteUtils, command string, additionalArgs []string, globalOptions []string) error { 100 args := []string{} 101 102 if len(globalOptions) > 0 { 103 args = append(args, globalOptions...) 104 } 105 106 args = append(args, command) 107 108 if len(additionalArgs) > 0 { 109 args = append(args, additionalArgs...) 110 } 111 112 return utils.RunExecutable("terraform", args...) 113 }