Skip to content

Commit

Permalink
[JENKINS-43183] Include all builds into statistics (#55)
Browse files Browse the repository at this point in the history
* Switched from AbstractBuild to Run
  • Loading branch information
balakine committed Sep 7, 2023
1 parent 1754ac0 commit b2c4a0f
Show file tree
Hide file tree
Showing 13 changed files with 50 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import hudson.Plugin;
import hudson.model.ManagementLink;
import hudson.model.TaskListener;
import hudson.model.AbstractBuild;
import hudson.model.Api;
import hudson.model.Hudson;
import hudson.model.Run;
import hudson.model.listeners.ItemListener;
import hudson.model.listeners.RunListener;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsBusiness;
Expand All @@ -21,6 +21,8 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletException;

Expand All @@ -44,6 +46,8 @@
@ExportedBean
public class GlobalBuildStatsPlugin extends Plugin {

private static final Logger LOGGER = Logger.getLogger(GlobalBuildStatsPlugin.class.getName());

/**
* List of aggregated job build results
* This list will grow over time, but will be monthly sharded in different files to keep
Expand Down Expand Up @@ -193,22 +197,15 @@ public String getDescription() {
* persisted data
*/
@Extension
public static class GlobalBuildStatsRunListener extends RunListener<AbstractBuild>{
public GlobalBuildStatsRunListener() {
super(AbstractBuild.class);
}

public static class GlobalBuildStatsRunListener extends RunListener<Run<?, ?>>{
@Override
public void onCompleted(AbstractBuild r, TaskListener listener) {
super.onCompleted(r, listener);

public void onCompleted(Run<?, ?> r, TaskListener listener) {
LOGGER.log(Level.FINEST, "GlobalBuildStatsRunListener onCompleted " + r.getExternalizableId());
getPluginBusiness().onJobCompleted(r);
}

@Override
public void onDeleted(AbstractBuild build) {
super.onDeleted(build);

public void onDeleted(Run<?, ?> build) {
getPluginBusiness().onBuildDeleted(build);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ public class JobBuildResultFactory {
private JobBuildResultFactory(){
}

public JobBuildResult createJobBuildResult(AbstractBuild build){
String buildName = build.getProject().getFullName();
public JobBuildResult createJobBuildResult(Run<?, ?> build){
String buildName = build.getParent().getFullName();
long duration = build.getDuration();
String nodeName = build.getBuiltOnStr();
String nodeName = (build instanceof AbstractBuild)
? ((AbstractBuild<?, ?>) build).getBuiltOnStr()
: "";
/* Can't do that since MavenModuleSet is in maven-plugin artefact which is in test scope
if(build.getProject() instanceof MavenModuleSet){
buildName = ((MavenModuleSet)build.getProject()).getRootModule().toString();
Expand All @@ -27,7 +29,7 @@ public JobBuildResult createJobBuildResult(AbstractBuild build){
build.getNumber(), build.getTimestamp(), duration, nodeName, extractUserNameIn(build));
}

public JobBuildSearchResult createJobBuildSearchResult(AbstractBuild build){
public JobBuildSearchResult createJobBuildSearchResult(Run<?, ?> build){
return createJobBuildSearchResult(createJobBuildResult(build));
}

Expand All @@ -49,7 +51,7 @@ public JobBuildSearchResult createJobBuildSearchResult(JobBuildResult r){
return new JobBuildSearchResult(r, isJobAccessible, isBuildAccessible);
}

public static String extractUserNameIn(AbstractBuild<?,?> build){
public static String extractUserNameIn(Run<?, ?> build){
String userName;
@SuppressWarnings("deprecation") Cause.UserCause uc = build.getCause(Cause.UserCause.class);
Cause.UserIdCause uic = build.getCause(Cause.UserIdCause.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package hudson.plugins.global_build_stats.business;

import hudson.model.TopLevelItem;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.global_build_stats.GlobalBuildStatsPlugin;
import hudson.plugins.global_build_stats.JobBuildResultFactory;
import hudson.plugins.global_build_stats.model.*;
Expand Down Expand Up @@ -52,7 +52,8 @@ public GlobalBuildStatsBusiness(GlobalBuildStatsPlugin _plugin){
/**
* Records the result of a build.
*/
public void onJobCompleted(final AbstractBuild build) {
public void onJobCompleted(final Run<?, ?> build) {
LOGGER.log(Level.FINEST, "GlobalBuildStatsBusiness onJobCompleted " + build.getExternalizableId());
for(RetentionStrategy s : plugin.getRetentionStrategies()){
s.onBuildCompleted(build, pluginSaver);
}
Expand Down Expand Up @@ -366,13 +367,13 @@ public List<AbstractBuildStatChartDimension> createDataSetBuilder(BuildStatConfi
return dimensions;
}

private static void addBuild(List<JobBuildResult> jobBuildResultsRead, AbstractBuild build){
private static void addBuild(List<JobBuildResult> jobBuildResultsRead, Run<?, ?> build){
jobBuildResultsRead.add(JobBuildResultFactory.INSTANCE.createJobBuildResult(build));
}

private static void addBuildsFrom(List<JobBuildResult> jobBuildResultsRead, AbstractProject project){
List<AbstractBuild> builds = project.getBuilds();
Iterator<AbstractBuild> buildIterator = builds.iterator();
List<Run<?, ?>> builds = project.getBuilds();
Iterator<Run<?, ?>> buildIterator = builds.iterator();

while (buildIterator.hasNext()) {
addBuild(jobBuildResultsRead, buildIterator.next());
Expand Down Expand Up @@ -404,7 +405,7 @@ public void reloadPlugin() {
}
}

public void onBuildDeleted(AbstractBuild build) {
public void onBuildDeleted(Run<?, ?> build) {
for(RetentionStrategy s : plugin.getRetentionStrategies()){
s.onBuildDeleted(build, pluginSaver);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hudson.plugins.global_build_stats.rententionstrategies;

import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.GlobalBuildStatsPlugin;
import hudson.plugins.global_build_stats.JobBuildResultFactory;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsPluginSaver;
Expand Down Expand Up @@ -47,7 +47,7 @@ public void strategyActivated(GlobalBuildStatsPluginSaver pluginSaver) {
purgeOldBuildResults(pluginSaver, System.currentTimeMillis());
}

public void buildCompleted(AbstractBuild buils, GlobalBuildStatsPluginSaver pluginSaver) {
public void buildCompleted(Run<?, ?> buils, GlobalBuildStatsPluginSaver pluginSaver) {
final long now = System.currentTimeMillis();
if(lastPurgeDate == null || now > lastPurgeDate.getTime() + PURGE_FREQUENCY){
purgeOldBuildResults(pluginSaver, now);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hudson.plugins.global_build_stats.rententionstrategies;

import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.GlobalBuildStatsPlugin;
import hudson.plugins.global_build_stats.JobBuildResultFactory;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsPluginSaver;
Expand All @@ -18,7 +18,7 @@ public String getConfigPage() {
return "doNotKeepBuildResultWhenDiscarded.jelly";
}

public void buildDeleted(final AbstractBuild build, GlobalBuildStatsPluginSaver pluginSaver) {
public void buildDeleted(final Run<?, ?> build, GlobalBuildStatsPluginSaver pluginSaver) {
pluginSaver.updatePlugin(new GlobalBuildStatsPluginSaver.BeforeSavePluginCallback() {
@Override
public void changePluginStateBeforeSavingIt(GlobalBuildStatsPlugin plugin) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package hudson.plugins.global_build_stats.rententionstrategies;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsPluginSaver;
import hudson.plugins.global_build_stats.rententionstrategies.strategybehaviours.BuildCompletedListener;
import hudson.plugins.global_build_stats.rententionstrategies.strategybehaviours.BuildDeletedListener;
Expand Down Expand Up @@ -54,14 +54,14 @@ public void from(T strategyToCopy) {
}

// Overridable if retention strategy is a build deleted listener
public void onBuildDeleted(AbstractBuild build, GlobalBuildStatsPluginSaver pluginSaver) {
public void onBuildDeleted(Run<?, ?> build, GlobalBuildStatsPluginSaver pluginSaver) {
if(this instanceof BuildDeletedListener){
((BuildDeletedListener)this).buildDeleted(build, pluginSaver);
}
}

// Overridable if retention strategy is a build completed listener
public void onBuildCompleted(AbstractBuild build, GlobalBuildStatsPluginSaver pluginSaver) {
public void onBuildCompleted(Run<?, ?> build, GlobalBuildStatsPluginSaver pluginSaver) {
if(this instanceof BuildCompletedListener){
((BuildCompletedListener)this).buildCompleted(build, pluginSaver);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package hudson.plugins.global_build_stats.rententionstrategies.strategybehaviours;

import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsPluginSaver;

/**
* @author fcamblor
*/
public interface BuildCompletedListener {
public void buildCompleted(AbstractBuild buils, GlobalBuildStatsPluginSaver pluginSaver);
public void buildCompleted(Run<?, ?> buils, GlobalBuildStatsPluginSaver pluginSaver);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package hudson.plugins.global_build_stats.rententionstrategies.strategybehaviours;

import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.business.GlobalBuildStatsPluginSaver;

/**
* @author fcamblor
*/
public interface BuildDeletedListener {
public void buildDeleted(AbstractBuild buils, GlobalBuildStatsPluginSaver pluginSaver);
public void buildDeleted(Run<?, ?> buils, GlobalBuildStatsPluginSaver pluginSaver);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import hudson.model.AbstractBuild;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.global_build_stats.model.BuildStatConfiguration;
import hudson.plugins.global_build_stats.model.JobBuildResult;
import hudson.plugins.global_build_stats.model.JobBuildResultSharder;
Expand Down Expand Up @@ -92,10 +92,10 @@ protected boolean registerBuildStatConfigId(){
return true;
}

protected static AbstractBuild retrieveBuildFromJobBuildResult(JobBuildResult jbr){
protected static Run<?, ?> retrieveBuildFromJobBuildResult(JobBuildResult jbr){
Job job = (Job)Hudson.getInstance().getItemByFullName(jbr.getJobName());
if(job != null){
return (AbstractBuild)job.getBuildByNumber(jbr.getBuildNumber());
return (Run<?, ?>)job.getBuildByNumber(jbr.getBuildNumber());
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package hudson.plugins.global_build_stats.xstream.migration;

import hudson.model.AbstractBuild;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.global_build_stats.model.BuildStatConfiguration;
import hudson.plugins.global_build_stats.model.JobBuildResult;
import hudson.plugins.global_build_stats.model.ModelIdGenerator;
Expand Down Expand Up @@ -79,10 +79,10 @@ protected boolean registerBuildStatConfigId(){
return true;
}

protected static AbstractBuild retrieveBuildFromJobBuildResult(JobBuildResult jbr){
protected static Run<?, ?> retrieveBuildFromJobBuildResult(JobBuildResult jbr){
Job job = (Job)Hudson.getInstance().getItemByFullName(jbr.getJobName());
if(job != null){
return (AbstractBuild)job.getBuildByNumber(jbr.getBuildNumber());
return (Run<?, ?>)job.getBuildByNumber(jbr.getBuildNumber());
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import hudson.model.AbstractBuild;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.Run;
import hudson.plugins.global_build_stats.model.BuildStatConfiguration;
import hudson.plugins.global_build_stats.model.JobBuildResult;
import hudson.plugins.global_build_stats.model.JobBuildResultSharder;
Expand Down Expand Up @@ -82,10 +82,10 @@ protected boolean registerBuildStatConfigId(){
return true;
}

protected static AbstractBuild retrieveBuildFromJobBuildResult(JobBuildResult jbr){
protected static Run<?, ?> retrieveBuildFromJobBuildResult(JobBuildResult jbr){
Job job = (Job) Jenkins.getInstance().getItemByFullName(jbr.getJobName());
if(job != null){
return (AbstractBuild)job.getBuildByNumber(jbr.getBuildNumber());
return (Run<?, ?>)job.getBuildByNumber(jbr.getBuildNumber());
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package hudson.plugins.global_build_stats.xstream.migration.v3;

import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.model.JobBuildResult;
import hudson.plugins.global_build_stats.xstream.migration.PreV8AbstractMigrator;
import hudson.plugins.global_build_stats.xstream.migration.v2.V2GlobalBuildStatsPOJO;
Expand Down Expand Up @@ -29,10 +30,12 @@ protected List<JobBuildResult> migrateJobBuildResults(
// Providing JobBuildResult.duration & nodeName attributes
long duration = JobBuildResult.EMPTY_DURATION;
String nodeName = JobBuildResult.EMPTY_NODE_NAME;
AbstractBuild b = retrieveBuildFromJobBuildResult(jbr);
Run<?, ?> b = retrieveBuildFromJobBuildResult(jbr);
if(b != null){
duration = b.getDuration();
nodeName = b.getBuiltOnStr();
nodeName = (b instanceof AbstractBuild)
? ((AbstractBuild<?, ?>) b).getBuiltOnStr()
: "";
}

jbr.setDuration(duration);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hudson.plugins.global_build_stats.xstream.migration.v7;

import hudson.model.AbstractBuild;
import hudson.model.Run;
import hudson.plugins.global_build_stats.FieldFilterFactory;
import hudson.plugins.global_build_stats.JobBuildResultFactory;
import hudson.plugins.global_build_stats.model.BuildSearchCriteria;
Expand Down Expand Up @@ -54,7 +54,7 @@ protected List<JobBuildResult> migrateJobBuildResults(List<JobBuildResult> jobBu

ArrayList<JobBuildResult> migratedJobBuildResults = new ArrayList<JobBuildResult>();
for(JobBuildResult jbr : jobBuildResults){
AbstractBuild b = retrieveBuildFromJobBuildResult(jbr);
Run<?, ?> b = retrieveBuildFromJobBuildResult(jbr);
if(b != null){
String userName = JobBuildResultFactory.extractUserNameIn(b);
jbr.setUserName(userName);
Expand Down

0 comments on commit b2c4a0f

Please sign in to comment.