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