private bool IsRegressing(Project project) { AllBuildDetails lastBuildDetails; if (lastProjectsBuildDetails.TryGetValue(project, out lastBuildDetails) == false || lastBuildDetails == null) { return(false); } AllBuildDetails newBuildDetails = project.AllBuildDetails; if (newBuildDetails == null) { return(false); } // moving from unknown/aborted to successful should not be considered as a regression if (newBuildDetails.Status.Value <= BuildStatusEnum.Successful) { return(false); } bool res = BuildStatusUtils.IsWorse(newBuildDetails.Status, lastBuildDetails.Status); return(res); }
public AllBuildDetails UpdateProject(Project project) { var url = NetUtils.ConcatUrls(project.Url, "/api/xml"); //logger.Info("Updating project from " + url); var credentials = project.Server.Credentials; var ignoreUntrustedCertificate = project.Server.IgnoreUntrustedCertificate; var xmlStr = DownloadString(credentials, url, false, ignoreUntrustedCertificate); if (logger.IsTraceEnabled) { logger.Trace("XML: " + xmlStr); } var xml = new XmlDocument(); xml.LoadXml(xmlStr); var displayName = XmlUtils.SelectSingleNodeText(xml, "/*/displayName"); var inQueue = XmlUtils.SelectSingleNodeBoolean(xml, "/*/inQueue"); var inQueueSince = XmlUtils.SelectSingleNodeText(xml, "/*/queueItem/inQueueSince"); var queueId = XmlUtils.SelectSingleNodeText(xml, "/*/queueItem/id"); var why = XmlUtils.SelectSingleNodeText(xml, "/*/queueItem/why"); var stuck = XmlUtils.SelectSingleNodeBoolean(xml, "/*/queueItem/stuck"); var status = xml.SelectSingleNode("/*/color").InnerText; var lastBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastBuild/url"); var lastCompletedBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastCompletedBuild/url"); var lastSuccessfulBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastSuccessfulBuild/url"); var lastFailedBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastFailedBuild/url"); project.DisplayName = displayName; project.Queue.InQueue = inQueue.HasValue && inQueue.Value; if (!string.IsNullOrEmpty(queueId)) { project.Queue.Id = long.Parse(queueId); } if (!string.IsNullOrEmpty(inQueueSince)) { var ts = TimeSpan.FromSeconds(long.Parse(inQueueSince) / 1000); var date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); date = date.Add(ts); project.Queue.InQueueSince = date; } if (!string.IsNullOrEmpty(why)) { project.Queue.Why = why; } var res = new AllBuildDetails(); res.Status = GetStatus(status, stuck); res.LastBuild = GetBuildDetails(credentials, lastBuildUrl, ignoreUntrustedCertificate); res.LastCompletedBuild = GetBuildDetails(credentials, lastCompletedBuildUrl, ignoreUntrustedCertificate); res.LastSuccessfulBuild = GetBuildDetails(credentials, lastSuccessfulBuildUrl, ignoreUntrustedCertificate); res.LastFailedBuild = GetBuildDetails(credentials, lastFailedBuildUrl, ignoreUntrustedCertificate); //logger.Info("Done updating project"); return(res); }
public AllBuildDetails UpdateProject(Project project) { String url = NetUtils.ConcatUrls(project.Url, "/api/xml"); logger.Info("Updating project from " + url); Credentials credentials = project.Server.Credentials; bool ignoreUntrustedCertificate = project.Server.IgnoreUntrustedCertificate; String xmlStr = DownloadString(credentials, url, false, ignoreUntrustedCertificate); if (logger.IsTraceEnabled) { logger.Trace("XML: " + xmlStr); } XmlDocument xml = new XmlDocument(); xml.LoadXml(xmlStr); string status = xml.SelectSingleNode("/*/color").InnerText; string lastCompletedBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastCompletedBuild/url"); string lastSuccessfulBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastSuccessfulBuild/url"); string lastFailedBuildUrl = XmlUtils.SelectSingleNodeText(xml, "/*/lastFailedBuild/url"); bool? stuck = XmlUtils.SelectSingleNodeBoolean(xml, "/*/queueItem/stuck"); AllBuildDetails res = new AllBuildDetails(); res.Status = GetStatus(status, stuck); res.LastCompletedBuild = GetBuildDetails(credentials, lastCompletedBuildUrl, ignoreUntrustedCertificate); res.LastSuccessfulBuild = GetBuildDetails(credentials, lastSuccessfulBuildUrl, ignoreUntrustedCertificate); res.LastFailedBuild = GetBuildDetails(credentials, lastFailedBuildUrl, ignoreUntrustedCertificate); logger.Info("Done updating project"); return(res); }
private void DoUpdateProjectsInternal() { IDictionary <Server, ISet <Project> > projectsByServer = ConfigurationService.GetProjects(); var allWorkItemsGroup = new List <IWorkItemsGroup>(); var allFutureBuildDetails = new Dictionary <Project, IWorkItemResult>(); foreach (KeyValuePair <Server, ISet <Project> > pair in projectsByServer) { Server server = pair.Key; ISet <Project> projects = pair.Value; IWorkItemsGroup workItemsGroup = threadPool.CreateWorkItemsGroup(THREAD_COUNT_BY_DOMAIN); allWorkItemsGroup.Add(workItemsGroup); foreach (Project project in projects) { WorkItemCallback work = delegate(object state) { AllBuildDetails newBuildDetail = null; try { Project project_ = (Project)state; newBuildDetail = HudsonService.UpdateProject(project_); } catch (Exception ex) { LoggingHelper.LogError(logger, ex); } return(newBuildDetail); }; IWorkItemResult futureRes = workItemsGroup.QueueWorkItem(work, project); allFutureBuildDetails[project] = futureRes; } } foreach (IWorkItemsGroup workItemsGroup in allWorkItemsGroup) { workItemsGroup.WaitForIdle(); } foreach (ISet <Project> projects in projectsByServer.Values) { foreach (Project project in projects) { IWorkItemResult newStatus; allFutureBuildDetails.TryGetValue(project, out newStatus); project.AllBuildDetails = newStatus != null ? (AllBuildDetails)newStatus.Result : null; } } if (ProjectsUpdated != null) { ProjectsUpdated(); } }
private bool HasBuild(AllBuildDetails allBuildDetails) { // no details, there is no build if (allBuildDetails == null) { return(false); } // if there is a completed build, there is a build if (allBuildDetails.LastCompletedBuild != null) { return(true); } // if there is a build in progress, there is a build var buildInProgress = allBuildDetails.Status.IsInProgress; return(buildInProgress); }
private void DoUpdateProjectsInternal() { var projectsByServer = ConfigurationService.GetProjects(); var allWorkItemsGroup = new List <IWorkItemsGroup>(); var allFutureBuildDetails = new Dictionary <Project, IWorkItemResult>(); foreach (var pair in projectsByServer) { var server = pair.Key; var projects = pair.Value; var workItemsGroup = threadPool.CreateWorkItemsGroup(THREAD_COUNT_BY_DOMAIN); allWorkItemsGroup.Add(workItemsGroup); foreach (var project in projects) { WorkItemCallback work = delegate(object state) { AllBuildDetails newBuildDetail = null; try { var project_ = (Project)state; newBuildDetail = JenkinsService.UpdateProject(project_); } catch (Exception ex) { LoggingHelper.LogError(logger, ex); } return(newBuildDetail); }; var futureRes = workItemsGroup.QueueWorkItem(work, project); allFutureBuildDetails[project] = futureRes; } } foreach (var workItemsGroup in allWorkItemsGroup) { workItemsGroup.WaitForIdle(); } foreach (var projects in projectsByServer.Values) { foreach (var project in projects) { IWorkItemResult newStatus; allFutureBuildDetails.TryGetValue(project, out newStatus); var previousAllBuildDetails = project.AllBuildDetails; if (newStatus != null) { project.AllBuildDetails = (AllBuildDetails)newStatus.Result; project.Activity.HasNewBuild = false; if (previousAllBuildDetails != null && project.AllBuildDetails != null) { project.PreviousStatus = previousAllBuildDetails.Status; if (previousAllBuildDetails.LastBuild != null && project.AllBuildDetails.LastBuild != null) { // Has existing LastBuilds if (previousAllBuildDetails.LastBuild.Number != project.AllBuildDetails.LastBuild.Number) { project.Activity.HasNewBuild = true; } } else if (previousAllBuildDetails.LastBuild == null && project.AllBuildDetails.LastBuild != null) { // 1st new LastBuild is found project.Activity.HasNewBuild = true; } } } } } if (ProjectsUpdated != null) { ProjectsUpdated(); } }