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  }