private async Task <ActionResult> Finish(Guid id, int number, bool error = false) { if (id == Guid.Empty) { return(BadRequest()); } Step next = null; using (await syncService.GetLockObject(SyncService.Job)) { var job = await jobService.GetById(id); if (job == null) { return(NotFound("Job not found")); } Step current = job.Steps.Find(s => s.Number == number); if (current == null) { return(NotFound("Step not found")); } if (current.State != ProcessingState.InProgress) { return(StatusCode(406, "Step is not in progress")); } current.State = error ? ProcessingState.Error : ProcessingState.Done; current.End = DateTime.UtcNow; if (!error) { next = job.Steps.Find(s => s.Number == current.Number + 1); } if (next == null) { job.Finished = DateTime.UtcNow; job.State = current.State; } else { next.State = ProcessingState.Scheduled; } await jobService.Update(id, job); } if (next != null) { longPollingService.Notify(LongPollingService.StepsCreated); } return(Ok()); }
public async Task <ActionResult> TriggerBuild(Guid projectId, JobInitiator initiator) { if (projectId == Guid.Empty) { return(BadRequest()); } Project project = await projectService.GetById(projectId); if (project == null) { return(NotFound()); } IEnumerable <Job> jobs = await jobService.GetBy(t => t.ProjectId == projectId && t.State != ProcessingState.Done && t.State != ProcessingState.Error); if (jobs.Count() > 0) { return(new StatusCodeResult(503)); } Job job = new Job(); job.Created = DateTime.Now; job.Initiator = initiator; job.ProjectId = project.Id; job.State = ProcessingState.Created; job.Steps = new List <Step>(new Step[] { new Step { Number = 0, Name = "Bootstrap", State = ProcessingState.Scheduled, } }); await jobService.Add(job); longPollingService.Notify(LongPollingService.StepsCreated); return(Ok(job)); }