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  }