Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #17 from toericliou/master
[Fixed JENKINS-28722] Integrate Build-Failure-Analyzer Plugin with Cl…
  • Loading branch information
ki82 committed Dec 12, 2015
2 parents 834e653 + c2ea74e commit 109ee7f
Show file tree
Hide file tree
Showing 12 changed files with 909 additions and 9 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -5,4 +5,5 @@
*.ipr
*.ipr
/bin
/.idea/
=======
6 changes: 6 additions & 0 deletions pom.xml
Expand Up @@ -62,5 +62,11 @@
<artifactId>matrix-project</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.sonyericsson.jenkins.plugins.bfa</groupId>
<artifactId>build-failure-analyzer</artifactId>
<version>1.13.0</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
55 changes: 51 additions & 4 deletions src/main/java/hudson/plugins/claim/AbstractClaimBuildAction.java
Expand Up @@ -5,19 +5,22 @@
import hudson.model.BuildBadgeAction;
import hudson.model.Describable;
import hudson.model.ProminentProjectAction;
import hudson.model.Run;
import hudson.model.Saveable;
import hudson.model.Hudson;
import hudson.model.User;

import java.io.IOException;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.mail.MessagingException;
import javax.servlet.ServletException;

import net.sf.json.JSONObject;
import org.acegisecurity.Authentication;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.StaplerRequest;
Expand All @@ -37,11 +40,14 @@ public abstract class AbstractClaimBuildAction<T extends Saveable> extends Descr
private String assignedBy;
private Date claimDate;
private boolean transientClaim = !ClaimConfig.get().isStickyByDefault();
public static boolean isReclaim = false;
private ClaimBuildFailureAnalyzer BFAClaimer = null;

protected T owner;

AbstractClaimBuildAction(T owner) {
this.owner = owner;
isReclaim = false;
}

private String reason;
Expand All @@ -57,7 +63,7 @@ public String getUrlName() {
abstract String getUrl();

public void doClaim(StaplerRequest req, StaplerResponse resp)
throws ServletException, IOException {
throws Exception {
Authentication authentication = Hudson.getAuthentication();
String currentUser = authentication.getName();
String name = currentUser; // Default to self-assignment
Expand All @@ -73,6 +79,24 @@ public void doClaim(StaplerRequest req, StaplerResponse resp)
name = assignee;
}
String reason = req.getSubmittedForm().getString("reason");

if(ClaimBuildFailureAnalyzer.isBFAEnabled()) {
String error = req.getSubmittedForm().getString("errors");
BFAClaimer = new ClaimBuildFailureAnalyzer(error);
if(!ClaimBuildFailureAnalyzer.ERROR.equals("Default")){
try{
BFAClaimer.createFailAction((Run) owner);
} catch (IndexOutOfBoundsException e){
LOGGER.log(Level.WARNING, "No FailureCauseBuildAction detected for this build");
resp.forwardToPreviousPage(req);
return;
}
}
else{
BFAClaimer.removeFailAction((Run) owner);
}
}

boolean sticky = req.getSubmittedForm().getBoolean("sticky");
if (StringUtils.isEmpty(reason)) reason = null;
claim(name, reason, currentUser, sticky);
Expand All @@ -83,15 +107,18 @@ public void doClaim(StaplerRequest req, StaplerResponse resp)
} catch (InterruptedException e) {
LOGGER.log(Level.WARNING, "Interrupted when sending assignment email",e);
}
isReclaim = true;
owner.save();
evalGroovyScript();

resp.forwardToPreviousPage(req);
}

