package hudson.plugins.bamboo; import hudson.Extension; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.Result; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.BuildStepMonitor; import hudson.tasks.Notifier; import hudson.tasks.Publisher; import java.io.IOException; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.PostMethod; import org.kohsuke.stapler.DataBoundConstructor; /** * @author Asgeir Storesund Nilsen * */ public class BambooNotifier extends Notifier { public final String jobName; public final String serverAddress; public final String username; public final String password; public final boolean triggerUnstable; @DataBoundConstructor public BambooNotifier(String jobName, String serverAddress, String username, String password, boolean triggerUnstable) { if (serverAddress.endsWith("/")) this.serverAddress = serverAddress; else this.serverAddress = serverAddress + "/"; this.jobName = jobName; this.username = username; this.password = password; this.triggerUnstable = triggerUnstable; } /* * (non-Javadoc) * * @see hudson.tasks.BuildStep#getRequiredMonitorService() */ public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.NONE; } /* * (non-Javadoc) * * @see * hudson.tasks.BuildStepCompatibilityLayer#perform(hudson.model.AbstractBuild * , hudson.Launcher, hudson.model.BuildListener) */ @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { if (build.getResult() == Result.SUCCESS) triggerBamboo(listener); else if (triggerUnstable && build.getResult() == Result.UNSTABLE) { listener.getLogger().println("Triggering unstable build"); triggerBamboo(listener); } return true; } void triggerBamboo(BuildListener listener) { String url = serverAddress + "rest/api/latest/queue/" + jobName + "?os_authType=basic"; listener.getLogger().printf("Triggering Bamboo job %s%n", url); PostMethod postMethod = new PostMethod(url); HttpClient client = new HttpClient(); Credentials credentials = new UsernamePasswordCredentials(username, password); client.getState().setCredentials(AuthScope.ANY, credentials); try { int status = client.executeMethod(postMethod); listener.getLogger().printf("Response code: %d%n", status); } catch (HttpException e) { e.printStackTrace(listener.error("Unable to notify Bamboo URL %s", url)); } catch (IOException e) { e.printStackTrace(listener.error( "Unable to connect to Bamboo URL %s", url)); } finally { postMethod.releaseConnection(); } } @Extension public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> { /* * (non-Javadoc) * * @see hudson.tasks.BuildStepDescriptor#isApplicable(java.lang.Class) */ @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } /* * (non-Javadoc) * * @see hudson.model.Descriptor#getDisplayName() */ @Override public String getDisplayName() { return "Bamboo Notifier"; } } }