Skip to content

Commit

Permalink
Feature: Build Monitor supports Jenkins Claim Plugin (https://wiki.je…
Browse files Browse the repository at this point in the history
…nkins-ci.org/display/JENKINS/Claim+plugin)

This closes #19 and can address #9, provided that "unstable" and "aborted" builds are claimed.
  • Loading branch information
jan-molak committed Nov 10, 2013
1 parent bfcd59f commit 7832e1c
Show file tree
Hide file tree
Showing 20 changed files with 386 additions and 23 deletions.
Binary file added .README/4_Supports_Claim_Plugin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ All the features I'm hoping to add in the near future are listed in the "Roadmap
![Adding jobs](.README/1_Adding_jobs.png)
![Two columns view](.README/2_Two_columns_view.png)
![Three columns view](.README/3_Three_columns_view.png)
![Supports Jenkins Claim Plugin](.README/4_Supports_Claim_Plugin.png)

## TDD

Expand All @@ -54,7 +55,7 @@ in the [near future](http://caniuse.com/flexbox).

1. Display what triggered the build (SCM change, another job, manual)
1. Display how long has a given job been failing for
1. Support for [Claim Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Claim+plugin)
1. ~~Support for [Claim Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Claim+plugin)~~
1. Support for [Gravatar](http://gravatar.com)
1. Display parameters of parametrized jobs
1. ~~Persist layout configuration changes in a long-lived cookie.~~
Expand Down
11 changes: 10 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>build-monitor-plugin</artifactId>
<version>1.1-SNAPSHOT</version>
<version>1.2-SNAPSHOT</version>
<packaging>hpi</packaging>

<name>Build Monitor View</name>
Expand Down Expand Up @@ -109,7 +109,16 @@
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>claim</artifactId>
<version>2.1</version>
<optional>true</optional>
</dependency>

</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.JobView;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.BuildAugmentor;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claim;
import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.ListView;
import hudson.model.TopLevelItem;
import hudson.model.ViewDescriptor;
import hudson.model.*;
import hudson.util.FormValidation;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
Expand Down Expand Up @@ -110,11 +109,21 @@ private List<JobView> jobViews() {
if (item instanceof AbstractProject) {
AbstractProject project = (AbstractProject) item;
if (! project.isDisabled()) {
jobs.add(JobView.of(project));
jobs.add(JobView.of(project, withAugmentationsIfTheyArePresent()));
}
}
}

return jobs;
}

private BuildAugmentor withAugmentationsIfTheyArePresent() {
BuildAugmentor augmentor = new BuildAugmentor();

if (Hudson.getInstance().getPlugin("claim") != null) {
augmentor.support(Claim.class);
}

return augmentor;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.BuildAugmentor;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claim;
import hudson.model.AbstractBuild;
import hudson.model.Result;
import hudson.model.Run;
Expand All @@ -13,13 +15,14 @@ public class BuildView implements BuildViewModel {

private final Run<?,?> build;
private final Date systemTime;
private final BuildAugmentor augmentor;

public static BuildView of(Run<?, ?> build) {
return new BuildView(build, new Date());
return new BuildView(build, new BuildAugmentor(), new Date());
}

public static BuildView of(Run<?, ?> build, Date systemTime) {
return new BuildView(build, systemTime);
public static BuildView of(Run<?, ?> build, BuildAugmentor augmentor, Date systemTime) {
return new BuildView(build, augmentor, systemTime);
}


Expand Down Expand Up @@ -93,7 +96,7 @@ public boolean hasPreviousBuild() {

@Override
public BuildViewModel previousBuild() {
return new BuildView(build.getPreviousBuild(), systemTime);
return new BuildView(build.getPreviousBuild(), augmentor, systemTime);
}

@Override
Expand All @@ -113,6 +116,25 @@ public Set<String> culprits() {
return culprits;
}

@Override
public boolean isClaimed() {
return claim().wasMade();
}

@Override
public String claimant() {
return claim().author();
}

@Override
public String reasonForClaim() {
return claim().reason();
}

private Claim claim() {
return augmentor.detailsOf(build, Claim.class);
}

public String toString() {
return name();
}
Expand All @@ -127,8 +149,9 @@ private long whenTheBuildStarted() {
}


private BuildView(Run<?, ?> build, Date systemTime) {
private BuildView(Run<?, ?> build, BuildAugmentor augmentor, Date systemTime) {
this.build = build;
this.systemTime = systemTime;
this.augmentor = augmentor;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,8 @@ public interface BuildViewModel {
public BuildViewModel previousBuild();

public Set<String> culprits();

boolean isClaimed();
String claimant();
String reasonForClaim();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.BuildAugmentor;
import hudson.model.*;
import org.codehaus.jackson.annotate.JsonProperty;

Expand All @@ -13,13 +14,18 @@
public class JobView {
private final Date systemTime;
private final Job<?, ?> job;
private final BuildAugmentor augmentor;

public static JobView of(Job<?, ?> job) {
return new JobView(job, new Date());
return new JobView(job, new BuildAugmentor(), new Date());
}

public static JobView of(Job<?, ?> job, BuildAugmentor augmentor) {
return new JobView(job, augmentor, new Date());
}

public static JobView of(Job<?, ?> job, Date systemTime) {
return new JobView(job, systemTime);
return new JobView(job, new BuildAugmentor(), systemTime);
}

@JsonProperty
Expand All @@ -45,6 +51,10 @@ public String status() {
status += " running";
}

if (lastCompletedBuild().isClaimed()) {
status += " claimed";
}

return status;
}

Expand Down Expand Up @@ -102,13 +112,29 @@ public Set<String> culprits() {
return culprits;
}

@JsonProperty
public boolean isClaimed() {
return lastCompletedBuild().isClaimed();
}

@JsonProperty
public String claimAuthor() {
return lastCompletedBuild().claimant();
}

@JsonProperty
public String claimReason() {
return lastCompletedBuild().reasonForClaim();
}

public String toString() {
return name();
}


private JobView(Job<?, ?> job, Date systemTime) {
this.job = job;
private JobView(Job<?, ?> job, BuildAugmentor augmentor, Date systemTime) {
this.job = job;
this.augmentor = augmentor;
this.systemTime = systemTime;
}

Expand All @@ -130,6 +156,6 @@ private BuildViewModel buildViewOf(Run<?, ?> build) {
return new NullBuildView();
}

return BuildView.of(job.getLastBuild(), systemTime);
return BuildView.of(job.getLastBuild(), augmentor, systemTime);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,19 @@ public BuildViewModel previousBuild() {
public Set<String> culprits() {
return new HashSet<String>();
}

@Override
public boolean isClaimed() {
return false;
}

@Override
public String claimant() {
return null;
}

@Override
public String reasonForClaim() {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins;

public interface Augmentation {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claim;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claimed;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.NotClaimed;
import hudson.model.Run;
import hudson.plugins.claim.ClaimBuildAction;

import java.util.HashSet;
import java.util.Set;

public class BuildAugmentor {

private Set<Class<? extends Augmentation>> recognisedAugmentations = new HashSet<Class<? extends Augmentation>>();

public Claim detailsOf(Run<?, ?> build, Class<Claim> augmentation) {
// todo: remove the below naive implementation with something better once there is more plugins to support ...
if (recognisedAugmentations.contains(augmentation)) {
ClaimBuildAction action = build.getAction(ClaimBuildAction.class);

if (action != null) {
return new Claimed(action);
}
}

return new NotClaimed();
}

public void support(Class<? extends Augmentation> typeOfAugmentation) {
recognisedAugmentations.add(typeOfAugmentation);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim;

import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.Augmentation;

public interface Claim extends Augmentation {
public boolean wasMade();
public String author();
public String reason();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim;

import hudson.plugins.claim.ClaimBuildAction;

public class Claimed implements Claim {
private final ClaimBuildAction action;

public Claimed(ClaimBuildAction action) {
this.action = action;
}

@Override
public boolean wasMade() {
return action.isClaimed();
}

@Override
public String author() {
return action.getClaimedByName();
}

@Override
public String reason() {
return action.getReason();
}

public String toString() {
return String.format("Claimed by \"%s\": \"%s\"", author(), reason());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim;

public class NotClaimed implements Claim {
@Override
public boolean wasMade() {
return false;
}

@Override
public String author() {
return null;
}

@Override
public String reason() {
return null;
}

public String toString() {
return "Not claimed";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
<a title="{{job.name}}"
href="{{job.url}}">{{job.name}}</a>
</h2>
<ul class="description">
<li data-ng-show="job.claimed">Claimed by <strong>{{ job.claimAuthor }}</strong>: {{ job.claimReason }}</li>
</ul>
<ul data-ng-show="job.culprits.size() > 0" class="culprits">
<li data-ng-repeat="name in job.culprits">
{{name}}
Expand Down
Loading

0 comments on commit 7832e1c

Please sign in to comment.