func BuildCreate(rw http.ResponseWriter, r *http.Request) *httperr.Error { build := models.NewBuild(mux.Vars(r)["app"]) build.Description = r.FormValue("description") manifest := r.FormValue("manifest") // empty value will default "docker-compose.yml" in cmd/build // use deprecated "config" param if set and "manifest" is not if config := r.FormValue("config"); config != "" && manifest == "" { manifest = config } if build.IsRunning() { err := fmt.Errorf("Another build is currently running. Please try again later.") helpers.TrackError("build", err, map[string]interface{}{"at": "build.IsRunning"}) return httperr.Server(err) } err := r.ParseMultipartForm(50 * 1024 * 1024) if err != nil && err != http.ErrNotMultipart { helpers.TrackError("build", err, map[string]interface{}{"at": "ParseMultipartForm"}) return httperr.Server(err) } err = build.Save() if err != nil { helpers.TrackError("build", err, map[string]interface{}{"at": "build.Save"}) return httperr.Server(err) } resources, err := models.ListResources(os.Getenv("RACK")) if err != nil { helpers.TrackError("build", err, map[string]interface{}{"at": "models.ListResources"}) return httperr.Server(err) } ch := make(chan error) source, _, err := r.FormFile("source") if err != nil && err != http.ErrMissingFile && err != http.ErrNotMultipart { helpers.TrackError("build", err, map[string]interface{}{"at": "FormFile"}) return httperr.Server(err) } cache := !(r.FormValue("cache") == "false") if source != nil { err = models.S3PutFile(resources["RegistryBucket"].Id, fmt.Sprintf("builds/%s.tgz", build.Id), source, false) if err != nil { helpers.TrackError("build", err, map[string]interface{}{"at": "models.S3PutFile"}) return httperr.Server(err) } go build.ExecuteLocal(source, cache, manifest, ch) err = <-ch if err != nil { helpers.TrackError("build", err, map[string]interface{}{"at": "models.ExecuteLocal"}) return httperr.Server(err) } else { return RenderJson(rw, build) } } if repo := r.FormValue("repo"); repo != "" { go build.ExecuteRemote(repo, cache, manifest, ch) err = <-ch if err != nil { helpers.TrackError("build", err, map[string]interface{}{"at": "build.ExecuteRemote"}) return httperr.Server(err) } else { return RenderJson(rw, build) } } if data := r.FormValue("index"); data != "" { var index models.Index err := json.Unmarshal([]byte(data), &index) if err != nil { return httperr.Server(err) } go build.ExecuteIndex(index, cache, manifest, ch) err = <-ch if err != nil { helpers.TrackError("build", err, map[string]interface{}{"at": "build.ExecuteIndex"}) return httperr.Server(err) } else { return RenderJson(rw, build) } } return httperr.Errorf(403, "no source or repo") }
func BuildCreate(rw http.ResponseWriter, r *http.Request) error { build := models.NewBuild(mux.Vars(r)["app"]) err := r.ParseMultipartForm(50 * 1024 * 1024) if err != nil && err != http.ErrNotMultipart { return err } err = build.Save() if err != nil { return err } resources, err := models.ListResources(os.Getenv("RACK")) if err != nil { return err } ch := make(chan error) source, _, err := r.FormFile("source") if err != nil && err != http.ErrMissingFile && err != http.ErrNotMultipart { return err } if source != nil { err = models.S3PutFile(resources["RegistryBucket"].Id, fmt.Sprintf("builds/%s.tgz", build.Id), source, false) if err != nil { return err } go build.ExecuteLocal(source, ch) err = <-ch if err != nil { return err } else { return RenderJson(rw, build) } } if repo := r.FormValue("repo"); repo != "" { go build.ExecuteRemote(repo, ch) err = <-ch if err != nil { return err } else { return RenderJson(rw, build) } } return fmt.Errorf("no source or repo") }
func BuildCreate(rw http.ResponseWriter, r *http.Request) *httperr.Error { build := models.NewBuild(mux.Vars(r)["app"]) config := r.FormValue("config") if build.IsRunning() { return httperr.Errorf(403, "another build is currently running. Please try again later.") } err := r.ParseMultipartForm(50 * 1024 * 1024) if err != nil && err != http.ErrNotMultipart { return httperr.Server(err) } err = build.Save() if err != nil { return httperr.Server(err) } resources, err := models.ListResources(os.Getenv("RACK")) if err != nil { return httperr.Server(err) } ch := make(chan error) source, _, err := r.FormFile("source") if err != nil && err != http.ErrMissingFile && err != http.ErrNotMultipart { return httperr.Server(err) } cache := !(r.FormValue("cache") == "false") if source != nil { err = models.S3PutFile(resources["RegistryBucket"].Id, fmt.Sprintf("builds/%s.tgz", build.Id), source, false) if err != nil { return httperr.Server(err) } go build.ExecuteLocal(source, cache, config, ch) err = <-ch if err != nil { return httperr.Server(err) } else { return RenderJson(rw, build) } } if repo := r.FormValue("repo"); repo != "" { go build.ExecuteRemote(repo, cache, config, ch) err = <-ch if err != nil { return httperr.Server(err) } else { return RenderJson(rw, build) } } return httperr.Errorf(403, "no source or repo") }