github.com/GoogleCloudPlatform/terraformer@v0.8.18/build/multi-build/main.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"strings"
    11  )
    12  
    13  const filePrefix = "provider_cmd_"
    14  const fileSuffix = ".go"
    15  const packageCmdPath = "cmd"
    16  
    17  func main() {
    18  	// provider := os.Args[1]
    19  	allProviders := []string{}
    20  	files, err := ioutil.ReadDir(packageCmdPath)
    21  	if err != nil {
    22  		log.Println(err)
    23  	}
    24  	for _, f := range files {
    25  		if strings.HasPrefix(f.Name(), filePrefix) {
    26  			providerName := strings.ReplaceAll(f.Name(), filePrefix, "")
    27  			providerName = strings.ReplaceAll(providerName, fileSuffix, "")
    28  			allProviders = append(allProviders, providerName)
    29  		}
    30  	}
    31  	for _, OS := range []string{"linux", "windows", "mac"} {
    32  		for _, provider := range allProviders {
    33  			GOOS := ""
    34  			binaryName := ""
    35  			switch OS {
    36  			case "linux":
    37  				GOOS = "linux"
    38  				binaryName = "terraformer-" + provider + "-linux-amd64"
    39  			case "windows":
    40  				GOOS = "windows"
    41  				binaryName = "terraformer-" + provider + "-windows-amd64.exe"
    42  			case "mac":
    43  				GOOS = "darwin"
    44  				binaryName = "terraformer-" + provider + "-darwin-amd64"
    45  			}
    46  			log.Println("Build terraformer with "+provider+" provider...", "GOOS=", GOOS)
    47  			deletedProvider := []string{}
    48  			for _, f := range files {
    49  				if strings.HasPrefix(f.Name(), filePrefix) {
    50  					if !strings.HasPrefix(f.Name(), filePrefix+provider+fileSuffix) {
    51  						providerName := strings.ReplaceAll(f.Name(), filePrefix, "")
    52  						providerName = strings.ReplaceAll(providerName, fileSuffix, "")
    53  						deletedProvider = append(deletedProvider, providerName)
    54  					}
    55  				}
    56  			}
    57  			// move files for deleted providers
    58  			err := os.MkdirAll(packageCmdPath+"/tmp", os.ModePerm)
    59  			if err != nil {
    60  				log.Fatal("err:", err)
    61  			}
    62  			for _, provider := range deletedProvider {
    63  				err := os.Rename(packageCmdPath+"/"+filePrefix+provider+fileSuffix, packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix)
    64  				if err != nil {
    65  					log.Println(err)
    66  				}
    67  			}
    68  
    69  			// comment deleted providers in code
    70  			rootCode, err := ioutil.ReadFile(packageCmdPath + "/root.go")
    71  			if err != nil {
    72  				log.Fatal("err:", err)
    73  			}
    74  			lines := strings.Split(string(rootCode), "\n")
    75  			newRootCodeLines := make([]string, len(lines))
    76  			for i, line := range lines {
    77  				for _, provider := range deletedProvider {
    78  					if strings.Contains(strings.ToLower(line), "newcmd"+provider+"importer") {
    79  						line = "// " + line
    80  					}
    81  					if strings.Contains(strings.ToLower(line), "new"+provider+"provider") {
    82  						line = "// " + line
    83  					}
    84  				}
    85  				newRootCodeLines[i] = line
    86  			}
    87  			newRootCode := strings.Join(newRootCodeLines, "\n")
    88  			err = ioutil.WriteFile(packageCmdPath+"/root.go", []byte(newRootCode), os.ModePerm)
    89  			if err != nil {
    90  				log.Fatal("err:", err)
    91  			}
    92  
    93  			// build....
    94  			cmd := exec.Command("go", "build", "-v", "-o", binaryName)
    95  			cmd.Env = os.Environ()
    96  			cmd.Env = append(cmd.Env, "GOOS="+GOOS)
    97  			var outb, errb bytes.Buffer
    98  			cmd.Stdout = &outb
    99  			cmd.Stderr = &errb
   100  			err = cmd.Run()
   101  			if err != nil {
   102  				log.Fatal("err:", errb.String())
   103  			}
   104  			fmt.Println(outb.String())
   105  
   106  			// revert code and files
   107  			err = ioutil.WriteFile(packageCmdPath+"/root.go", rootCode, os.ModePerm)
   108  			if err != nil {
   109  				log.Fatal("err:", err)
   110  			}
   111  			for _, provider := range deletedProvider {
   112  				err := os.Rename(packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix, "cmd/"+filePrefix+provider+fileSuffix)
   113  				if err != nil {
   114  					log.Println(err)
   115  				}
   116  			}
   117  		}
   118  	}
   119  }