diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java index 0b324db25..1c10a196f 100644 --- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java @@ -29,6 +29,7 @@ import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.JobView; import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.JobViews; import hudson.Extension; +import hudson.model.AbstractProject; import hudson.model.Descriptor.FormException; import hudson.model.Job; import hudson.model.ListView; @@ -142,12 +143,17 @@ private boolean isGiven(String value) { } private List jobViews() { - JobViews views = new JobViews(new StaticJenkinsAPIs(), currentConfig()); - //A little bit of evil to make the type system happy. @SuppressWarnings("unchecked") List> projects = new ArrayList(filter(super.getItems(), Job.class)); + + //start of sin + @SuppressWarnings("unchecked") + List> ExportedProjectsToJobViews = new ArrayList(filter(super.getItems(), Job.class)); + //end if sin. List jobs = new ArrayList(); + //Dear code reviewer, forgive me for what I have done. + JobViews views = new JobViews(new StaticJenkinsAPIs(), currentConfig(),ExportedProjectsToJobViews); Collections.sort(projects, currentConfig().getOrder()); @@ -192,7 +198,6 @@ private boolean deserailisingFromAnOlderFormat() { private void migrateFromOldToNewConfigFormat() { Config c = new Config(); c.setOrder(order); - config = c; order = null; } diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/JobViews.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/JobViews.java index f185ade83..261f2ae43 100644 --- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/JobViews.java +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/JobViews.java @@ -1,8 +1,10 @@ package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel; +import com.smartcodeltd.jenkinsci.plugins.buildmonitor.Config; import com.smartcodeltd.jenkinsci.plugins.buildmonitor.facade.StaticJenkinsAPIs; import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.features.*; import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.features.headline.HeadlineConfig; +import hudson.model.AbstractProject; import hudson.model.Job; import java.util.List; @@ -18,13 +20,14 @@ public class JobViews { public static final String Groovy_Post_Build = "groovy-postbuild"; private final StaticJenkinsAPIs jenkins; + private final List> projects; private final com.smartcodeltd.jenkinsci.plugins.buildmonitor.Config config; - public JobViews(StaticJenkinsAPIs jenkins, com.smartcodeltd.jenkinsci.plugins.buildmonitor.Config config) { + public JobViews(StaticJenkinsAPIs jenkins, Config config, List> project) { this.jenkins = jenkins; this.config = config; + this.projects = project; } - public JobView viewOf(Job job) { List viewFeatures = newArrayList(); @@ -32,6 +35,7 @@ public JobView viewOf(Job job) { viewFeatures.add(new HasHeadline(new HeadlineConfig(config.shouldDisplayCommitters()))); viewFeatures.add(new KnowsLastCompletedBuildDetails()); viewFeatures.add(new KnowsCurrentBuildsDetails()); + viewFeatures.add(new showIfUpstreamProjectFails(projects)); if (jenkins.hasPlugin(Claim)) { viewFeatures.add(new CanBeClaimed()); diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/features/UpStreamError.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/features/UpStreamError.java new file mode 100644 index 000000000..795f38d4b --- /dev/null +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/features/UpStreamError.java @@ -0,0 +1,22 @@ +package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.features; + +import org.codehaus.jackson.annotate.JsonValue; + +/** + * @author Vincent & Robert + */ +public class UpStreamError { + private final String value; + + public UpStreamError(String value) { + this.value = value; + } + @JsonValue + public String value() { + return value; + } + + public UpStreamError asJson() { + return this; + } +} \ No newline at end of file diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/features/showIfUpstreamProjectFails.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/features/showIfUpstreamProjectFails.java new file mode 100644 index 000000000..016c21489 --- /dev/null +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/viewmodel/features/showIfUpstreamProjectFails.java @@ -0,0 +1,62 @@ +package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.features; + +import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.JobView; +import hudson.model.AbstractProject; + +import java.util.List; + +/** + * Created by vincent on 2017-04-28. + */ + +public class showIfUpstreamProjectFails implements Feature { + private List> project; + + private JobView job; + + public showIfUpstreamProjectFails(List> project) { + this.project = project; + } + + public UpStreamError asJson() { + return new UpStreamError(checkAllUpstreamProjects(project)); + } + + @Override + public showIfUpstreamProjectFails of(JobView jobView) { + this.job = jobView; + return this; + } + + private String RecursiveUpstreamCheck(List upstreamProjects) { + for (AbstractProject upstreamProject : upstreamProjects) { + if (!upstreamProject.getUpstreamProjects().isEmpty()) { + return RecursiveUpstreamCheck(upstreamProject.getUpstreamProjects()); + } + if (upstreamProject.isBuilding()) { + return ""; + } else if (upstreamProject.isDisabled()) { + return "project has build in chain that is disabled. name: '"+upstreamProject.getName()+"'"; + } else if (upstreamProject.isBuildBlocked()) { + return "Project can't run due to project with name: '"+upstreamProject.getName()+"' in upstream chain being blocked, Reason: " + upstreamProject.getWhyBlocked(); + } + //because jenkins doesn't natively have a way to check if a build has failed so I have improvised. + else if (upstreamProject.getBuildStatusUrl().equals("red.png")) { + return "project in upstream chain has failed, check Build: '" + upstreamProject.getName() + "'"; + } + } + return ""; + } + + private String checkAllUpstreamProjects(List> project) { + String checkRed = ""; + for (AbstractProject aProject : project) { + if (!aProject.getUpstreamProjects().isEmpty() && aProject.getFullName().equals(job.name())) { + //getUpstreamProjects happened to not check them recursively, so I made my own. + List ups = aProject.getUpstreamProjects(); + checkRed = RecursiveUpstreamCheck(ups); + } + } + return checkRed; + } +} diff --git a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/main-settings.jelly b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/main-settings.jelly index 15506990c..afae4ad09 100644 --- a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/main-settings.jelly +++ b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/main-settings.jelly @@ -27,6 +27,13 @@ id="settings-colour-blind" type="checkbox" /> +
  • + + +
  • {{project.progress}}% -

  • +
  • + {{project.upStreamError}} +
  • diff --git a/build-monitor-plugin/src/main/webapp/scripts/settings.js b/build-monitor-plugin/src/main/webapp/scripts/settings.js index 39198a01c..013c7dadf 100644 --- a/build-monitor-plugin/src/main/webapp/scripts/settings.js +++ b/build-monitor-plugin/src/main/webapp/scripts/settings.js @@ -10,6 +10,7 @@ angular. $scope.settings.colourBlind = cookieJar.get('colourBlind', 0); $scope.settings.reduceMotion = cookieJar.get('reduceMotion', 0); $scope.settings.showBadges = cookieJar.get('showBadges', 0); + $scope.settings.showBadges = cookieJar.get('displayWarnings', 0); angular.forEach($scope.settings, function(value, name) { $scope.$watch('settings.' + name, function(currentValue) {