コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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();
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
            }
        }