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; }
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)); }
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); }
public bool IsNewlyFixed(BuildStatusEnum?previousStatus) { return(BuildStatusEnum == BuildStatusEnum.Working && previousStatus != null && previousStatus == BuildStatusEnum.Broken); }
public bool IsNewlyBroken(BuildStatusEnum?previousStatus) { return(BuildStatusEnum == BuildStatusEnum.Broken && (previousStatus == null || previousStatus == BuildStatusEnum.Working)); }
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); } }
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); } }
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; }