public override HttpHandlerResult Post() { var qGitRefspec = GetQuery("refspec"); HttpBuildStartRequest startInfo = null; if (HttpContext.Request.ContentLength64 > 0) { startInfo = JsonSettings.Serializer.Deserialize <HttpBuildStartRequest>(HttpContext.Request.InputStream); } if (startInfo == null) { return(Response.BadRequest().SetText("No json request was found!")); } var _gitRefspec = qGitRefspec ?? startInfo.GitRefspec; try { if (!PhotonServer.Instance.Projects.TryGet(startInfo.ProjectId, out var project)) { return(Response.BadRequest().SetText($"Project '{startInfo.ProjectId}' was not found!")); } var projectData = PhotonServer.Instance.ProjectData.GetOrCreate(project.Id); var buildNumber = projectData.StartNewBuild(); var session = new ServerBuildSession { Project = project, AssemblyFilename = project.AssemblyFile, PreBuild = project.PreBuild, TaskName = startInfo.TaskName, GitRefspec = _gitRefspec, BuildNumber = buildNumber, Roles = startInfo.Roles, }; PhotonServer.Instance.Sessions.BeginSession(session); PhotonServer.Instance.Queue.Add(session); var response = new HttpBuildStartResponse { SessionId = session.SessionId, }; return(Response.Json(response)); } catch (Exception error) { Log.Error($"Failed to run Build-Task '{startInfo.TaskName}' from Project '{startInfo.ProjectId}' @ '{_gitRefspec}'!", error); return(Response.Exception(error)); } }
private async Task <HttpBuildStartResponse> StartSession(PhotonServerDefinition server, HttpBuildStartRequest request) { HttpClientEx client = null; MemoryStream requestStream = null; try { requestStream = new MemoryStream(); JsonSettings.Serializer.Serialize(requestStream, request, true); var url = NetPath.Combine(server.Url, "api/build/start"); client = HttpClientEx.Post(url, new { refspec = GitRefspec, }); requestStream.Seek(0, SeekOrigin.Begin); client.Body = requestStream; await client.Send(); if (client.ResponseBase.StatusCode == HttpStatusCode.BadRequest) { var text = await client.GetResponseTextAsync(); throw new ApplicationException($"Bad Build Request! {text}"); } return(client.ParseJsonResponse <HttpBuildStartResponse>()); } catch (HttpStatusCodeException error) { if (error.HttpCode == HttpStatusCode.NotFound) { throw new ApplicationException($"Photon-Server instance '{server.Name}' not found!"); } throw; } finally { requestStream?.Dispose(); client?.Dispose(); } }
public override async Task <HttpHandlerResult> PostAsync(CancellationToken token) { var qProject = GetQuery("project"); var qGitRefspec = GetQuery("refspec"); var qTaskName = GetQuery("task"); HttpBuildStartRequest startInfo = null; if (HttpContext.Request.ContentLength64 > 0) { startInfo = JsonSettings.Serializer.Deserialize <HttpBuildStartRequest>(HttpContext.Request.InputStream); } if (startInfo == null) { return(Response.BadRequest().SetText("No json request was found!")); } var _projectId = qProject ?? startInfo.ProjectId; var _gitRefspec = qGitRefspec ?? startInfo.GitRefspec; var _taskName = qTaskName ?? startInfo.TaskName; try { if (!PhotonServer.Instance.Projects.TryGet(_projectId, out var project)) { return(Response.BadRequest().SetText($"Project '{_projectId}' was not found!")); } var build = await project.StartNewBuild(); build.TaskName = _taskName; build.TaskRoles = startInfo.Roles; build.PreBuildCommand = project.Description.PreBuild; build.AssemblyFilename = project.Description.AssemblyFile; build.GitRefspec = _gitRefspec; var session = new ServerBuildSession { Project = project.Description, AssemblyFilename = project.Description.AssemblyFile, PreBuild = project.Description.PreBuild, TaskName = _taskName, GitRefspec = _gitRefspec, Build = build, Roles = startInfo.Roles, Mode = startInfo.Mode, }; build.ServerSessionId = session.SessionId; if (!string.IsNullOrEmpty(startInfo.AssemblyFilename)) { session.AssemblyFilename = startInfo.AssemblyFilename; } if (!string.IsNullOrEmpty(startInfo.PreBuildCommand)) { session.PreBuild = startInfo.PreBuildCommand; } PhotonServer.Instance.Sessions.BeginSession(session); PhotonServer.Instance.Queue.Add(session); var response = new HttpBuildStartResponse { SessionId = session.SessionId, BuildNumber = session.Build.Number, }; return(Response.Json(response)); } catch (Exception error) { Log.Error($"Failed to run Build-Task '{startInfo.TaskName}' from Project '{startInfo.ProjectId}' @ '{_gitRefspec}'!", error); return(Response.Exception(error)); } }