Example #1
0
            private string FormatBuildDetailsAndSummary()
            {
                string details            = string.Empty;
                string buildCausesSummary = string.Empty;

                // get a copy of the reference to avoid a race condition
                BuildStatus  projectStatus = Project.Status;
                BuildDetails lastBuild     = Project.LastBuild;

                if (lastBuild != null)
                {
                    // get a copy of the reference to avoid a race condition
                    BuildCauses lastBuildCauses = lastBuild.Causes;

                    if (lastBuildCauses != null)
                    {
                        if (projectStatus.IsInProgress)
                        {
                            TimeSpan progressts = lastBuild.EstimatedDuration;
                            string   timeleft   = FormatEstimatedDuration(lastBuild);

                            foreach (BuildCause cause in lastBuildCauses.Causes)
                            {
                                if (lastBuildCauses.HasUniqueCauses == false)
                                {
                                    buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_MultipleSources;
                                    break;
                                }

                                switch (cause.Cause)
                                {
                                case BuildCauseEnum.SCM:
                                {
                                    if (lastBuild.Users.Count == 0)
                                    {
                                        buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_SCM;
                                    }
                                    else if (lastBuild.Users.Count > 1)
                                    {
                                        buildCausesSummary = string.Format(JenkinsTrayResources.BuildDetails_Cause_SCM_Multiple, lastBuild.Users.Count);
                                    }
                                    else
                                    {
                                        buildCausesSummary = string.Format(JenkinsTrayResources.BuildDetails_Cause_SCM_Single, FormatUsers(lastBuild));
                                    }
                                }
                                break;

                                case BuildCauseEnum.User:
                                {
                                    buildCausesSummary = string.Format(JenkinsTrayResources.BuildDetails_Cause_User, cause.Starter);
                                }
                                break;

                                case BuildCauseEnum.RemoteHost:
                                {
                                    buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_RemoteHost;
                                }
                                break;

                                case BuildCauseEnum.Timer:
                                {
                                    buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_Timer;
                                }
                                break;

                                case BuildCauseEnum.UpstreamProject:
                                {
                                    buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_UpstreamProject;
                                }
                                break;
                                }
                            }
                            details = timeleft + buildCausesSummary;
                        }
                        else
                        {
                            if (projectStatus.Value == BuildStatusEnum.Successful)
                            {
                                details = FormatDuration(lastBuild);
                            }
                            else if (projectStatus.Value == BuildStatusEnum.Unstable)
                            {
                                details = projectStatus.Value.ToString() + ".";
                            }
                            else if (projectStatus.Value == BuildStatusEnum.Disabled)
                            {
                                details = string.Format("{0}. ", JenkinsTrayResources.BuildStatus_Disabled);
                            }
                            else
                            {
                                details = projectStatus.Value.ToString() + ". ";
                                if (lastBuild.Users != null && !lastBuild.Users.IsEmpty)
                                {
                                    details += string.Format(JenkinsTrayResources.BuildDetails_BrokenBy, FormatUsers(lastBuild));
                                }
                            }
                        }
                        if (Project.Queue.InQueue)
                        {
                            if (!projectStatus.IsInProgress)
                            {
                                details += string.Format(JenkinsTrayResources.BuildDetails_InQueue_Why, Project.Queue.Why);
                            }
                        }
                        if (projectStatus.IsStuck)
                        {
                            details = "Queued, possibly stuck. " + string.Format(JenkinsTrayResources.BuildDetails_InQueue_Why, Project.Queue.Why);
                        }
                    }
                }

                return(details);
            }
Example #2
0
        private BuildDetails GetBuildDetails(Credentials credentials, string buildUrl, bool ignoreUntrustedCertificate)
        {
            if (buildUrl == null)
            {
                return(null);
            }

            var url = NetUtils.ConcatUrls(buildUrl, "/api/xml", JenkinsService.buildDetailsFilter);

            if (logger.IsDebugEnabled)
            {
                logger.Debug("Getting build details from " + url);
            }

            var xmlStr = DownloadString(credentials, url, true, ignoreUntrustedCertificate);

            if (logger.IsTraceEnabled)
            {
                logger.Trace("XML: " + xmlStr);
            }

            var xml = new XmlDocument();

            xml.LoadXml(xmlStr);

            var number            = xml.SelectSingleNode("/*/number").InnerText;
            var fullDisplayName   = xml.SelectSingleNode("/*/fullDisplayName").InnerText;
            var timestamp         = xml.SelectSingleNode("/*/timestamp").InnerText;
            var estimatedDuration = xml.SelectSingleNode("/*/estimatedDuration").InnerText;
            var duration          = xml.SelectSingleNode("/*/duration").InnerText;
            var xmlResult         = xml.SelectSingleNode("/*/result");
            var result            = xmlResult == null ? string.Empty : xmlResult.InnerText;
            var userNodes         = xml.SelectNodes("/*/culprit/fullName");

            var ts   = TimeSpan.FromSeconds(long.Parse(timestamp) / 1000);
            var date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            date = date.Add(ts);
            var estimatedts = TimeSpan.FromSeconds(long.Parse(estimatedDuration) / 1000);
            var durationts  = TimeSpan.FromSeconds(long.Parse(estimatedDuration) / 1000);

            Spring.Collections.Generic.ISet <string> users = new HashedSet <string>();
            foreach (XmlNode userNode in userNodes)
            {
                var userName = StringUtils.ExtractUserName(userNode.InnerText);
                users.Add(userName);
            }

            var res = new BuildDetails();

            BuildCauses.FillInBuildCauses(res, xml);
            res.Number            = int.Parse(number);
            res.DisplayName       = fullDisplayName;
            res.Time              = date;
            res.EstimatedDuration = estimatedts;
            res.Duration          = durationts;
            res.Result            = BuildStatus.StringToBuildStatus(result);
            res.Users             = users;

            ClaimService.FillInBuildDetails(res, xml);

            if (logger.IsDebugEnabled)
            {
                logger.Debug("Done getting build details");
            }

            return(res);
        }