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