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  }