Skip to content

Commit

Permalink
Merge pull request #74 from jenkinsci/build-history
Browse files Browse the repository at this point in the history
rework of report build history creation
  • Loading branch information
simonsymhoven authored Sep 16, 2022
2 parents 71cdabe + 2db0bf5 commit 9da4e2d
Show file tree
Hide file tree
Showing 11 changed files with 115 additions and 102 deletions.
64 changes: 33 additions & 31 deletions src/main/java/io/jenkins/plugins/reporter/JobAction.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
package io.jenkins.plugins.reporter;

import edu.hm.hafner.echarts.*;
import edu.hm.hafner.echarts.BuildResult;
import edu.hm.hafner.echarts.ChartModelConfiguration;
import edu.hm.hafner.echarts.JacksonFacade;
import hudson.model.Action;
import hudson.model.Job;
import hudson.util.RunList;
import hudson.model.Run;
import io.jenkins.plugins.echarts.AsyncConfigurableTrendChart;
import io.jenkins.plugins.echarts.AsyncConfigurableTrendJobAction;
import io.jenkins.plugins.reporter.charts.ItemHistoryChart;
import io.jenkins.plugins.reporter.model.ItemSeriesBuilder;
import io.jenkins.plugins.reporter.model.Report;
import io.jenkins.plugins.reporter.model.ReportSeriesBuilder;
import io.jenkins.plugins.reporter.model.*;
import io.jenkins.plugins.reporter.util.BuildResultNavigator;
import org.apache.commons.lang3.StringUtils;
import org.kohsuke.stapler.bind.JavaScriptMethod;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

