github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/packager/dev.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package packager contains functions for interacting with, managing and deploying Jackal packages.
     5  package packager
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  	"runtime"
    11  
    12  	"github.com/Racer159/jackal/src/config"
    13  	"github.com/Racer159/jackal/src/internal/packager/validate"
    14  	"github.com/Racer159/jackal/src/pkg/layout"
    15  	"github.com/Racer159/jackal/src/pkg/message"
    16  	"github.com/Racer159/jackal/src/pkg/packager/creator"
    17  	"github.com/Racer159/jackal/src/pkg/packager/filters"
    18  	"github.com/Racer159/jackal/src/pkg/packager/variables"
    19  	"github.com/Racer159/jackal/src/types"
    20  	"github.com/defenseunicorns/pkg/helpers"
    21  )
    22  
    23  // DevDeploy creates + deploys a package in one shot
    24  func (p *Packager) DevDeploy() error {
    25  	config.CommonOptions.Confirm = true
    26  	p.cfg.CreateOpts.SkipSBOM = !p.cfg.CreateOpts.NoYOLO
    27  
    28  	cwd, err := os.Getwd()
    29  	if err != nil {
    30  		return err
    31  	}
    32  
    33  	if err := os.Chdir(p.cfg.CreateOpts.BaseDir); err != nil {
    34  		return fmt.Errorf("unable to access directory %q: %w", p.cfg.CreateOpts.BaseDir, err)
    35  	}
    36  
    37  	pc := creator.NewPackageCreator(p.cfg.CreateOpts, p.cfg, cwd)
    38  
    39  	if err := helpers.CreatePathAndCopy(layout.JackalYAML, p.layout.JackalYAML); err != nil {
    40  		return err
    41  	}
    42  
    43  	p.cfg.Pkg, p.warnings, err = pc.LoadPackageDefinition(p.layout)
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	filter := filters.Combine(
    49  		filters.ByLocalOS(runtime.GOOS),
    50  		filters.ForDeploy(p.cfg.PkgOpts.OptionalComponents, false),
    51  	)
    52  	p.cfg.Pkg.Components, err = filter.Apply(p.cfg.Pkg)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	if err := validate.Run(p.cfg.Pkg); err != nil {
    58  		return fmt.Errorf("unable to validate package: %w", err)
    59  	}
    60  
    61  	if err := variables.SetVariableMapInConfig(p.cfg); err != nil {
    62  		return err
    63  	}
    64  
    65  	// If building in yolo mode, strip out all images and repos
    66  	if !p.cfg.CreateOpts.NoYOLO {
    67  		for idx := range p.cfg.Pkg.Components {
    68  			p.cfg.Pkg.Components[idx].Images = []string{}
    69  			p.cfg.Pkg.Components[idx].Repos = []string{}
    70  		}
    71  	}
    72  
    73  	if err := pc.Assemble(p.layout, p.cfg.Pkg.Components, p.cfg.Pkg.Metadata.Architecture); err != nil {
    74  		return err
    75  	}
    76  
    77  	message.HeaderInfof("📦 PACKAGE DEPLOY %s", p.cfg.Pkg.Metadata.Name)
    78  
    79  	p.connectStrings = make(types.ConnectStrings)
    80  
    81  	if !p.cfg.CreateOpts.NoYOLO {
    82  		p.cfg.Pkg.Metadata.YOLO = true
    83  	} else {
    84  		p.hpaModified = false
    85  		// Reset registry HPA scale down whether an error occurs or not
    86  		defer p.resetRegistryHPA()
    87  	}
    88  
    89  	// Get a list of all the components we are deploying and actually deploy them
    90  	deployedComponents, err := p.deployComponents()
    91  	if err != nil {
    92  		return err
    93  	}
    94  	if len(deployedComponents) == 0 {
    95  		message.Warn("No components were selected for deployment.  Inspect the package to view the available components and select components interactively or by name with \"--components\"")
    96  	}
    97  
    98  	// Notify all the things about the successful deployment
    99  	message.Successf("Jackal dev deployment complete")
   100  
   101  	message.HorizontalRule()
   102  	message.Title("Next steps:", "")
   103  
   104  	message.JackalCommand("package inspect %s", p.cfg.Pkg.Metadata.Name)
   105  
   106  	// cd back
   107  	return os.Chdir(cwd)
   108  }