Example #1
0
        private void DoUpdateNotifier()
        {
            BuildStatusEnum?worstBuildStatus   = null;
            bool            buildInProgress    = false;
            bool            buildIsStuck       = false;
            var             errorProjects      = new HashedSet <Project>();
            var             regressingProjects = new HashedSet <Project>();

            foreach (Server server in ConfigurationService.Servers)
            {
                foreach (Project project in server.Projects)
                {
                    BuildStatus status = GetProjectStatus(project);
                    if (worstBuildStatus == null || status.Value > worstBuildStatus)
                    {
                        worstBuildStatus = status.Value;
                    }
                    if (status.Value >= BuildStatusEnum.Failed)
                    {
                        errorProjects.Add(project);
                    }
                    if (status.IsInProgress)
                    {
                        buildInProgress = true;
                    }
                    if (status.IsStuck)
                    {
                        buildIsStuck = true;
                    }
                    if (IsRegressing(project))
                    {
                        regressingProjects.Add(project);
                    }
                    lastProjectsBuildDetails[project] = project.AllBuildDetails;
                }
            }

            if (worstBuildStatus == null)
            {
                worstBuildStatus = BuildStatusEnum.Unknown;
            }

#if false // tests
            lastBuildStatus++;
            if (lastBuildStatus > BuildStatus.Failed_BuildInProgress)
            {
                lastBuildStatus = 0;
            }
            worstBuildStatus = lastBuildStatus;
            Console.WriteLine("tray:" + lastBuildStatus);
#endif

            BuildStatus buildStatus = new BuildStatus(worstBuildStatus.Value, buildInProgress, buildIsStuck);

            UpdateIcon(buildStatus);
            UpdateBalloonTip(errorProjects, regressingProjects);

            lastBuildStatus = buildStatus;
        }
Example #2
0
        public void FireApplicableRulesEngineEvents(BuildStatusEnum?previousWorkingOrBrokenStatus, BuildStatusEnum?previousStatus, RulesEngine rulesEngine, List <Rule> rules)
        {
            var rule = rules
                       .Where(r => r.IsMatch(this, previousWorkingOrBrokenStatus))
                       .OrderByDescending(r => r.PriorityId)
                       .FirstOrDefault();

            if (rule != null)
            {
                rule.FireEvent(rulesEngine, previousWorkingOrBrokenStatus, this);
            }

            rules.ForEach(r => r.FireAnyUntilBuildPassesEvents(rulesEngine, this, previousStatus));
        }
Example #3
0
        public bool IsMatch(BuildStatus buildStatus, BuildStatusEnum?previousStatus)
        {
            bool isBuildDefinitionMatch = BuildDefinitionId == null || BuildDefinitionId == buildStatus.BuildDefinitionId;

            if (!isBuildDefinitionMatch)
            {
                return(false);
            }
            bool isPersonMatch = string.IsNullOrEmpty(TriggerPerson) || TriggerPerson == buildStatus.RequestedBy;

            if (!isPersonMatch)
            {
                return(false);
            }

            var  newlyBroken        = buildStatus.IsNewlyBroken(previousStatus);
            var  newlyFixed         = buildStatus.IsNewlyFixed(previousStatus);
            bool isTriggerTypeMatch = IsTriggerTypeMatch(buildStatus, newlyBroken, newlyFixed);

            return(isTriggerTypeMatch);
        }
Example #4
0
 public bool IsNewlyFixed(BuildStatusEnum?previousStatus)
 {
     return(BuildStatusEnum == BuildStatusEnum.Working && previousStatus != null && previousStatus == BuildStatusEnum.Broken);
 }
Example #5
0
 public bool IsNewlyBroken(BuildStatusEnum?previousStatus)
 {
     return(BuildStatusEnum == BuildStatusEnum.Broken && (previousStatus == null || previousStatus == BuildStatusEnum.Working));
 }
