github.com/franciscocpg/up@v0.1.10/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  }