public class JobAction implements AsyncConfigurableTrendChart, Action {

Expand Down Expand Up @@ -57,14 +54,33 @@ public String getDisplayName() {

@Override
public String getUrlName() {
// TODO: get the last build with action instead returning the last build. Need rework of createHistory().
try {
return getOwner().getLastBuild().getNumber() + "/report-" + URLEncoder.encode(name, "UTF-8");
History history = createBuildHistory();
for (BuildResult<ReportResult> buildResult : history) {
return buildResult.getBuild().getNumber() + "/report-" + URLEncoder.encode(name, "UTF-8");
}
} catch (UnsupportedEncodingException e) {
return String.valueOf(getOwner().getLastBuild().getNumber());
}
}

return String.valueOf(getOwner().getLastBuild().getNumber());
}

/**
* Returns the build history for this job.
*
* @return the history
*/
public History createBuildHistory() {
Run<?, ?> lastCompletedBuild = owner.getLastCompletedBuild();
if (lastCompletedBuild == null) {
return new NullReportHistory();
}
else {
return new ReportHistory(lastCompletedBuild, new ByIdResultSelector(report.getId()));
}
}

public Report getReport() {
return report;
}
Expand All @@ -83,27 +99,13 @@ public Report getReport() {
@JavaScriptMethod
public String getConfigurableBuildTrendModel(String configuration) {
ChartModelConfiguration modelConfiguration = ChartModelConfiguration.fromJson(configuration);

RunList<?> runs = getOwner().getBuilds();

List<ReportAction> reports = runs.stream()
.map(run -> Optional.of(run.getActions(ReportAction.class)))
.map(Optional::get)
.flatMap(List::stream)
.filter(reportAction -> Objects.equals(reportAction.getResult().getReport().getId(), report.getId()))
.collect(Collectors.toList());

List<BuildResult<ReportAction>> history = reports.stream()
.map(reportAction -> new BuildResult<>(new Build(reportAction.getOwner().getNumber(),
reportAction.getOwner().getDisplayName(), 0), reportAction))
.collect(Collectors.toList());

return new JacksonFacade().toJson(new ItemHistoryChart().create(history, modelConfiguration, new ReportSeriesBuilder(),
report, report.getItems()));

return new JacksonFacade().toJson(new ItemHistoryChart().create(createBuildHistory(), modelConfiguration,
new ReportSeriesBuilder(), report, report.getItems()));
}

@Override
public boolean isTrendVisible() {
return true;
return createBuildHistory().hasMultipleResults();
}
}
28 changes: 2 additions & 26 deletions src/main/java/io/jenkins/plugins/reporter/ReportDetails.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
package io.jenkins.plugins.reporter;

import edu.hm.hafner.echarts.Build;
import edu.hm.hafner.echarts.BuildResult;
import edu.hm.hafner.echarts.ChartModelConfiguration;
import edu.hm.hafner.echarts.JacksonFacade;
import hudson.model.Job;
import hudson.model.ModelObject;
import hudson.model.Run;
import hudson.util.RunList;
import io.jenkins.plugins.reporter.charts.ItemHistoryChart;
import io.jenkins.plugins.reporter.charts.ItemPieChart;
import io.jenkins.plugins.reporter.model.ByIdResultSelector;
import io.jenkins.plugins.reporter.model.Item;
import io.jenkins.plugins.reporter.model.ItemSeriesBuilder;
import io.jenkins.plugins.reporter.model.ItemTableModel;
import io.jenkins.plugins.reporter.model.*;
import io.jenkins.plugins.reporter.util.BuildResultNavigator;
import org.apache.commons.lang3.StringUtils;
import org.kohsuke.stapler.StaplerRequest;
Expand All @@ -22,8 +16,6 @@

import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class ReportDetails implements ModelObject {

Expand Down Expand Up @@ -165,23 +157,7 @@ public ItemTableModel getTableModel() {
@JavaScriptMethod
@SuppressWarnings("unused") // Called by jelly view
public String getBuildTrend(final String configuration) {
Job<?, ?> job = getOwner().getParent();
RunList<?> runs = job.getBuilds();

List<ReportAction> reports = runs.stream()
.filter(run -> run.getNumber() <= getOwner().getNumber())
.map(run -> Optional.of(run.getActions(ReportAction.class)))
.map(Optional::get)
.flatMap(List::stream)
.filter(reportAction -> Objects.equals(reportAction.getResult().getReport().getId(), result.getReport().getId()))
.collect(Collectors.toList());

List<BuildResult<ReportAction>> history = reports.stream()
.map(reportAction -> new BuildResult<>(new Build(reportAction.getOwner().getNumber(),
reportAction.getOwner().getDisplayName(), 0), reportAction))
.collect(Collectors.toList());

return new JacksonFacade().toJson(new ItemHistoryChart().create(history,
return new JacksonFacade().toJson(new ItemHistoryChart().create(createHistory(),
ChartModelConfiguration.fromJson(configuration), new ItemSeriesBuilder(item), result.getReport(), item.getItems()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import edu.hm.hafner.echarts.*;
import edu.umd.cs.findbugs.annotations.Nullable;
import io.jenkins.plugins.reporter.ReportAction;
import io.jenkins.plugins.reporter.ReportResult;
import io.jenkins.plugins.reporter.model.Item;
import io.jenkins.plugins.reporter.model.Report;

Expand Down Expand Up @@ -36,8 +36,8 @@ public class ItemHistoryChart {
*
* @return the chart model, ready to be serialized to JSON
*/
public LinesChartModel create(final Iterable<? extends BuildResult<ReportAction>> results,
final ChartModelConfiguration configuration, SeriesBuilder<ReportAction> builder,
public LinesChartModel create(final Iterable<? extends BuildResult<ReportResult>> results,
final ChartModelConfiguration configuration, SeriesBuilder<ReportResult> builder,
Report report, @Nullable List<Item> items) {

LinesDataSet dataSet = builder.createDataSet(configuration, results);
Expand Down
7 changes: 3 additions & 4 deletions src/main/java/io/jenkins/plugins/reporter/model/History.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package io.jenkins.plugins.reporter.model;

import java.util.Iterator;
import java.util.Optional;

import edu.hm.hafner.echarts.BuildResult;
import edu.umd.cs.findbugs.annotations.NonNull;

import hudson.model.Run;
import io.jenkins.plugins.reporter.ReportAction;
import io.jenkins.plugins.reporter.ReportResult;

import java.util.Iterator;
import java.util.Optional;


/**
* History of analysis results.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import edu.hm.hafner.echarts.SeriesBuilder;
import io.jenkins.plugins.reporter.ReportAction;
import io.jenkins.plugins.reporter.ReportResult;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
Expand All @@ -15,7 +15,7 @@
*
* @author Simon Symhoven
*/
public class ItemSeriesBuilder extends SeriesBuilder<ReportAction> {
public class ItemSeriesBuilder extends SeriesBuilder<ReportResult> {

private final Item item;

Expand All @@ -30,43 +30,25 @@ public ItemSeriesBuilder(Item item) {
}

@Override
protected Map<String, Integer> computeSeries(ReportAction reportAction) {
protected Map<String, Integer> computeSeries(ReportResult reportResult) {

if (item.getId().equals(ReportAction.REPORT_ID)) {

if (item.getResult().size() == 1) {
return reportAction.getResult().getReport().getItems().stream()
return reportResult.getReport().getItems().stream()
.collect(Collectors.toMap(Item::getId, Item::getTotal));
}

return reportAction.getResult().getReport().aggregate();
return reportResult.getReport().aggregate();
}

Item parent = reportAction.getResult().getReport().findItem(item.getId()).orElse(new Item());
Item parent = reportResult.getReport().findItem(item.getId()).orElse(new Item());
List<Item> items = parent.hasItems() ? parent.getItems() : Collections.singletonList(parent);

if (item.getResult().size() == 1) {
return items.stream().collect(Collectors.toMap(Item::getId, Item::getTotal));
}

return reportAction.getResult().getReport().aggregate(items);
}

private List<Item> findItems(String id, List<Item> items)
{
if (items != null) {
for (Item i: items) {
if (i.getId().equals(id)) {
return i.hasItems() ? i.getItems() : Collections.singletonList(i);
} else {
List<Item> sub = findItems(id, i.getItems());
if (sub.size() > 0) {
return sub;
}
}
}
}

return Collections.emptyList();
return reportResult.getReport().aggregate(items);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.jenkins.plugins.reporter.model;


import edu.hm.hafner.echarts.BuildResult;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.model.Run;
import io.jenkins.plugins.reporter.ReportAction;
import io.jenkins.plugins.reporter.ReportResult;

import java.util.Collections;
import java.util.Iterator;
import java.util.Optional;

public class NullReportHistory implements History {
@Override
public Optional<ReportAction> getBaselineAction() {
return Optional.empty();
}

@Override
public Optional<ReportResult> getBaselineResult() {
return Optional.empty();
}

@Override
public Optional<ReportResult> getResult() {
return Optional.empty();
}

@Override
public Optional<Run<?, ?>> getBuild() {
return Optional.empty();
}

@Override
public Report getReport() {
return new Report();
}

@NonNull
@Override
public Iterator<BuildResult<ReportResult>> iterator() {
return Collections.emptyIterator();
}

@Override
public boolean hasMultipleResults() {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package io.jenkins.plugins.reporter;
package io.jenkins.plugins.reporter.model;


import edu.hm.hafner.echarts.Build;
import edu.hm.hafner.echarts.BuildResult;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.model.Run;
import io.jenkins.plugins.reporter.model.History;
import io.jenkins.plugins.reporter.model.Report;
import io.jenkins.plugins.reporter.model.ResultSelector;
import io.jenkins.plugins.reporter.ReportAction;
import io.jenkins.plugins.reporter.ReportResult;

import java.util.Iterator;
import java.util.NoSuchElementException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package io.jenkins.plugins.reporter.model;

import edu.hm.hafner.echarts.SeriesBuilder;
import io.jenkins.plugins.reporter.ReportAction;
import io.jenkins.plugins.reporter.ReportResult;

import java.util.Map;
import java.util.stream.Collectors;

Expand All @@ -11,15 +12,15 @@
*
* @author Simon Symhoven
*/
public class ReportSeriesBuilder extends SeriesBuilder<ReportAction> {
public class ReportSeriesBuilder extends SeriesBuilder<ReportResult> {

@Override
protected Map<String, Integer> computeSeries(ReportAction reportAction) {
protected Map<String, Integer> computeSeries(ReportResult reportResult) {

Map<String, Integer> result = reportAction.getResult().getReport().aggregate();
Map<String, Integer> result = reportResult.getReport().aggregate();

if (result.size() == 1) {
return reportAction.getResult().getReport().getItems().stream()
return reportResult.getReport().getItems().stream()
.collect(Collectors.toMap(Item::getId, Item::getTotal));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package io.jenkins.plugins.reporter.model;

import java.util.Optional;

import hudson.model.Run;
import io.jenkins.plugins.reporter.ReportAction;

import java.util.Optional;

/**
* Selects a {@link ReportAction} from all registered actions in a given job.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
import org.eclipse.collections.impl.factory.Sets;
import org.jenkinsci.plugins.workflow.graph.FlowNode;
import org.jenkinsci.plugins.workflow.steps.*;
import org.kohsuke.stapler.*;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.verb.POST;

import java.io.Serializable;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
import org.kohsuke.stapler.verb.POST;

import java.io.IOException;
import java.util.*;
import java.util.Arrays;
import java.util.Locale;

public class ReportRecorder extends Recorder {

Expand Down

0 comments on commit 9da4e2d

Please sign in to comment.