Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rework of report build history creation #74

Merged
merged 2 commits into from
Sep 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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