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