github.com/hazelops/ize@v1.1.12-0.20230915191306-97d7c0e48f11/internal/manager/serverless/serverless.go (about)

     1  package serverless
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/hazelops/ize/internal/config"
    11  	"github.com/sirupsen/logrus"
    12  
    13  	"github.com/hazelops/ize/pkg/terminal"
    14  )
    15  
    16  type Manager struct {
    17  	Project *config.Project
    18  	App     *config.Serverless
    19  }
    20  
    21  func (sls *Manager) Nvm(ui terminal.UI, command []string) error {
    22  	sls.prepare()
    23  
    24  	sg := ui.StepGroup()
    25  	defer sg.Wait()
    26  
    27  	s := sg.Add("%s: running '%s'...", sls.App.Name, strings.Join(command, " "))
    28  	defer func() { s.Abort(); time.Sleep(time.Millisecond * 200) }()
    29  
    30  	err := sls.nvm(s.TermOutput(), strings.Join(command, " "))
    31  	if err != nil {
    32  		return fmt.Errorf("can't run nvm: %w", err)
    33  	}
    34  
    35  	s.Done()
    36  	s = sg.Add("%s: running '%s' completed!", sls.App.Name, strings.Join(command, " "))
    37  	s.Done()
    38  
    39  	return nil
    40  }
    41  
    42  func (sls *Manager) prepare() {
    43  	if sls.App.Path == "" {
    44  		appsPath := sls.Project.AppsPath
    45  		if !filepath.IsAbs(appsPath) {
    46  			appsPath = filepath.Join(os.Getenv("PWD"), appsPath)
    47  		}
    48  
    49  		sls.App.Path = filepath.Join(appsPath, sls.App.Name)
    50  	} else {
    51  		rootDir := sls.Project.RootDir
    52  
    53  		if !filepath.IsAbs(sls.App.Path) {
    54  			sls.App.Path = filepath.Join(rootDir, sls.App.Path)
    55  		}
    56  	}
    57  
    58  	if len(sls.App.File) == 0 {
    59  		_, err := os.Stat(filepath.Join(sls.App.Path, "serverless.ts"))
    60  		if os.IsNotExist(err) {
    61  			sls.App.File = "serverless.yml"
    62  		} else {
    63  			sls.App.File = "serverless.ts"
    64  		}
    65  	}
    66  
    67  	if len(sls.App.ServerlessVersion) == 0 {
    68  		sls.App.ServerlessVersion = "2"
    69  	}
    70  
    71  	if len(sls.App.SLSNodeModuleCacheMount) == 0 {
    72  		sls.App.SLSNodeModuleCacheMount = fmt.Sprintf("%s-node-modules", sls.App.Name)
    73  	}
    74  
    75  	if len(sls.App.AwsProfile) == 0 {
    76  		sls.App.AwsProfile = sls.Project.AwsProfile
    77  	}
    78  
    79  	if len(sls.App.AwsRegion) == 0 {
    80  		sls.App.AwsRegion = sls.Project.AwsRegion
    81  	}
    82  
    83  	sls.App.Env = append(sls.App.Env, "SLS_DEBUG=*")
    84  }
    85  
    86  func (sls *Manager) Deploy(ui terminal.UI) error {
    87  	sls.prepare()
    88  
    89  	sg := ui.StepGroup()
    90  	defer sg.Wait()
    91  
    92  	s := sg.Add("%s: deploying app...", sls.App.Name)
    93  	defer func() { s.Abort(); time.Sleep(time.Millisecond * 200) }()
    94  
    95  	switch sls.Project.PreferRuntime {
    96  	case "native":
    97  		s.Update("%s: deploying app [run nvm use]...", sls.App.Name)
    98  
    99  		err := sls.runNvm(s.TermOutput())
   100  		if err != nil {
   101  			return fmt.Errorf("can't run nvm: %w", err)
   102  		}
   103  
   104  		s.Done()
   105  		s = sg.Add("%s: deploying app [run dependency install]...", sls.App.Name)
   106  		err = sls.runNpmInstall(s.TermOutput())
   107  		if err != nil {
   108  			return fmt.Errorf("can't run dependency install: %w", err)
   109  		}
   110  
   111  		if sls.App.CreateDomain {
   112  			s.Done()
   113  			s = sg.Add("%s: deploying app [run serverless create_domain]...", sls.App.Name)
   114  			err = sls.runCreateDomain(s.TermOutput())
   115  			if err != nil {
   116  				return fmt.Errorf("can't run serverless create_domain: %w", err)
   117  			}
   118  		}
   119  
   120  		s.Done()
   121  		s = sg.Add("%s: deploying app [run serverless deploy]...", sls.App.Name)
   122  		err = sls.runDeploy(s.TermOutput())
   123  		if err != nil {
   124  			return fmt.Errorf("can't run serverless deploy: %w", err)
   125  		}
   126  	case "docker":
   127  		err := sls.deployWithDocker(s)
   128  		if err != nil {
   129  			return err
   130  		}
   131  	}
   132  
   133  	s.Done()
   134  	s = sg.Add("%s: deployment completed!", sls.App.Name)
   135  	s.Done()
   136  
   137  	logrus.SetOutput(os.Stderr)
   138  
   139  	return nil
   140  }
   141  
   142  func (sls *Manager) Destroy(ui terminal.UI, autoApprove bool) error {
   143  	sls.prepare()
   144  
   145  	sg := ui.StepGroup()
   146  	defer sg.Wait()
   147  
   148  	s := sg.Add("%s: destroying app...", sls.App.Name)
   149  	defer func() { s.Abort(); time.Sleep(time.Millisecond * 200) }()
   150  
   151  	switch sls.Project.PreferRuntime {
   152  	case "native":
   153  		s.Update("%s: destroying app [run nvm use]...", sls.App.Name)
   154  
   155  		err := sls.runNvm(s.TermOutput())
   156  		if err != nil {
   157  			return fmt.Errorf("can't run nvm: %w", err)
   158  		}
   159  
   160  		s.Done()
   161  		s = sg.Add("%s: destroying app [run dependency install]...", sls.App.Name)
   162  		err = sls.runNpmInstall(s.TermOutput())
   163  		if err != nil {
   164  			return fmt.Errorf("can't run dependency install: %w", err)
   165  		}
   166  
   167  		if sls.App.CreateDomain {
   168  			s.Done()
   169  			s = sg.Add("%s: destroying app [run serverless delete_domain]...", sls.App.Name)
   170  			err = sls.runRemoveDomain(s.TermOutput())
   171  			if err != nil {
   172  				return fmt.Errorf("can't run serverless delete_domain: %w", err)
   173  			}
   174  		}
   175  
   176  		s.Done()
   177  		s = sg.Add("%s: destroying app [run serverless remove]...", sls.App.Name)
   178  		err = sls.runRemove(s.TermOutput())
   179  		if err != nil {
   180  			return fmt.Errorf("can't run serverless deploy: %w", err)
   181  		}
   182  	case "docker":
   183  		err := sls.removeWithDocker(s)
   184  		if err != nil {
   185  			return err
   186  		}
   187  	}
   188  
   189  	s.Done()
   190  	s = sg.Add("%s: destroy completed!", sls.App.Name)
   191  	s.Done()
   192  
   193  	return nil
   194  }
   195  
   196  func (sls *Manager) Push(ui terminal.UI) error {
   197  	return nil
   198  }
   199  
   200  func (sls *Manager) Build(ui terminal.UI) error {
   201  	return nil
   202  }
   203  
   204  func (sls *Manager) Redeploy(ui terminal.UI) error {
   205  	return nil
   206  }