Skip to content
Snippets Groups Projects
build.go 2.04 KiB
package cmd

import (
	"fmt"
	"os"

	"orus.io/orus-io/beaver/runner"
)

type BuildCmd struct {
	Args struct {
		DryRun         bool   `short:"d" long:"dry-run" description:"if set only prints commands but do not run them"`
		Keep           bool   `short:"k" long:"keep" description:"Keep the temporary files"`
		Output         string `short:"o" long:"output" description:"output directory, use \"stdout\" to print to stdout"`
		Namespace      string `short:"n" long:"namespace" description:"force helm namespace flag for all helm charts"`
		WithoutHydrate bool   `short:"h" long:"without-hydrate" description:"don't hydrate files with beaver variables"`
	}
	PositionalArgs struct {
		DirName string `required:"yes" positional-arg-name:"directory"`
	} `positional-args:"yes"`
}

// NewBuildCmd ...
func NewBuildCmd() *BuildCmd {
	cmd := BuildCmd{}
	return &cmd
}

// Execute ...
func (cmd *BuildCmd) Execute([]string) error {
	log := LoggingOptions.Logger()
	log.Debug().Str("directory", cmd.PositionalArgs.DirName).Msg("starting beaver")

	config := runner.NewCmdConfig(
		log,
		".",
		cmd.PositionalArgs.DirName,
		cmd.Args.DryRun,
		cmd.Args.WithoutHydrate,
		cmd.Args.Output,
		cmd.Args.Namespace,
	)

	path, err := os.Getwd()
	if err != nil {
		log.Fatal().Err(err).Msg("cannot get current working directory")
	}

	tmpDir, err := os.MkdirTemp(path, ".beaver-")
	if err != nil {
		return fmt.Errorf("failed to create temp dir: %w", err)
	}
	if !cmd.Args.Keep {
		defer func() {
			if err := os.RemoveAll(tmpDir); err != nil {
				log.Err(err).Str("tempdir", tmpDir).Msg("failed to remove temp dir")
			}
		}()
	}

	if err := config.Initialize(tmpDir); err != nil {
		return fmt.Errorf("failed to prepare config: %w", err)
	}
	r := runner.NewRunner(config)
	return r.Build(tmpDir)
}

func init() {
	buildCmd := NewBuildCmd()
	_, err := parser.AddCommand("build", "Build new environment", "", buildCmd)
	if err != nil {
		Logger.Fatal().Msg(err.Error())
	}

	g, err := parser.AddGroup("Logging", "Logging options", LoggingOptions)
	if err != nil {
		panic(err)
	}
	g.Namespace = "log"
}