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); }
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); }
// 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); } }
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)); }