func DeleteBuild(c *gin.Context) { repo := session.Repo(c) // parse the build number and job sequence number from // the repquest parameter. num, _ := strconv.Atoi(c.Params.ByName("number")) seq, _ := strconv.Atoi(c.Params.ByName("job")) build, err := store.GetBuildNumber(c, repo, num) if err != nil { c.AbortWithError(404, err) return } job, err := store.GetJobNumber(c, build, seq) if err != nil { c.AbortWithError(404, err) return } bus.Publish(c, bus.NewEvent(bus.Cancelled, repo, build, job)) c.String(204, "") }
func DeleteBuild(c *gin.Context) { repo := session.Repo(c) // parse the build number and job sequence number from // the repquest parameter. num, _ := strconv.Atoi(c.Params.ByName("number")) seq, _ := strconv.Atoi(c.Params.ByName("job")) build, err := store.GetBuildNumber(c, repo, num) if err != nil { c.AbortWithError(404, err) return } job, err := store.GetJobNumber(c, build, seq) if err != nil { c.AbortWithError(404, err) return } if job.Status != model.StatusRunning { c.String(400, "Cannot cancel a non-running build") return } job.Status = model.StatusKilled job.Finished = time.Now().Unix() if job.Started == 0 { job.Started = job.Finished } job.ExitCode = 137 store.UpdateBuildJob(c, build, job) bus.Publish(c, bus.NewEvent(bus.Cancelled, repo, build, job)) c.String(204, "") }
// Update handles build updates from the agent and persists to the database. func Update(c *gin.Context) { work := &queue.Work{} if err := c.BindJSON(work); err != nil { logrus.Errorf("Invalid input. %s", err) return } // TODO(bradrydzewski) it is really annoying that we have to do this lookup // and I'd prefer not to. The reason we do this is because the Build and Job // have fields that aren't serialized to json and would be reset to their // empty values if we just saved what was coming in the http.Request body. build, err := store.GetBuild(c, work.Build.ID) if err != nil { c.String(404, "Unable to find build. %s", err) return } job, err := store.GetJob(c, work.Job.ID) if err != nil { c.String(404, "Unable to find job. %s", err) return } build.Started = work.Build.Started build.Finished = work.Build.Finished build.Status = work.Build.Status job.Started = work.Job.Started job.Finished = work.Job.Finished job.Status = work.Job.Status job.ExitCode = work.Job.ExitCode job.Error = work.Job.Error if build.Status == model.StatusPending { build.Started = work.Job.Started build.Status = model.StatusRunning store.UpdateBuild(c, build) } // if job.Status == model.StatusRunning { // err := stream.Create(c, stream.ToKey(job.ID)) // if err != nil { // logrus.Errorf("Unable to create stream. %s", err) // } // } ok, err := store.UpdateBuildJob(c, build, job) if err != nil { c.String(500, "Unable to update job. %s", err) return } if ok && build.Status != model.StatusRunning { // get the user because we transfer the user form the server to agent // and back we lose the token which does not get serialized to json. user, err := store.GetUser(c, work.User.ID) if err != nil { c.String(500, "Unable to find user. %s", err) return } remote.Status(c, user, work.Repo, build, fmt.Sprintf("%s/%s/%d", work.System.Link, work.Repo.FullName, work.Build.Number)) } if build.Status == model.StatusRunning { bus.Publish(c, bus.NewEvent(bus.Started, work.Repo, build, job)) } else { bus.Publish(c, bus.NewEvent(bus.Finished, work.Repo, build, job)) } c.JSON(200, work) }