private void StartBuild(GithubCommit commit) { var project = PhotonServer.Instance.Projects.FirstOrDefault(x => string.Equals((x.Source as ProjectGithubSource)?.CloneUrl, commit.RepositoryUrl, StringComparison.OrdinalIgnoreCase)); if (project == null) { throw new ApplicationException($"No project found matching git url '{commit.RepositoryUrl}'!"); } var source = (ProjectGithubSource)project.Source; 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 = source.HookTaskName, GitRefspec = commit.Refspec, BuildNumber = buildNumber, Roles = source.HookTaskRoles, Commit = commit, }; if (source.NotifyOrigin == NotifyOrigin.Server && !string.IsNullOrEmpty(commit.Sha)) { ApplyGithubNotification(session, source, commit); } PhotonServer.Instance.Sessions.BeginSession(session); PhotonServer.Instance.Queue.Add(session); }
public override async Task <HttpHandlerResult> PostAsync(CancellationToken token) { var qProject = GetQuery("project"); var qGitRefspec = GetQuery("refspec"); var qTaskName = GetQuery("task"); try { if (!PhotonServer.Instance.Projects.TryGet(qProject, out var project)) { return(Response.BadRequest().SetText($"Project '{qProject}' was not found!")); } var buildTask = project.Description.BuildTasks .FirstOrDefault(x => string.Equals(x.Name, qTaskName, StringComparison.OrdinalIgnoreCase)); if (buildTask == null) { return(Response.BadRequest().SetText($"Build-Task '{qTaskName}' was not found!")); } var build = await project.StartNewBuild(); build.TaskName = buildTask.Name; build.TaskRoles = buildTask.Roles.ToArray(); build.PreBuildCommand = project.Description.PreBuild; build.AssemblyFilename = project.Description.AssemblyFile; build.GitRefspec = qGitRefspec ?? buildTask.GitRefspec; var session = new ServerBuildSession { Project = project.Description, AssemblyFilename = project.Description.AssemblyFile, PreBuild = project.Description.PreBuild, TaskName = buildTask.Name, GitRefspec = qGitRefspec ?? buildTask.GitRefspec, Build = build, Roles = buildTask.Roles.ToArray(), Mode = AgentStartModes.Any, // TODO: AgentStartMode.Parse(buildTask.AgentMode), }; build.ServerSessionId = session.SessionId; 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 '{qTaskName}' from Project '{qProject}' @ '{qGitRefspec}'!", error); return(Response.Exception(error)); } }
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)); } }
public async Task StartBuild() { if (string.IsNullOrWhiteSpace(TaskName)) { throw new ApplicationException("'Task Name' is undefined!"); } var _roles = TaskRoles.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim()).ToArray(); if (!PhotonServer.Instance.Projects.TryGet(ProjectId, out var project)) { throw new ApplicationException($"Project '{ProjectId}' was not found!"); } if (string.IsNullOrEmpty(GitRefspec)) { GitRefspec = "master"; } var build = await project.StartNewBuild(); build.TaskName = TaskName; build.TaskRoles = _roles; build.PreBuildCommand = PreBuildCommand; build.AssemblyFilename = AssemblyFilename; build.GitRefspec = GitRefspec; var session = new ServerBuildSession { Project = project.Description, AssemblyFilename = AssemblyFilename, PreBuild = PreBuildCommand, TaskName = TaskName, GitRefspec = GitRefspec, Build = build, Roles = _roles, Mode = AgentStartModes.Any, // TODO: Add to UI }; build.ServerSessionId = session.SessionId; PhotonServer.Instance.Sessions.BeginSession(session); PhotonServer.Instance.Queue.Add(session); ServerSessionId = session.SessionId; BuildNumber = session.Build.Number; }
private void ApplyGithubNotification(ServerBuildSession session, ProjectGithubSource source, GithubCommit commit) { var su = new CommitStatusUpdater { Username = source.Username, Password = source.Password, StatusUrl = commit.StatusesUrl, Sha = commit.Sha, }; session.PreBuildEvent += (o, e) => { var status = new CommitStatus { State = CommitStates.Pending, Context = "Photon", Description = "Build in progress..." }; su.Post(status).GetAwaiter().GetResult(); }; session.PostBuildEvent += (o, e) => { var status = new CommitStatus { Context = "Photon", }; if (session.Result.Cancelled) { status.State = CommitStates.Error; status.Description = "The build was cancelled."; } else if (session.Result.Successful) { status.State = CommitStates.Success; status.Description = $"Build Successful. {session.Result.Message}"; } else { status.State = CommitStates.Failure; status.Description = $"Build Failed! {session.Result.Message}"; } su.Post(status).GetAwaiter().GetResult(); }; }
private async Task StartBuild(GithubCommit commit) { var project = PhotonServer.Instance.Projects.All.FirstOrDefault(x => string.Equals((x.Description.Source as ProjectGithubSource)?.CloneUrl, commit.RepositoryUrl, StringComparison.OrdinalIgnoreCase)); if (project == null) { throw new ApplicationException($"No project found matching git url '{commit.RepositoryUrl}'!"); } var source = (ProjectGithubSource)project.Description.Source; var build = await project.StartNewBuild(); build.TaskName = source.HookTaskName; build.TaskRoles = source.HookTaskRoles; build.PreBuildCommand = project.Description.PreBuild; build.AssemblyFilename = project.Description.AssemblyFile; build.GitRefspec = commit.Refspec; build.Commit = commit; var session = new ServerBuildSession { Project = project.Description, AssemblyFilename = project.Description.AssemblyFile, PreBuild = project.Description.PreBuild, TaskName = source.HookTaskName, GitRefspec = commit.Refspec, Build = build, Roles = source.HookTaskRoles, Commit = commit, }; build.ServerSessionId = session.SessionId; if (source.NotifyOrigin == NotifyOrigin.Server && !string.IsNullOrEmpty(commit.Sha)) { ApplyGithubNotification(session, source, commit); } PhotonServer.Instance.Sessions.BeginSession(session); PhotonServer.Instance.Queue.Add(session); }
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)); } }