Exemple #1
0
        public void ClaimBuild(Project project, BuildDetails buildDetails, string reason, bool sticky)
        {
            var url     = NetUtils.ConcatUrls(project.Url, buildDetails.Number.ToString(), "/claim/claim");
            var request = (HttpWebRequest)WebRequest.Create(url);

            request.Method      = "POST";
            request.ContentType = "application/x-www-form-urlencoded";

            // we don't want to follow redirections
            request.AllowAutoRedirect = false;

            // currently supporting assigning to self
            var assignee = string.Empty;

            var credentials = project.Server.Credentials;

            if (credentials != null)
            {
                // claim plugin requests uses the username from the session cookie but not from request credentials
                request.Credentials = new NetworkCredential(credentials.Username, credentials.Password);
                assignee            = credentials.Username;
            }

            try
            {
                using (var postStream = request.GetRequestStream())
                {
                    var claim = new ClaimDetailsDto
                    {
                        Assignee = assignee,
                        Reason   = reason,
                        Sticky   = sticky
                    };

                    var stream     = new MemoryStream();
                    var serializer = new DataContractJsonSerializer(typeof(ClaimDetailsDto));
                    serializer.WriteObject(stream, claim);
                    var json = Encoding.UTF8.GetString(stream.ToArray());

                    var postData = "json=" + HttpUtility.UrlEncode(json, Encoding.UTF8);
                    using (var writer = new StreamWriter(postStream))
                    {
                        writer.Write(postData);
                    }
                }

                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    if (response.StatusCode != HttpStatusCode.Found && response.StatusCode != HttpStatusCode.OK)
                    {
                        throw new Exception("Received response code " + response.StatusCode);
                    }
                }
            }
            catch (WebException webEx)
            {
                MessageBox.Show(webEx.Message, "Claim failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                LoggingHelper.LogError(logger, webEx);
            }
            catch (Exception ex)
            {
                LoggingHelper.LogError(logger, ex);
            }
            var buildUrl = NetUtils.ConcatUrls(project.Url, buildDetails.Number.ToString(), "/api/xml", JenkinsService.buildDetailsFilter);

            JenkinsService.RemoveFromCache(buildUrl);
        }
Exemple #2
0
        private BuildDetails GetBuildDetails(Credentials credentials, string buildUrl, bool ignoreUntrustedCertificate)
        {
            if (buildUrl == null)
            {
                return(null);
            }

            String url = NetUtils.ConcatUrls(buildUrl, "/api/xml");

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

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

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

            XmlDocument xml = new XmlDocument();

            xml.LoadXml(xmlStr);

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

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

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

            ISet <string> users = new HashedSet <string>();

            foreach (XmlNode userNode in userNodes)
            {
                string userName = StringUtils.ExtractUserName(userNode.InnerText);
                users.Add(userName);
            }

            BuildDetails 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);
        }
Exemple #3
0
        // FIXME: the framework doesn't fire correctly MouseClick and MouseDoubleClick,
        // so this is deactivated
        private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }

            try
            {
                // order the projects by build status
                var projectsByStatus = new Dictionary <BuildStatusEnum, SortedSet <Project> >();
                foreach (KeyValuePair <Project, AllBuildDetails> pair in lastProjectsBuildDetails)
                {
                    BuildStatusEnum status = BuildStatusEnum.Unknown;
                    if (pair.Value != null)
                    {
                        status = BuildStatusUtils.DegradeStatus(pair.Value.Status).Value;
                    }
                    SortedSet <Project> projects = new SortedSet <Project>();
                    if (projectsByStatus.TryGetValue(status, out projects) == false)
                    {
                        projects = new SortedSet <Project>();
                        projectsByStatus.Add(status, projects);
                    }
                    projects.Add(pair.Key);
                }

                StringBuilder text   = new StringBuilder();
                string        prefix = null;
                foreach (KeyValuePair <BuildStatusEnum, SortedSet <Project> > pair in projectsByStatus)
                {
                    // don't display successful projects unless this is the only status
                    if (pair.Key == BuildStatusEnum.Successful || projectsByStatus.Count == 1)
                    {
                        continue;
                    }

                    if (prefix != null)
                    {
                        text.Append(prefix);
                    }
                    string statusText = HudsonTrayTrackerResources.ResourceManager
                                        .GetString("BuildStatus_" + pair.Key.ToString());
                    text.Append(statusText);
                    foreach (Project project in pair.Value)
                    {
                        text.Append("\n  - ").Append(project.Name);

                        BuildDetails lastFailedBuild = project.LastFailedBuild;
                        if (lastFailedBuild != null && lastFailedBuild.Users != null && lastFailedBuild.Users.Count > 0)
                        {
                            string users = StringUtils.Join(lastFailedBuild.Users, ", ");
                            text.Append(" (").Append(users).Append(")");
                        }
                    }
                    prefix = "\n";
                }

                string textToDisplay = text.ToString();
                if (string.IsNullOrEmpty(textToDisplay))
                {
                    textToDisplay = HudsonTrayTrackerResources.DisplayBuildStatus_NoProjects;
                }
                notifyIcon.ShowBalloonTip(10000, HudsonTrayTrackerResources.DisplayBuildStatus_Caption,
                                          textToDisplay, ToolTipIcon.Info);
            }
            catch (Exception ex)
            {
                LoggingHelper.LogError(logger, ex);
            }
        }
