static Build GetBuildFromDBItems(DBWork work, DBRevisionWork revisionWork) { DBRevision revision; DBLane lane, parentLane; DBHost host; using (DB db = new DB()) { revision = DBRevision_Extensions.Create(db, revisionWork.revision_id); lane = DBLane_Extensions.Create(db, revisionWork.lane_id); parentLane = GetTopMostParent(lane, db); host = DBHost_Extensions.Create(db, revisionWork.host_id); } var url = Configuration.GetWebSiteUrl(); url += string.Format("/ViewLane.aspx?lane_id={0}&host_id={1}&revision_id={2}", lane.id, host.id, revision.id); return(new Build { Commit = revision.revision, CommitId = revision.id, Date = revisionWork.completed ? revisionWork.endtime : revision.date, Lane = lane.lane, Project = parentLane.lane, State = revisionWork.State, Author = revision.author, BuildBot = host.host, Url = url }); }
public virtual void Notify(DBWork work, DBRevisionWork revision_work) { List <DBPerson> people = new List <DBPerson> (); DBRevision revision; DBLane lane; DBHost host; string message; bool nonfatal; log.DebugFormat("NotificationBase.Notify (lane_id: {1} revision_id: {2} host_id: {3} State: {0})", work.State, revision_work.lane_id, revision_work.revision_id, revision_work.host_id); nonfatal = false; if (!Evaluate(work, revision_work, out nonfatal)) { log.DebugFormat("NotificationBase.Notify (lane_id: {1} revision_id: {2} host_id: {3} State: {0}) = evaluation returned false", work.State, revision_work.lane_id, revision_work.revision_id, revision_work.host_id); return; } if (nonfatal) { message = "Test failure"; } else { message = "{red}{bold}Build failure{default}"; } using (DB db = new DB()) { revision = DBRevision_Extensions.Create(db, revision_work.revision_id); lane = DBLane_Extensions.Create(db, revision_work.lane_id); host = DBHost_Extensions.Create(db, revision_work.host_id); } message = string.Format("{0} in revision {1} on {2}/{3}: {4}/ViewLane.aspx?lane_id={5}&host_id={6}&revision_id={7}", message, (revision.revision.Length > 8 ? revision.revision.Substring(0, 8) : revision.revision), lane.lane, host.host, Configuration.GetWebSiteUrl(), lane.id, host.id, revision.id); MonkeyWrench.Scheduler.Scheduler.FindPeopleForCommit(lane, revision, people); people = FindPeople(people); Notify(work, revision_work, people, message); }
protected override void Notify(DBWork work, DBRevisionWork revision_work, List <DBPerson> people, string message) { if (!this.emails.Any()) { log.DebugFormat("Notify no emails"); return; } if (this.emails.Any(x => !x.EndsWith("@hipchat.xamarin.com", StringComparison.OrdinalIgnoreCase))) { log.Warn("EmailNotification.Notify skipping non-HipChat emails because we don't know how to send email!"); return; } var actionableEmails = this.emails.Where(x => x.EndsWith("@hipchat.xamarin.com")).ToList(); if (!actionableEmails.Any()) { log.Debug("Notify no actionable emails!"); return; } log.DebugFormat("Notify (lane_id: {1} revision_id: {2} host_id: {3} State: {0}) enabled: {4}, {5} people", work.State, revision_work.lane_id, revision_work.revision_id, revision_work.host_id, true, people.Count); bool nonfatal = false; if (!Evaluate(work, revision_work, out nonfatal)) { log.DebugFormat("Notify (lane_id: {1} revision_id: {2} host_id: {3} State: {0}) = evaluation returned false", work.State, revision_work.lane_id, revision_work.revision_id, revision_work.host_id); return; } if (nonfatal) { message = "Test failure"; } else { message = "Build failure"; } DBRevision revision; DBLane lane; DBHost host; using (DB db = new DB()) { revision = DBRevision_Extensions.Create(db, revision_work.revision_id); lane = DBLane_Extensions.Create(db, revision_work.lane_id); host = DBHost_Extensions.Create(db, revision_work.host_id); } message = string.Format("{0} in revision {1} on {2}/{3} ({4}/ViewLane.aspx?lane_id={5}&host_id={6}&revision_id={7})", message, (revision.revision.Length > 8 ? revision.revision.Substring(0, 8) : revision.revision), lane.lane, host.host, Configuration.GetWebSiteUrl(), lane.id, host.id, revision.id); foreach (var person in people) { if (string.IsNullOrEmpty(person.irc_nicknames)) { using (var db = new DB()) { var computed_nicks = new List <string> (); var email_lists = new List <IEnumerable <string> > (); email_lists.Add(person.GetEmails(db)); if (person.Emails != null) { email_lists.Add(person.Emails); } foreach (var emails in email_lists) { foreach (var email in emails) { var at = email.IndexOf('@'); if (at > 0) { computed_nicks.Add(email.Substring(0, at)); } } } if (computed_nicks.Count == 0 && !string.IsNullOrEmpty(person.fullname)) { computed_nicks.Add(person.fullname); } person.irc_nicknames = string.Join(",", computed_nicks.ToArray()); } } if (string.IsNullOrEmpty(person.irc_nicknames)) { log.DebugFormat("could not find somebody to notify for revision with id {0} on lane {1}", revision_work.revision_id, revision_work.lane_id); continue; } } var apiToken = identity.password; var rooms = actionableEmails.Select(email => email.Split('@') [0]).ToList(); const string finalApi = "https://hipchat.xamarin.com/v1/rooms/message"; var webClient = new WebClient(); foreach (var r in rooms) { string prefix; string room = r; if (room.StartsWith("*")) { room = room.Substring(1); prefix = ""; } else { prefix = "@"; } var prefixNames = string.Join(", ", people.SelectMany(x => x.irc_nicknames.Split(',')).Distinct().Select(x => string.Format("{1}{0}", x, prefix))); var finalMessage = prefixNames + ": " + message; if (cache [room + "|" + finalMessage] != null) { continue; } cache.Add(room + "|" + finalMessage, string.Empty, new DateTimeOffset(DateTime.UtcNow.AddHours(1), TimeSpan.Zero)); var postData = new NameValueCollection(); postData.Add("auth_token", apiToken); postData.Add("room_id", room); postData.Add("from", "Wrench"); postData.Add("message", finalMessage); postData.Add("notify", nonfatal ? "0" : "1"); // TODO: Maybe send HTML eventually, though HTML doesn't allow @-mentions. :( postData.Add("message_format", "text"); postData.Add("color", nonfatal ? "yellow" : "red"); postData.Add("format", "json"); var res = webClient.UploadValues(finalApi, postData); var resString = Encoding.UTF8.GetString(res); log.DebugFormat("response from server: {0}", resString); } }
void NotifySlack(DBWork work, DBRevisionWork revision_work, List <DBPerson> people, string message) { bool nonfatal = false; if (!Evaluate(work, revision_work, out nonfatal)) { log.DebugFormat("SlackNotification: lane_id: {1} revision_id: {2} host_id: {3} State: {0}: evaluation returned false", work.State, revision_work.lane_id, revision_work.revision_id, revision_work.host_id); return; } else { log.DebugFormat("SlackNotification: lane_id: {1} revision_id: {2} host_id: {3} State: {0} enabled: {4}, {5} people", work.State, revision_work.lane_id, revision_work.revision_id, revision_work.host_id, enabled, people.Count); } if (nonfatal) { message = "Test failure"; } else { message = "Build failure"; } DBRevision revision; DBLane lane; DBHost host; using (DB db = new DB()) { revision = DBRevision_Extensions.Create(db, revision_work.revision_id); lane = DBLane_Extensions.Create(db, revision_work.lane_id); host = DBHost_Extensions.Create(db, revision_work.host_id); } message = string.Format("{0} in revision {1} on {2}/{3} ({4}/ViewLane.aspx?lane_id={5}&host_id={6}&revision_id={7})", message, (revision.revision.Length > 8 ? revision.revision.Substring(0, 8) : revision.revision), lane.lane, host.host, Configuration.GetWebSiteUrl(), lane.id, host.id, revision.id); foreach (var person in people) { if (string.IsNullOrEmpty(person.irc_nicknames)) { using (var db = new DB()) { var computed_nicks = new List <string> (); var email_lists = new List <IEnumerable <string> > (); email_lists.Add(person.GetEmails(db)); if (person.Emails != null) { email_lists.Add(person.Emails); } foreach (var emails in email_lists) { foreach (var email in emails) { var at = email.IndexOf('@'); if (at > 0) { computed_nicks.Add(email.Substring(0, at)); } } } if (computed_nicks.Count == 0 && !string.IsNullOrEmpty(person.fullname)) { computed_nicks.Add(person.fullname); } person.irc_nicknames = string.Join(",", computed_nicks.ToArray()); } } if (string.IsNullOrEmpty(person.irc_nicknames)) { log.DebugFormat("SlackNotification: could not find somebody to notify for revision with id {0} on lane {1}", revision_work.revision_id, revision_work.lane_id); continue; } } var rooms = identity.channels.Split(new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries); var finalApi = identity.servers; var webClient = new WebClient(); foreach (var r in rooms) { string prefix; string room = r; if (room.StartsWith("*")) { room = room.Substring(1); prefix = ""; } else { prefix = "@"; } var prefixNames = string.Join(", ", people.SelectMany(x => x.irc_nicknames.Split(',')).Distinct().Select(x => string.Format("{1}{0}", x, prefix))); var finalMessage = prefixNames + ": " + message; if (cache [room + "|" + finalMessage] != null) { continue; } cache.Add(room + "|" + finalMessage, string.Empty, new DateTimeOffset(DateTime.UtcNow.AddHours(1), TimeSpan.Zero)); var json = string.Format(@" {{ ""channel"": ""{0}"", ""username"": ""Wrench"", ""text"": ""*{1}*"", ""link_names"": ""{5}"", ""attachments"": [ {{ ""fallback"": ""{2}{3}"", ""color"": ""{4}"", ""fields"":[ {{ ""value"": ""{2}{3}"", ""short"": false }} ] }} ] }} ", r, nonfatal ? "Test failure" : "Build failure", nonfatal ? ":crying_cat_face: " : ":pouting_cat: ", finalMessage.Replace("\\", "\\\\").Replace("\"", "\\\""), nonfatal ? "warning" : "danger", nonfatal ? "0" : "1" ); var postData = new NameValueCollection(); postData.Add("payload", json); try { var res = webClient.UploadValues(finalApi, postData); var resString = Encoding.UTF8.GetString(res); log.DebugFormat("SlackNotification: response from server: {0}", resString); } catch (WebException wex) { string responseText = null; if (wex.Response != null) { using (var responseStream = wex.Response.GetResponseStream()) { if (responseStream != null) { using (var reader = new StreamReader(responseStream)) responseText = reader.ReadToEnd(); } } } if (responseText == null) { log.ErrorFormat("SlackNotification: exception from server (no response): {0}", wex.Message); } else { log.ErrorFormat("SlackNotification: server error: {0} with exception: {1}", responseText, wex.Message); } } } }