Skip to content

Commit

Permalink
[JENKINS-20945] - added Cause filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
opx3 committed Aug 20, 2016
1 parent 058332f commit ba430df
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 33 deletions.
10 changes: 6 additions & 4 deletions Read.me
Expand Up @@ -4,10 +4,12 @@ Currently fixed:
- JENKINS-37329
- JENKINS-16270
- some table cosmetics
- JENKINS-20945 - added Cause filtering

Rejected/closed:
- JENKINS-29823 - no bug, can be solved with sidebar plugin
- JENKINS-24327 - not a plugin problem
- JENKINS-20944 - no bug

Under development/investigation:
- JENKINS-20945 -> Enhancement
- JENKINS-29823 -> Sidebar ?
- JENKINS-33851 -> Enhancement
- JENKINS-24327 -> not clear if this one still occurs
- JENKINS-20944 -> not clear if this is a bug
@@ -1,16 +1,16 @@
package jenkins.plugins.build_metrics;

import jenkins.plugins.build_metrics.stats.StatsFactory;

import jenkins.plugins.build_metrics.stats.StatsHelper;
import hudson.plugins.global_build_stats.GlobalBuildStatsPlugin;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsBusiness;
import hudson.plugins.global_build_stats.model.BuildSearchCriteria;
import hudson.plugins.global_build_stats.model.BuildHistorySearchCriteria;
import hudson.plugins.global_build_stats.model.JobBuildSearchResult;

import hudson.model.Hudson;
import hudson.model.Run;
import hudson.model.Job;
import hudson.model.Cause;

import org.kohsuke.stapler.StaplerRequest;

