github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/cmd/chore/helpers.go (about) 1 package chore 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 "fmt" 8 "os" 9 "os/exec" 10 "path/filepath" 11 "runtime" 12 "strings" 13 ) 14 15 func Orbctl(debug, skipRebuild bool) (func(context.Context) *exec.Cmd, error) { 16 17 noop := func(context.Context) *exec.Cmd { return nil } 18 19 if skipRebuild { 20 return runOrbctlCmd(debug), nil 21 } 22 23 if err := BuildExecutables(debug, false); err != nil { 24 return noop, err 25 } 26 27 return runOrbctlCmd(debug), nil 28 } 29 30 func BuildExecutables(debug, hostBinsOnly bool) error { 31 32 cmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD") 33 outBuf := new(bytes.Buffer) 34 cmd.Stdout = outBuf 35 if err := run(cmd); err != nil { 36 return err 37 } 38 39 version := strings.TrimSpace(strings.Replace(outBuf.String(), "heads/", "", 1)) + "-dev" 40 41 cmd = exec.Command("git", "rev-parse", "HEAD") 42 outBuf = new(bytes.Buffer) 43 cmd.Stdout = outBuf 44 if err := run(cmd); err != nil { 45 return err 46 } 47 48 commit := strings.TrimSpace(outBuf.String()) 49 50 files, err := filepath.Glob("./cmd/chore/gen-executables/*.go") 51 if err != nil { 52 panic(err) 53 } 54 args := []string{"run", "-race"} 55 args = append(args, files...) 56 args = append(args, 57 "--version", version, 58 "--commit", commit, 59 "--githubclientid", os.Getenv("GITHUBOAUTHCLIENTID"), 60 "--githubclientsecret", os.Getenv("GITHUBOAUTHCLIENTSECRET"), 61 "--orbctl", "./artifacts", 62 "--dev", 63 ) 64 if debug { 65 args = append(args, "--debug") 66 } 67 if hostBinsOnly { 68 args = append(args, "--host-bins-only") 69 } 70 cmd = exec.Command("go", args...) 71 cmd.Stdout = os.Stderr 72 // gen-executables 73 if err := run(cmd); err != nil || hostBinsOnly { 74 // error contains --githubclientid and --githubclientsecret values 75 return errors.New("building executables failed") 76 } 77 78 files, err = filepath.Glob("./cmd/chore/gen-charts/*.go") 79 if err != nil { 80 panic(err) 81 } 82 args = []string{"build", "-o", "./artifacts/gen-charts"} 83 args = append(args, files...) 84 cmd = exec.Command("go", args...) 85 cmd.Stdout = os.Stderr 86 cmd.Env = []string{"CGO_ENABLED=0", "GOOS=linux"} 87 // gen-charts 88 return run(cmd) 89 } 90 91 func runOrbctlCmd(debug bool) func(context.Context) *exec.Cmd { 92 93 var extension string 94 95 if runtime.GOOS == "windows" { 96 extension = ".exe" 97 } 98 99 bin := fmt.Sprintf("./artifacts/orbctl-%s-x86_64%s", strings.ToUpper(runtime.GOOS[0:1])+runtime.GOOS[1:], extension) 100 return func(ctx context.Context) *exec.Cmd { 101 if debug { 102 return exec.CommandContext(ctx, "dlv", "exec", "--api-version", "2", "--headless", "--listen", "127.0.0.1:2345", bin, "--") 103 } 104 return exec.CommandContext(ctx, bin) 105 } 106 } 107 108 func run(cmd *exec.Cmd) error { 109 cmd.Stderr = os.Stderr 110 cmd.Env = append(cmd.Env, os.Environ()...) 111 if err := cmd.Run(); err != nil { 112 return fmt.Errorf("executing %s failed: %s", strings.Join(cmd.Args, " "), err.Error()) 113 } 114 return nil 115 }