예제 #1
0
        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);
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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));
            }
        }
예제 #4
0
        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;
        }
예제 #5
0
        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();
            };
        }
예제 #6
0
        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);
        }
예제 #7
0
        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));
            }
        }