Exemple #4
0
        public async Task <bool> AddWin10Builds(NewBuildPost apiModel)
        {
            if (apiModel == null)
            {
                return(false);
            }

            if (Membership.ValidateUser(apiModel.Username, apiModel.Password) &&
                (Roles.IsUserInRole(apiModel.Username, "Editors") ||
                 Roles.IsUserInRole(apiModel.Username, "Administrators")))
            {
                var generateOldItem = new Func <NewBuild, BuildDetails>(nb =>
                {
                    var bi = new BuildDetails
                    {
                        MajorVersion = nb.MajorVersion,
                        MinorVersion = nb.MinorVersion,
                        Number       = nb.Number,
                        Revision     = nb.Revision,
                        Lab          = nb.Lab,
                        BuildTime    = nb.BuildTime.HasValue
                            ? DateTime.SpecifyKind(nb.BuildTime.Value, DateTimeKind.Utc)
                            : null as DateTime?,
                        SourceType = TypeOfSource.PrivateLeak
                    };

                    return(bi);
                });

                var builds = apiModel.NewBuilds.Select(nb => new Build
                {
                    MajorVersion = nb.MajorVersion,
                    MinorVersion = nb.MinorVersion,
                    Number       = nb.Number,
                    Revision     = nb.Revision,
                    Lab          = nb.Lab,
                    BuildTime    = nb.BuildTime.HasValue
                        ? DateTime.SpecifyKind(nb.BuildTime.Value, DateTimeKind.Utc)
                        : null as DateTime?,
                    Added      = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
                    Modified   = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
                    SourceType = TypeOfSource.PrivateLeak,

                    History = new List <ItemHistory <BuildDetails> >
                    {
                        new ItemHistory <BuildDetails>
                        {
                            Type     = ItemHistoryType.Added,
                            Time     = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
                            UserName = apiModel.Username,
                            Item     = generateOldItem(nb)
                        }
                    }
                });

                foreach (Build build in builds)
                {
                    await _bModel.Insert(build);

                    var osc = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]);
                    osc.PushNewBuild(build,
                                     $"https://buildfeed.net{Url.Route("Build", new { controller = "Front", action = nameof(FrontController.ViewBuild), id = build.Id, area = "", httproute = "" })}?utm_source=notification&utm_campaign=new_build");
                }

                return(true);
            }

            return(false);
        }
        public async Task <ActionResult> EditBuild(Guid id, Build build)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    Build b = await _bModel.SelectById(id);

                    if (build.BuildTime.HasValue)
                    {
                        build.BuildTime = DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc);
                    }

                    if (build.LeakDate.HasValue)
                    {
                        build.LeakDate = DateTime.SpecifyKind(build.LeakDate.Value, DateTimeKind.Utc);
                    }

                    var bi = new BuildDetails
                    {
                        MajorVersion = build.MajorVersion,
                        MinorVersion = build.MinorVersion,
                        Number       = build.Number,
                        Revision     = build.Revision,
                        Lab          = build.Lab,
                        BuildTime    = build.BuildTime.HasValue
                            ? DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc)
                            : null as DateTime?,
                        SourceType    = build.SourceType,
                        SourceDetails = build.SourceDetails
                    };

                    build.History = b.History;
                    if (build.History == null || build.History.Count == 0)
                    {
                        build.History = new List <ItemHistory <BuildDetails> >();
                    }

                    build.History.Add(new ItemHistory <BuildDetails>
                    {
                        Type     = ItemHistoryType.Edited,
                        Time     = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
                        UserName = User.Identity.Name,
                        Item     = bi
                    });

                    await _bModel.Update(build);
                }
                catch
                {
                    return(View(build));
                }

                return(RedirectToAction(nameof(ViewBuild),
                                        new
                {
                    id = build.Id
                }));
            }

            return(View(build));
        }
        public async Task <ActionResult> AddBulk(FormCollection values)
        {
            var  osc     = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]);
            var  success = new List <Build>();
            var  failed  = new List <string>();
            bool notify  = bool.Parse(values[nameof(BulkAddition.SendNotifications)].Split(',')[0]);

            foreach (string line in values[nameof(BulkAddition.Builds)]
                     .Split(new[]
            {
                '\r',
                '\n'
            },
                            StringSplitOptions.RemoveEmptyEntries))
            {
                Match m = Regex.Match(line,
                                      @"(([\d]{1,2})\.([\d]{1,2})\.)?([\d]{4,5})(\.([\d]{1,5}))?(\.| \()([a-zA-Z][a-zA-Z0-9._\(\)-]+?)\.(\d\d\d\d\d\d-\d\d\d\d)\)?");
                if (m.Success)
                {
                    try
                    {
                        var b = new Build
                        {
                            MajorVersion = uint.Parse(m.Groups[2].Value),
                            MinorVersion = uint.Parse(m.Groups[3].Value),
                            Number       = uint.Parse(m.Groups[4].Value),
                            Revision     = string.IsNullOrEmpty(m.Groups[6].Value)
                                ? null
                                : uint.Parse(m.Groups[6].Value) as uint?,
                            Lab       = m.Groups[8].Value,
                            BuildTime = string.IsNullOrEmpty(m.Groups[9].Value)
                                ? null
                                : DateTime.SpecifyKind(DateTime.ParseExact(m.Groups[9].Value,
                                                                           "yyMMdd-HHmm",
                                                                           CultureInfo.CurrentCulture.DateTimeFormat),
                                                       DateTimeKind.Utc) as DateTime?,
                            Added      = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc),
                            Modified   = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc),
                            SourceType = TypeOfSource.PrivateLeak
                        };
                        b.RegenerateCachedProperties();

                        var bi = new BuildDetails
                        {
                            MajorVersion = b.MajorVersion,
                            MinorVersion = b.MinorVersion,
                            Number       = b.Number,
                            Revision     = b.Revision,
                            Lab          = b.Lab,
                            BuildTime    = b.BuildTime.HasValue
                                ? DateTime.SpecifyKind(b.BuildTime.Value, DateTimeKind.Utc)
                                : null as DateTime?,
                            SourceType    = b.SourceType,
                            SourceDetails = b.SourceDetails
                        };

                        b.History = new List <ItemHistory <BuildDetails> >
                        {
                            new ItemHistory <BuildDetails>
                            {
                                Type     = ItemHistoryType.Added,
                                Time     = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
                                UserName = User.Identity.Name,
                                Item     = bi
                            }
                        };

                        string buildString = b.FullBuildString;
                        Build  existing    = await _bModel.SelectBuildByFullBuildString(buildString);

                        if (existing == null)
                        {
                            await _bModel.Insert(b);

                            if (notify)
                            {
                                osc.PushNewBuild(b,
                                                 $"https://buildfeed.net{Url.Action(nameof(ViewBuild), new { id = b.Id })}?utm_source=notification&utm_campaign=new_build");
                            }

                            success.Add(b);
                        }
                        else
                        {
                            failed.Add(line);
                        }
                    }
                    catch (Exception)
                    {
                        failed.Add(line);
                    }
                }
            }

            ViewBag.Results = success.ToArray();
            return(View(new BulkAddition
            {
                Builds = string.Join("\r\n", failed),
                SendNotifications = notify
            }));
        }
        public async Task <ActionResult> AddBuild(Build build)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    build.Added    = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc);
                    build.Modified = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc);
                    if (build.BuildTime.HasValue)
                    {
                        build.BuildTime = DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc);
                    }

                    if (build.LeakDate.HasValue)
                    {
                        build.LeakDate = DateTime.SpecifyKind(build.LeakDate.Value, DateTimeKind.Utc);
                    }

                    build.RegenerateCachedProperties();


                    var bi = new BuildDetails
                    {
                        MajorVersion = build.MajorVersion,
                        MinorVersion = build.MinorVersion,
                        Number       = build.Number,
                        Revision     = build.Revision,
                        Lab          = build.Lab,
                        BuildTime    = build.BuildTime.HasValue
                            ? DateTime.SpecifyKind(build.BuildTime.Value, DateTimeKind.Utc)
                            : null as DateTime?,
                        SourceType    = build.SourceType,
                        SourceDetails = build.SourceDetails
                    };

                    build.History = new List <ItemHistory <BuildDetails> >
                    {
                        new ItemHistory <BuildDetails>
                        {
                            Type     = ItemHistoryType.Added,
                            Time     = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc),
                            UserName = User.Identity.Name,
                            Item     = bi
                        }
                    };

                    await _bModel.Insert(build);
                }
                catch
                {
                    return(View("EditBuild", build));
                }

                var osc = new OneSignalClient(ConfigurationManager.AppSettings["push:OneSignalApiKey"]);
                osc.PushNewBuild(build,
                                 $"https://buildfeed.net{Url.Action(nameof(ViewBuild), new { id = build.Id })}?utm_source=notification&utm_campaign=new_build");

                return(RedirectToAction(nameof(ViewBuild),
                                        new
                {
                    id = build.Id
                }));
            }

            return(View("EditBuild", build));
        }