package hudson.plugins.view.dashboard.stats; import hudson.Extension; import hudson.model.Descriptor; import hudson.model.HealthReport; import hudson.model.Hudson; import hudson.model.Job; import hudson.model.TopLevelItem; import hudson.plugins.view.dashboard.DashboardPortlet; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import org.kohsuke.stapler.DataBoundConstructor; /** * Job statistics - number of jobs with given health status * * @author Vojtech Juranek */ public class StatJobs extends DashboardPortlet{ @DataBoundConstructor public StatJobs(String name) { super(name); } /** * Heath status of the builds (use enum not class for it) */ public enum HealthStatus{ HEALTH_OVER_80("health-80plus.gif","No recent builds failed"), HEALTH_60_TO_79("health-60to79.gif","20-40% of recent builds failed"), HEALTH_40_TO_59("health-40to59.gif","40-60% of recent builds failed"), HEALTH_20_TO_39("health-20to39.gif","60-80% of recent builds failed"), HEALTH_0_TO_19("health-00to19.gif","All recent builds failed"), HEALTH_UNKNOWN("empty.gif","Unknown status"); private HealthReport healthReport; private String iconUrl; private String description; HealthStatus(String iconUrl, String description) { this.iconUrl = iconUrl; this.description = description; } public static HealthStatus getHealthStatus(Job job){ int score = job.getBuildHealth().getScore(); int nBuilds = job.getBuilds().size(); if (score < 20) { return HEALTH_0_TO_19; } else if (score < 40) { return HEALTH_20_TO_39; } else if (score < 60) { return HEALTH_40_TO_59; } else if (score < 80) { return HEALTH_60_TO_79; } else if (score >= 79){ if(nBuilds != 0) return HEALTH_OVER_80; else return HEALTH_UNKNOWN; } else{ return HEALTH_UNKNOWN; } } public String getIconUrl(){ return Hudson.RESOURCE_PATH + "/images/32x32/" + iconUrl; } public String getIconUrl(String size) { if (iconUrl == null) { return Hudson.RESOURCE_PATH + "/images/" + size + "/" + HEALTH_UNKNOWN.getIconUrl(); } if (iconUrl.startsWith("/")) { return iconUrl.replace("/32x32/", "/" + size + "/"); } return Hudson.RESOURCE_PATH + "/images/" + size + "/" + iconUrl; } public String getDescription(){ return description; } } /** * Project statistics - number of projects with given health status */ public Map<HealthStatus, Integer> getJobStat(List<TopLevelItem> jobs) { SortedMap<HealthStatus, Integer> colStatJobs = new TreeMap<HealthStatus, Integer>(); for(HealthStatus status : HealthStatus.values()){ colStatJobs.put(status, 0); } // Job and build statistics for (TopLevelItem job : jobs) { if (job instanceof Job) { HealthStatus status = HealthStatus.getHealthStatus(((Job) job)); colStatJobs.put(status, colStatJobs.get(status) + 1); } } return colStatJobs; } @Extension public static class DescriptorImpl extends Descriptor<DashboardPortlet> { @Override public String getDisplayName() { return "Job statistics"; } } }