aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/bitbucketpullrequestbuilder
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bitbucketpullrequestbuilder')
-rw-r--r--src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java64
-rw-r--r--src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketPullRequestsBuilder.java2
-rw-r--r--src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java7
3 files changed, 61 insertions, 12 deletions
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java
index aedfb91..90de6b5 100644
--- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketBuildTrigger.java
@@ -7,20 +7,26 @@ import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredenti
import com.cloudbees.plugins.credentials.common.UsernamePasswordCredentials;
import hudson.Extension;
import hudson.model.*;
+import hudson.model.Queue;
import hudson.model.queue.QueueTaskFuture;
import hudson.plugins.git.RevisionParameterAction;
import hudson.triggers.Trigger;
import hudson.triggers.TriggerDescriptor;
import hudson.util.ListBoxModel;
+import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import static com.cloudbees.plugins.credentials.CredentialsMatchers.instanceOf;
@@ -43,11 +49,12 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
private final String ciSkipPhrases;
private final boolean checkDestinationCommit;
private final boolean approveIfSuccess;
+ private final boolean cancelOutdatedJobs;
transient private BitbucketPullRequestsBuilder bitbucketPullRequestsBuilder;
@Extension
- public static final BitbucketBuildTriggerDescriptor descriptor = new BitbucketBuildTriggerDescriptor();
+ public static final BitbucketBuildTriggerDescriptor descriptor = new BitbucketBuildTriggerDescriptor();
@DataBoundConstructor
public BitbucketBuildTrigger(
@@ -64,7 +71,8 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
String ciName,
String ciSkipPhrases,
boolean checkDestinationCommit,
- boolean approveIfSuccess
+ boolean approveIfSuccess,
+ boolean cancelOutdatedJobs
) throws ANTLRException {
super(cron);
this.projectPath = projectPath;
@@ -81,6 +89,7 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
this.ciSkipPhrases = ciSkipPhrases;
this.checkDestinationCommit = checkDestinationCommit;
this.approveIfSuccess = approveIfSuccess;
+ this.cancelOutdatedJobs = cancelOutdatedJobs;
}
public String getProjectPath() {
@@ -114,7 +123,7 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
public String getBranchesFilter() {
return branchesFilter;
}
-
+
public boolean getBranchesFilterBySCMIncludes() {
return branchesFilterBySCMIncludes;
}
@@ -139,6 +148,10 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
return approveIfSuccess;
}
+ public boolean getCancelOutdatedJobs() {
+ return cancelOutdatedJobs;
+ }
+
@Override
public void start(AbstractProject<?, ?> project, boolean newInstance) {
try {
@@ -164,9 +177,54 @@ public class BitbucketBuildTrigger extends Trigger<AbstractProject<?, ?>> {
public QueueTaskFuture<?> startJob(BitbucketCause cause) {
Map<String, ParameterValue> values = this.getDefaultParameters();
+
+ if (getCancelOutdatedJobs()) {
+ cancelPreviousJobsInQueueThatMatch(cause);
+ abortRunningJobsThatMatch(cause);
+ }
+
return this.job.scheduleBuild2(0, cause, new ParametersAction(new ArrayList(values.values())), new RevisionParameterAction(cause.getSourceCommitHash()));
}
+ private void cancelPreviousJobsInQueueThatMatch(@Nonnull BitbucketCause bitbucketCause) {
+ logger.fine("Looking for queued jobs that match PR ID: " + bitbucketCause.getPullRequestId());
+ Queue queue = Jenkins.getInstance().getQueue();
+ for (Queue.Item item : queue.getItems()) {
+ if (hasCauseFromTheSamePullRequest(item.getCauses(), bitbucketCause)) {
+ logger.info("Canceling item in queue: " + item);
+ queue.cancel(item);
+ }
+ }
+ }
+
+ private void abortRunningJobsThatMatch(@Nonnull BitbucketCause bitbucketCause) {
+ logger.fine("Looking for running jobs that match PR ID: " + bitbucketCause.getPullRequestId());
+ for (Object o : job.getBuilds()) {
+ if (o instanceof Build) {
+ Build build = (Build) o;
+ if (build.isBuilding() && hasCauseFromTheSamePullRequest(build.getCauses(), bitbucketCause)) {
+ logger.info("Aborting build: " + build + " since PR is outdated");
+ build.getExecutor().interrupt(Result.ABORTED);
+ }
+ }
+ }
+ }
+
+ private boolean hasCauseFromTheSamePullRequest(@Nullable List<Cause> causes, @Nullable BitbucketCause pullRequestCause) {
+ if (causes != null && pullRequestCause != null) {
+ for (Cause cause : causes) {
+ if (cause instanceof BitbucketCause) {
+ BitbucketCause sc = (BitbucketCause) cause;
+ if (StringUtils.equals(sc.getPullRequestId(), pullRequestCause.getPullRequestId()) &&
+ StringUtils.equals(sc.getRepositoryName(), pullRequestCause.getRepositoryName())) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
private Map<String, ParameterValue> getDefaultParameters() {
Map<String, ParameterValue> values = new HashMap<String, ParameterValue>();
ParametersDefinitionProperty definitionProperty = this.job.getProperty(ParametersDefinitionProperty.class);
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketPullRequestsBuilder.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketPullRequestsBuilder.java
index d337796..899edba 100644
--- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketPullRequestsBuilder.java
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/BitbucketPullRequestsBuilder.java
@@ -69,10 +69,8 @@ public class BitbucketPullRequestsBuilder {
return new String(Hex.encodeHex(MD5.digest(this.project.getFullName().getBytes("UTF-8"))));
} catch (NoSuchAlgorithmException exc) {
logger.log(Level.WARNING, "Failed to produce hash", exc);
- exc.printStackTrace();
} catch (UnsupportedEncodingException exc) {
logger.log(Level.WARNING, "Failed to produce hash", exc);
- exc.printStackTrace();
}
return this.project.getFullName();
}
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java
index 759c696..0c87478 100644
--- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java
+++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java
@@ -119,10 +119,8 @@ public class ApiClient {
return new String(Hex.encodeHex(SHA1.digest(computedKey.getBytes("UTF-8"))));
} catch(NoSuchAlgorithmException e) {
logger.log(Level.WARNING, "Failed to create hash provider", e);
- e.printStackTrace();
} catch (UnsupportedEncodingException e) {
logger.log(Level.WARNING, "Failed to create hash provider", e);
- e.printStackTrace();
}
}
return (computedKey.length() <= MAX_KEY_SIZE_BB_API) ? computedKey : computedKey.substring(0, MAX_KEY_SIZE_BB_API);
@@ -173,7 +171,6 @@ public class ApiClient {
new NameValuePair[]{}), Pullrequest.Participant.class);
} catch (IOException e) {
logger.log(Level.WARNING, "Invalid pull request approval response.", e);
- e.printStackTrace();
}
return null;
}
@@ -186,7 +183,6 @@ public class ApiClient {
return parse(post(v1("/pullrequests/" + pullRequestId + "/comments"), data), new TypeReference<Pullrequest.Comment>() {});
} catch(Exception e) {
logger.log(Level.WARNING, "Invalid pull request comment response.", e);
- e.printStackTrace();
}
return null;
}
@@ -203,7 +199,6 @@ public class ApiClient {
} while (url != null);
} catch (Exception e) {
logger.log(Level.WARNING, "invalid response.", e);
- e.printStackTrace();
}
return values;
}
@@ -255,10 +250,8 @@ public class ApiClient {
return req.getResponseBodyAsString();
} catch (HttpException e) {
logger.log(Level.WARNING, "Failed to send request.", e);
- e.printStackTrace();
} catch (IOException e) {
logger.log(Level.WARNING, "Failed to send request.", e);
- e.printStackTrace();
} finally {
req.releaseConnection();
}