public void doUnclaim(StaplerRequest req, StaplerResponse resp)
throws ServletException, IOException {
unclaim();
if(ClaimBuildFailureAnalyzer.isBFAEnabled() && BFAClaimer!=null)
BFAClaimer.removeFailAction((Run) owner);
isReclaim = false;
owner.save();
evalGroovyScript();
resp.forwardToPreviousPage(req);
Expand Down Expand Up @@ -128,7 +155,7 @@ public String getAssignedByName() {
public void setClaimedBy(String claimedBy) {
this.claimedBy = claimedBy;
}

public void setAssignedBy (String assignedBy) {
this.assignedBy = assignedBy;
}
Expand Down Expand Up @@ -185,6 +212,19 @@ public String getReason() {
return reason;
}

public String fillReason() throws Exception {
if(ClaimBuildFailureAnalyzer.isBFAEnabled()) {
HashMap<String, String> map = ClaimBuildFailureAnalyzer.getFillReasonMap();
JSONObject json = new JSONObject();
for (String key : map.keySet()) {
json.put(key, map.get(key));
}
String causeMap = json.toString();
return causeMap;
}
return null;
}

public void setReason(String reason) {
this.reason = reason;
}
Expand All @@ -209,6 +249,14 @@ public void setSticky(boolean sticky) {
this.transientClaim = !sticky;
}

public String getError(){
return ClaimBuildFailureAnalyzer.ERROR;
}

public boolean isBFAEnabled(){
return ClaimBuildFailureAnalyzer.isBFAEnabled();
}

@Exported
public Date getClaimDate() {
return this.claimDate;
Expand All @@ -217,7 +265,6 @@ public Date getClaimDate() {
public boolean hasClaimDate() {
return this.claimDate != null;
}

/**
* was the action claimed by someone to themselves?
* @return true if the item was claimed by the user to themselves, false otherwise
Expand Down
109 changes: 109 additions & 0 deletions src/main/java/hudson/plugins/claim/ClaimBuildFailureAnalyzer.java
@@ -0,0 +1,109 @@
package hudson.plugins.claim;

import com.sonyericsson.jenkins.plugins.bfa.PluginImpl;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCause;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCauseBuildAction;
import com.sonyericsson.jenkins.plugins.bfa.model.FoundFailureCause;
import com.sonyericsson.jenkins.plugins.bfa.model.indication.FoundIndication;
import com.sonyericsson.jenkins.plugins.bfa.statistics.StatisticsLogger;
import hudson.model.AbstractBuild;
import hudson.model.Run;
import jenkins.model.Jenkins;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

public class ClaimBuildFailureAnalyzer {

public static String ERROR = "Default";
private static final String matchingFile = "Claim";

public ClaimBuildFailureAnalyzer(String error) throws Exception {
ERROR=error;
}

public static Collection<FailureCause> getFailureCauses() throws Exception {
return Jenkins.getInstance().getPlugin(PluginImpl.class).getKnowledgeBase().getCauses();
}

public static boolean isBFAEnabled(){
return (Jenkins.getInstance().getPlugin("build-failure-analyzer")!=null && Jenkins.getInstance().getPlugin(PluginImpl.class).isGlobalEnabled());
}

public static HashMap<String, String> getFillReasonMap() throws Exception {
HashMap<String, String> map = new HashMap<String, String>();
for (FailureCause cause : getFailureCauses()) {
map.put(cause.getName(), cause.getDescription());
}
return map;
}

public static LinkedList<String> getDropdownList() throws Exception {
LinkedList<String> list = new LinkedList<String>();
for (FailureCause cause : getFailureCauses()) {
list.add(cause.getName());
}
return list;
}

public void createFailAction(Run run) throws Exception {
FoundFailureCause newClaimedFailureCause = null;
List<FoundIndication> indications = new LinkedList<FoundIndication>();
for(FailureCause cause : getFailureCauses()){
if(cause.getName().equals(ERROR)) {
indications.add(new ClaimIndication((AbstractBuild) run,"Null",matchingFile,"Null"));
newClaimedFailureCause = new FoundFailureCause(cause, indications);
break;
}
}
try {
Jenkins.getInstance().getPlugin(PluginImpl.class).save();
} catch (IOException e) {
e.printStackTrace();
}
List<FailureCauseBuildAction> bfaActionList = run.getActions(FailureCauseBuildAction.class);
FoundFailureCause existingClaimedFoundFailureCause = null;
FailureCauseBuildAction bfaAction = bfaActionList.get(0);
List<FoundFailureCause> foundFailureCauses = bfaAction.getFoundFailureCauses();
boolean hasFailureCauseFromBFA = false;
for (FoundFailureCause cause : foundFailureCauses) {
// check if it's an indication created by claim
if(cause.getName().equals(newClaimedFailureCause.getName()) && cause.getIndications().get(0).getMatchingFile().equals("log")){
hasFailureCauseFromBFA = true;
}
if (cause.getIndications().get(0).getMatchingFile()==matchingFile) {
existingClaimedFoundFailureCause = cause;
break;
}
}
if (existingClaimedFoundFailureCause != null) {
foundFailureCauses.remove(existingClaimedFoundFailureCause);
}
if(!hasFailureCauseFromBFA) {
foundFailureCauses.add(newClaimedFailureCause);
}
try {
run.save();
StatisticsLogger.getInstance().log((AbstractBuild) run, bfaAction.getFoundFailureCauses());
} catch (IOException e) {
e.printStackTrace();
}
}

public void removeFailAction(Run run){
List<FailureCauseBuildAction> bfaActionList = run.getActions(FailureCauseBuildAction.class);
if(!bfaActionList.isEmpty()) {
FailureCauseBuildAction bfaAction = bfaActionList.get(0);
List<FoundFailureCause> foundFailureCauses = bfaAction.getFoundFailureCauses();
for (FoundFailureCause cause : foundFailureCauses) {
if (cause.getIndications().get(0).getMatchingFile() == "Claim") {
foundFailureCauses.remove(cause);
}
}
}
}

}
11 changes: 11 additions & 0 deletions src/main/java/hudson/plugins/claim/ClaimIndication.java
@@ -0,0 +1,11 @@
package hudson.plugins.claim;

import com.sonyericsson.jenkins.plugins.bfa.model.indication.FoundIndication;
import hudson.model.AbstractBuild;

public class ClaimIndication extends FoundIndication {

public ClaimIndication(AbstractBuild build, String originalPattern, String matchingFile, String matchingString) {
super(build, originalPattern, matchingFile, matchingString);
}
}
1 change: 1 addition & 0 deletions src/main/java/hudson/plugins/claim/ClaimPublisher.java
Expand Up @@ -51,6 +51,7 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
if (build.getResult().isWorseThan(Result.SUCCESS)) {
ClaimBuildAction action = new ClaimBuildAction(build);
build.addAction(action);
build.save();

// check if previous build was claimed
AbstractBuild<?,?> previousBuild = build.getPreviousBuild();
Expand Down
25 changes: 23 additions & 2 deletions src/main/java/hudson/plugins/claim/DescribableTestAction.java
Expand Up @@ -12,6 +12,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public abstract class DescribableTestAction extends TestAction implements Describable<DescribableTestAction> {
Expand Down Expand Up @@ -48,7 +49,6 @@ public ListBoxModel doFillAssigneeItems() {
if (currentUser != null) {
items.add(currentUser.getDisplayName(), currentUser.getId());
}

Collection<User> c = User.getAll();
if (c != null && currentUser != null) {
if (c.contains(currentUser)) {
Expand All @@ -65,8 +65,29 @@ public ListBoxModel doFillAssigneeItems() {
}

return items;
}

public ListBoxModel doFillErrorsItems() throws Exception {
ListBoxModel items = new ListBoxModel();
if (ClaimBuildFailureAnalyzer.isBFAEnabled()) {
LinkedList<String> list = ClaimBuildFailureAnalyzer.getDropdownList();
if (!AbstractClaimBuildAction.isReclaim) {
items.add("---None---", "Default");
for (String cause : list) {
items.add(cause, cause);
}
} else {
if (!ClaimBuildFailureAnalyzer.ERROR.equals("Default")) {
items.add(ClaimBuildFailureAnalyzer.ERROR, ClaimBuildFailureAnalyzer.ERROR);
}
items.add("---None---", "Default");
for (String cause : list) {
if (!cause.equals(ClaimBuildFailureAnalyzer.ERROR))
items.add(cause, cause);
}
}
}
return items;
}
}

}
@@ -1,6 +1,7 @@
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout"
xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt">

<script src="${resURL}/plugin/claim/JS/json2.js" type="text/javascript"></script>
<script type="text/javascript">
function ShowPopup(hoveritem)
{
Expand All @@ -13,7 +14,20 @@
hp = document.getElementById("claimHoverPopup");
hp.style.display = "none";
}
</script>

function Display(error)
{
reasonText = document.getElementById("errordesc");
var json = '${it.fillReason()}';
obj = JSON.parse(json);
if(error == "Default"){
reasonText.textContent = "";
} else{
reasonText.textContent = obj[error];
}
reasonText.readOnly = true;
}
</script>

<t:summary icon="${rootUrl}/plugin/claim/icons/claim-48x48.png">
<j:choose>
Expand Down Expand Up @@ -87,9 +101,17 @@
<f:form method="post" action="claim/claim" name="claim">
<f:entry title="${%Assignee}" field="assignee" help="/plugin/claim/help-assignee.html">
<f:select />
</f:entry>
</f:entry>
<j:if test="${it.isBFAEnabled()}">
<f:entry title="${%Error}" field="errors" help="/plugin/claim/help-errors.html">
<f:select onChange="Display(this.value);"/>
</f:entry>
<f:entry title="${%Description}" help="/plugin/claim/help-description.html">
<f:textarea name="errordesc" id="errordesc" value=""/>
</f:entry>
</j:if>
<f:entry title="${%Reason}" help="/plugin/claim/help-reason.html">
<f:textarea name="reason" value="${it.reason}"/>
<f:textarea name="reason" id="reason" value="${it.reason}"/>
</f:entry>
<f:entry title="${%Sticky}" help="/plugin/claim/help-sticky.html">
<f:checkbox name="sticky" checked="${it.sticky}"/>
Expand Down

0 comments on commit 109ee7f

Please sign in to comment.