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 }