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.
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
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)

Check warning on line 21 in src/main/java/hudson/plugins/global_build_stats/JobBuildResultFactory.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 21 is only partially covered, one branch is missing
? ((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
@@ -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();

Check warning on line 375 in src/main/java/hudson/plugins/global_build_stats/business/GlobalBuildStatsBusiness.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 375 is not covered by tests
Iterator<Run<?, ?>> buildIterator = builds.iterator();

Check warning on line 376 in src/main/java/hudson/plugins/global_build_stats/business/GlobalBuildStatsBusiness.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 376 is not covered by tests

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
@@ -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
@@ -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
@@ -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
@@ -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);
}
@@ -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);
}
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());

Check warning on line 98 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/AbstractMigrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 98 is not covered by tests
}
return null;
}
Expand Down
@@ -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());

Check warning on line 85 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/PreV8AbstractMigrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 85 is not covered by tests
}
return null;
}
Expand Down
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());

Check warning on line 88 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/PreV9AbstractMigrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 88 is not covered by tests
}
return null;
}
Expand Down
@@ -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);

Check warning on line 33 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/v3/V2ToV3Migrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 33 is not covered by tests
if(b != null){
duration = b.getDuration();
nodeName = b.getBuiltOnStr();
nodeName = (b instanceof AbstractBuild)

Check warning on line 36 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/v3/V2ToV3Migrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 36 is only partially covered, 2 branches are missing
? ((AbstractBuild<?, ?>) b).getBuiltOnStr()

Check warning on line 37 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/v3/V2ToV3Migrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 37 is not covered by tests
: "";

Check warning on line 38 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/v3/V2ToV3Migrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 38 is not covered by tests
}

jbr.setDuration(duration);
Expand Down
@@ -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);

Check warning on line 57 in src/main/java/hudson/plugins/global_build_stats/xstream/migration/v7/V6ToV7Migrator.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 57 is not covered by tests
if(b != null){
String userName = JobBuildResultFactory.extractUserNameIn(b);
jbr.setUserName(userName);
Expand Down

0 comments on commit b2c4a0f

Please sign in to comment.