Expand All @@ -28,7 +28,7 @@ public class BuildMetricsPluginSearchFactory {
public BuildMetricsPluginSearchFactory(){}

public StatsFactory getBuildStats(BuildMetricsSearch bms){
return StatsFactory.generateStats(searchBuilds(bms));
return StatsFactory.generateStats(searchBuilds(bms),bms);
}

public List<JobBuildSearchResult> searchBuilds(BuildMetricsSearch bms){
Expand All @@ -42,8 +42,21 @@ public List<BuildMetricsBuild> getFailedBuilds(BuildMetricsSearch bms){
BuildSearchCriteria criteria = createFailedBuildSearchCriteria(bms);
List<JobBuildSearchResult> results = business.searchBuilds(createBuildHistorySearchCriteria(bms, criteria));
List<BuildMetricsBuild> failedBuilds = new ArrayList<BuildMetricsBuild>();
boolean addThis=true;
for(JobBuildSearchResult result: results){
failedBuilds.add(

if ( !bms.getCauseFilter().isEmpty() ) {
String cause = StatsHelper.findBuildDescription(result.getJobName(), result.getBuildNumber());
String regexp = StatsHelper.fieldRegex(bms.getCauseFilter());
if ( cause!=null && cause.matches(regexp) ) {
addThis=true;
} else
addThis=false;
} else
addThis=true;

if ( addThis )
failedBuilds.add(
new BuildMetricsBuild(
result.getBuildNumber(),
result.getJobName(),
Expand All @@ -52,25 +65,12 @@ public List<BuildMetricsBuild> getFailedBuilds(BuildMetricsSearch bms){
result.getBuildDate(),
result.getDuration(),
result.getResult().getLabel(),
findBuildDescription(result.getJobName(), result.getBuildNumber())
StatsHelper.findBuildDescription(result.getJobName(), result.getBuildNumber())
));
}
return failedBuilds;
}

private String findBuildDescription(String jobName, int buildNumber){
String description = null;
Job j = (Job)(Hudson.getInstance().getItem(jobName));
if(j != null){
Run r = j.getBuildByNumber(buildNumber);
if(r != null){
description = r.getDescription();
}
}
return description;
}


public Long getStartDate(int range, String rangeUnits){
int iRange = range * -1;
int iUnits = Calendar.DAY_OF_YEAR;//default = RANGE_DAYS
Expand Down Expand Up @@ -103,7 +103,8 @@ public BuildMetricsSearch createBuildMetricsSearch(StaplerRequest req){
req.getParameter("rangeUnits"),
req.getParameter("jobFilter"),
req.getParameter("nodeFilter"),
req.getParameter("launcherFilter")
req.getParameter("launcherFilter"),
req.getParameter("causeFilter")
);
}

Expand Down
Expand Up @@ -16,15 +16,16 @@ public class BuildMetricsSearch {
private String jobFilter;
private String nodeFilter;
private String launcherFilter;
private String causeFilter;

public BuildMetricsSearch(String label, int range, String rangeUnits, String jobFilter, String nodeFilter, String launcherFilter){
public BuildMetricsSearch(String label, int range, String rangeUnits, String jobFilter, String nodeFilter, String launcherFilter, String causeFilter){
this.label = label;
this.range = range;
this.rangeUnits = rangeUnits;
this.jobFilter = jobFilter;
this.nodeFilter = nodeFilter;
this.launcherFilter = launcherFilter;

this.causeFilter = causeFilter;
}

@Exported
Expand Down Expand Up @@ -69,5 +70,12 @@ public String getLauncherFilter() {
public void setLauncherFilter(String launcherFilter) {
this.launcherFilter = launcherFilter;
}
@Exported
public String getCauseFilter() {
return causeFilter;
}
public void setCauseFilter(String causeFilter) {
this.causeFilter = causeFilter;
}

}
@@ -1,15 +1,24 @@
package jenkins.plugins.build_metrics.stats;

import hudson.model.Cause;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.global_build_stats.model.JobBuildSearchResult;
import hudson.plugins.global_build_stats.model.BuildResult;
import hudson.plugins.global_build_stats.Messages;

import java.util.logging.ConsoleHandler;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.Collection;
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
import java.util.Hashtable;

import jenkins.plugins.build_metrics.BuildMetricsSearch;

import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;

Expand All @@ -36,14 +45,24 @@ public StatsFactory(){
this.space="&nbsp;";
}

public static StatsFactory generateStats(List<JobBuildSearchResult> searchResults){
public static StatsFactory generateStats(List<JobBuildSearchResult> searchResults, BuildMetricsSearch bms){
StatsFactory factory = new StatsFactory();
Logger log = LogManager.getLogManager().getLogger("hudson.WebAppMain");
for(JobBuildSearchResult result: searchResults){
factory.addResult(result);
// Check if our own criteria "causeFilter" is set and if this result goes
// threw the filter
if ( bms.getCauseFilter()!=null && !bms.getCauseFilter().isEmpty() ) {
String cause = StatsHelper.findBuildDescription(result.getJobName(), result.getBuildNumber());
String regexp = StatsHelper.fieldRegex(bms.getCauseFilter());
if ( cause!=null && cause.matches(regexp) ) {
factory.addResult(result);
}
} else
factory.addResult(result);
}
return factory;
}

public void addResult(JobBuildSearchResult result){
StatsModel stat = null;
if(this.stats.containsKey(result.getJobName())){
Expand Down
Expand Up @@ -5,6 +5,7 @@
<j:invoke var="FIELD_FILTER_REGEX" on="${it}" method="getFieldFilterRegex" />
<j:set var="LAUNCHER_SYSTEM_REGEX" value="${FIELD_FILTER_REGEX}(^SYSTEM$$)"/>
<j:set var="NODE_MASTER_REGEX" value="${FIELD_FILTER_REGEX}(^master$$)"/>
<j:set var="CAUSE_SYSTEM_REGEX" value="${FIELD_FILTER_REGEX}"/>
<!-- For an unknown reason, j:invokeStatic doesn't work here ! :( -->
<j:invoke var="escapedJobFilter" on="${it}" method="escapeAntiSlashes">
<j:arg type="java.lang.String" value="" />
Expand All @@ -26,9 +27,10 @@
FIELD_FILTER_REGEX = "${FIELD_FILTER_REGEX}";
LAUNCHER_SYSTEM_REGEX = "${LAUNCHER_SYSTEM_REGEX}";
NODE_MASTER_REGEX = "${NODE_MASTER_REGEX}";
ESCAPED_JOB_FILTER = "${escapedJobFilter}";
ESCAPED_NODE_FILTER = "${escapedNodeFilter}";
ESCAPED_LAUNCHER_FILTER = "${escapedLauncherFilter}";
CAUSE_SYSTEM_REGEX = "${CAUSE_SYSTEM_REGEX}";
ESCAPED_JOB_FILTER = "${escapedJobFilter}";
ESCAPED_NODE_FILTER = "${escapedNodeFilter}";
ESCAPED_LAUNCHER_FILTER = "${escapedLauncherFilter}";
</script>
<script src="${rootURL}/plugin/global-build-stats/scripts/global-build-stats/buildHistory.js"></script>
</l:header>
Expand Down Expand Up @@ -139,6 +141,15 @@
$('searchBuild_launcherFilteringType_ALL').checked = 'checked';
$('searchBuild_launcherFilteringType_ALL').onchange();
}
if($('searchBuild_causeFilter').value.indexOf(CAUSE_SYSTEM_REGEX) != -1){
$('searchBuild_causeFilteringType_REGEX').checked = 'checked';
initializeRegexField('searchBuild_causeNameRegex', ESCAPED_CAUSE_FILTER);
$('searchBuild_causeFilteringType_REGEX').onchange();
$('searchBuild_causeNameRegex').disabled = false;
} else if(document.getElementById('searchBuild_causeFilter').value.indexOf(FIELD_FILTER_ALL) != -1){
$('searchBuild_causeFilteringType_ALL').checked = 'checked';
$('searchBuild_causeFilteringType_ALL').onchange();
}
]]></script>
<input type="submit" class="submit-button" value="${%Search}" name="Submit" />
</form>
Expand Down
@@ -1,11 +1,13 @@
package jenkins.plugins.build_metrics.stats;

import org.junit.Test;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Calendar;

import jenkins.plugins.build_metrics.BuildMetricsSearch;
import hudson.plugins.global_build_stats.model.BuildResult;
import hudson.plugins.global_build_stats.model.JobBuildResult;
import hudson.plugins.global_build_stats.model.JobBuildSearchResult;
Expand All @@ -14,9 +16,10 @@ public class StatsFactoryTest {
@Test
public void testFailureRate(){
ArrayList<JobBuildSearchResult> jbsr = new ArrayList<JobBuildSearchResult>();
BuildMetricsSearch bms = new BuildMetricsSearch("", 2, "", "", "", "", "");
jbsr.add(createJobResult("build job 1", true));
jbsr.add(createJobResult("build job 1", false));
StatsFactory sf = StatsFactory.generateStats(jbsr);
StatsFactory sf = StatsFactory.generateStats(jbsr,bms);
assertEquals("StatsFactory.failureRate", 50.00, sf.getFailureRate(), 0);

for(StatsModel stat: sf.getStats()){
Expand Down
Expand Up @@ -18,6 +18,5 @@ public void testPercent(){
assertEquals("2/3", 66.67, StatsMath.getPercent(subVal, totalVal), 0);
assertEquals("1/1", 100.00, StatsMath.getPercent(1, 1), 0);
assertEquals("3/2", 150.00, StatsMath.getPercent(3, 2), 0);
assertEquals("3/2", 17.00, StatsMath.getPercent(3, 2), 0);
}
}

0 comments on commit ba430df

Please sign in to comment.