Example #6
0
        public void FireEvent(RulesEngine rulesEngine, BuildStatusEnum?previousStatus, BuildStatus buildStatus)
        {
            var newlyBroken = buildStatus.IsNewlyBroken(previousStatus);
            var newlyFixed  = buildStatus.IsNewlyFixed(previousStatus);

            string message = null;
            string okText  = null;

            if (newlyBroken)
            {
                message = "Build newly broken by " + buildStatus.RequestedBy;
                okText  = "Rats";
            }
            if (newlyFixed)
            {
                message = "Build is passing again";
                okText  = "Yayy!";
            }
            if (buildStatus.BuildStatusEnum == BuildStatusEnum.InProgress)
            {
                message = "Build triggered by " + buildStatus.RequestedBy;
                okText  = "Ok, whatever";
            }
            if (buildStatus.BuildStatusEnum == BuildStatusEnum.Broken && !newlyBroken)
            {
                message = "Build still broken";
                okText  = "Rats";
            }
            if (buildStatus.BuildStatusEnum == BuildStatusEnum.Working && !newlyFixed)
            {
                message = "Build passed";
                okText  = "Yayy!";
            }
            message += " for " + buildStatus.Name;
            if (buildStatus.BuildStatusEnum == BuildStatusEnum.InProgress && !string.IsNullOrEmpty(buildStatus.Comment))
            {
                message += "\r\n" + buildStatus.Comment;
            }

            if (AlertType == AlertType.TrayAlert && !(previousStatus == null && buildStatus.BuildStatusEnum == BuildStatusEnum.Working))
            {
                rulesEngine.InvokeTrayNotify(buildStatus.BuildStatusEnum == BuildStatusEnum.Broken ? ToolTipIcon.Error : ToolTipIcon.Info, string.Format("Build {0}", buildStatus.BuildStatusDescription), message);
            }

            if (LedPattern != null)
            {
                rulesEngine.InvokeSetLights(LedPattern, LightsDuration);
            }

            if (AudioPattern != null)
            {
                rulesEngine.InvokeSetAudio(AudioPattern, AudioDuration);
            }
            if (AlertType == AlertType.ModalDialog)
            {
                rulesEngine.InvokeModalDialog(message, okText);
            }

            if (!string.IsNullOrEmpty(WindowsAudioLocation) && previousStatus != null)
            {
                rulesEngine.InvokePlayWindowsAudio(WindowsAudioLocation);
            }
        }
Example #7
0
        public void FireAnyUntilBuildPassesEvents(RulesEngine rulesEngine, BuildStatus buildStatus, BuildStatusEnum?previousStatus)
        {
            bool newlyFixed = buildStatus.BuildStatusEnum == BuildStatusEnum.Working && previousStatus != null && previousStatus != BuildStatusEnum.Working;

            if (PlayAudio && PlayAudioUntilBuildPasses && newlyFixed)
            {
                rulesEngine.InvokeSetAudio(null, null);
            }
            if (PlayLights && PlayLightsUntilBuildPasses && newlyFixed)
            {
                rulesEngine.InvokeSetLights(null, null);
            }
        }
Example #8
0
        private void DoUpdateNotifier()
        {
            BuildStatusEnum?worstBuildStatus            = null;
            var             buildInProgress             = false;
            var             buildIsStuck                = false;
            var             errorProjects               = new HashedSet <Project>();
            var             regressingProjects          = new HashedSet <Project>();
            var             progressingAndErrorProjects = new HashedSet <Project>();
            var             interestingProjects         = new HashedSet <Project>();
            var             totalProjectCount           = 0;

            foreach (var server in ConfigurationService.Servers)
            {
                foreach (var project in server.Projects)
                {
                    totalProjectCount++;

                    var status = GetProjectStatus(project);
                    if (worstBuildStatus == null || status.Value > worstBuildStatus)
                    {
                        worstBuildStatus = status.Value;
                    }
                    if (status.Value >= BuildStatusEnum.Failed)
                    {
                        errorProjects.Add(project);
                    }
                    if (status.Value > BuildStatusEnum.Successful)
                    {
                        progressingAndErrorProjects.Add(project);
                    }
                    if (status.IsInProgress)
                    {
                        buildInProgress = true;
                        progressingAndErrorProjects.Add(project);
                    }
                    if (status.IsStuck)
                    {
                        buildIsStuck = true;
                    }
                    if (IsRegressing(project))
                    {
                        regressingProjects.Add(project);
                    }
                    lastProjectsBuildDetails[project] = project.AllBuildDetails;

                    if (project.Activity.HasBuildActivity)
                    {
                        interestingProjects.Add(project);
                    }
                }
            }

            if (worstBuildStatus == null)
            {
                worstBuildStatus = BuildStatusEnum.Unknown;
            }

#if false // tests
            lastBuildStatus++;
            if (lastBuildStatus > BuildStatus.Failed_BuildInProgress)
            {
                lastBuildStatus = 0;
            }
            worstBuildStatus = lastBuildStatus;
            Console.WriteLine("tray:" + lastBuildStatus);
#endif

            var buildStatus = new BuildStatus(worstBuildStatus.Value, buildInProgress, buildIsStuck);

            UpdateIcon(buildStatus);
            UpdateTrayTooltip(progressingAndErrorProjects, totalProjectCount);
            if (ConfigurationService.NotificationSettings.BalloonNotifications)
            {
                UpdateBalloonTip(errorProjects, regressingProjects);
                ShowBallowTip(interestingProjects);
            }

            lastBuildStatus = buildStatus;
        }