// Deploy runs a deployment of an application. It will first try to run an // archive based deploy (if opts.ArchiveURL is not empty), and then fallback to // the Git based deployment. func Deploy(opts DeployOptions) error { var pipeline *action.Pipeline start := time.Now() if cprovisioner, ok := Provisioner.(provision.CustomizedDeployPipelineProvisioner); ok { pipeline = cprovisioner.DeployPipeline() } else { actions := []*action.Action{&ProvisionerDeploy, &IncrementDeploy} pipeline = action.NewPipeline(actions...) } logWriter := LogWriter{App: opts.App, Writer: opts.OutputStream} err := pipeline.Execute(opts, &logWriter) elapsed := time.Since(start) if err != nil { saveDeployData(opts.App.Name, opts.Commit, elapsed, err) return err } if opts.App.UpdatePlatform == true { opts.App.SetUpdatePlatform(false) } return saveDeployData(opts.App.Name, opts.Commit, elapsed, nil) }
func (p *dockerProvisioner) runReplaceUnitsPipeline(w io.Writer, a provision.App, toAdd map[string]*containersToAdd, toRemoveContainers []container.Container, imageId string, toHosts ...string) ([]container.Container, error) { var toHost string if len(toHosts) > 0 { toHost = toHosts[0] } if w == nil { w = ioutil.Discard } args := changeUnitsPipelineArgs{ app: a, toAdd: toAdd, toRemove: toRemoveContainers, toHost: toHost, writer: w, imageId: imageId, provisioner: p, } var pipeline *action.Pipeline if p.isDryMode { pipeline = action.NewPipeline( &provisionAddUnitsToHost, &provisionRemoveOldUnits, ) } else { pipeline = action.NewPipeline( &provisionAddUnitsToHost, &bindAndHealthcheck, &addNewRoutes, &removeOldRoutes, &updateAppImage, &provisionRemoveOldUnits, &provisionUnbindOldUnits, ) } err := pipeline.Execute(args) if err != nil { return nil, err } return pipeline.Result().([]container.Container), nil }