package org.jggug.hudson.plugins.gcrawler; import hudson.Extension; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.Descriptor; import hudson.model.Executor; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import hudson.triggers.SafeTimerTask; import hudson.triggers.Trigger; import java.io.IOException; @Extension public class GBuildWrapper extends BuildWrapper { @Override public Descriptor<BuildWrapper> getDescriptor() { return DESCRIPTOR; } @Override @SuppressWarnings("unchecked") public Environment setUp(final AbstractBuild build, Launcher launcher, final BuildListener listener) throws IOException, InterruptedException { class EnvironmentImpl extends Environment { private TimerTask task; private EnvironmentImpl() { this.task = new TimerTask(build, listener); Trigger.timer.schedule(task, 0, 1000); } @Override public boolean tearDown(AbstractBuild build, BuildListener listener) throws IOException, InterruptedException { task.cancel(); return !task.isSizeOver; } final class TimerTask extends SafeTimerTask { private boolean isSizeOver; private AbstractBuild build; private BuildListener listener; private TimerTask(AbstractBuild build, BuildListener listener) { this.build = build; this.listener = listener; } @Override protected void doRun() { if (build.getLogFile().length() >= (10 * 1024 * 1024)) { listener.getLogger().append("Build interrupted. Log file is too large..\n"); isSizeOver = true; Executor executor = build.getExecutor(); if (executor != null) { executor.interrupt(); } } } } } return new EnvironmentImpl(); } public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); public static final class DescriptorImpl extends BuildWrapperDescriptor { DescriptorImpl() { super(GBuildWrapper.class); } public String getDisplayName() { return "Abort the build if it's stuck"; } public boolean isApplicable(AbstractProject<?, ?> item) { return true; } } }