github.com/suedadam/up@v0.1.12/project.go (about) 1 package up 2 3 import ( 4 "os" 5 "os/exec" 6 "time" 7 8 "github.com/apex/log" 9 "github.com/pkg/errors" 10 11 "github.com/apex/up/internal/util" 12 "github.com/apex/up/platform" 13 "github.com/apex/up/platform/event" 14 ) 15 16 // Project manager. 17 type Project struct { 18 config *Config 19 platform platform.Interface 20 events event.Events 21 } 22 23 // New project. 24 func New(c *Config, events event.Events) *Project { 25 return &Project{ 26 config: c, 27 events: events, 28 } 29 } 30 31 // WithPlatform to `platform`. 32 func (p *Project) WithPlatform(platform platform.Interface) *Project { 33 p.platform = platform 34 return p 35 } 36 37 // HookCommand returns a hook command by name or empty string. 38 func (p *Project) HookCommand(name string) string { 39 switch name { 40 case "build": 41 return p.config.Hooks.Build 42 case "clean": 43 return p.config.Hooks.Clean 44 default: 45 return "" 46 } 47 } 48 49 // RunHook runs a hook by name. 50 func (p *Project) RunHook(name string) error { 51 command := p.HookCommand(name) 52 53 if command == "" { 54 log.Debugf("hook %s is not defined", name) 55 return nil 56 } 57 58 defer p.events.Time("hook", event.Fields{ 59 "name": name, 60 })() 61 62 cmd := exec.Command("sh", "-c", command) 63 cmd.Env = os.Environ() 64 cmd.Env = append(cmd.Env, util.Env(p.config.Environment)...) 65 cmd.Env = append(cmd.Env, "PATH=node_modules/.bin:"+os.Getenv("PATH")) 66 67 b, err := cmd.CombinedOutput() 68 if err != nil { 69 return errors.New(string(b)) 70 } 71 72 return nil 73 } 74 75 // Build the project. 76 func (p *Project) Build() error { 77 defer p.events.Time("platform.build", nil)() 78 79 if err := p.RunHook("build"); err != nil { 80 return errors.Wrap(err, "build hook") 81 } 82 83 return p.platform.Build() 84 } 85 86 // Deploy the project. 87 func (p *Project) Deploy(stage string) error { 88 defer p.events.Time("deploy", nil)() 89 90 if err := p.Build(); err != nil { 91 return errors.Wrap(err, "building") 92 } 93 94 if err := p.deploy(stage); err != nil { 95 return errors.Wrap(err, "deploying") 96 } 97 98 if err := p.RunHook("clean"); err != nil { 99 return errors.Wrap(err, "clean hook") 100 } 101 102 return nil 103 } 104 105 // deploy stage. 106 func (p *Project) deploy(stage string) error { 107 return p.platform.Deploy(stage) 108 } 109 110 // Logs for the project. 111 func (p *Project) Logs(region, query string) platform.Logs { 112 return p.platform.Logs(region, query) 113 } 114 115 // URL returns the endpoint. 116 func (p *Project) URL(region, stage string) (string, error) { 117 return p.platform.URL(region, stage) 118 } 119 120 // CreateStack implementation. 121 func (p *Project) CreateStack(region, version string) error { 122 defer p.events.Time("stack.create", event.Fields{ 123 "region": region, 124 "version": version, 125 })() 126 127 return p.platform.CreateStack(region, version) 128 } 129 130 // DeleteStack implementation. 131 func (p *Project) DeleteStack(region string, wait bool) error { 132 defer p.events.Time("stack.delete", event.Fields{ 133 "region": region, 134 })() 135 136 return p.platform.DeleteStack(region, wait) 137 } 138 139 // ShowStack implementation. 140 func (p *Project) ShowStack(region string) error { 141 defer p.events.Time("stack.show", event.Fields{ 142 "region": region, 143 })() 144 145 return p.platform.ShowStack(region) 146 } 147 148 // ShowMetrics implementation. 149 func (p *Project) ShowMetrics(region, stage string, start time.Time) error { 150 defer p.events.Time("metrics", event.Fields{ 151 "region": region, 152 "stage": stage, 153 "start": start, 154 })() 155 156 return p.platform.ShowMetrics(region, stage, start) 157 } 158 159 // PlanStack implementation. 160 func (p *Project) PlanStack(region string) error { 161 defer p.events.Time("stack.plan", event.Fields{ 162 "region": region, 163 })() 164 165 return p.platform.PlanStack(region) 166 } 167 168 // ApplyStack implementation. 169 func (p *Project) ApplyStack(region string) error { 170 defer p.events.Time("stack.apply", event.Fields{ 171 "region": region, 172 })() 173 174 return p.platform.ApplyStack(region) 175 }