Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
import com.dabsquared.gitlabjenkins.gitlab.api.model.BuildState;
import com.dabsquared.gitlabjenkins.publisher.GitLabCommitStatusPublisher;
import com.dabsquared.gitlabjenkins.util.LoggerUtil;
import hudson.model.AbstractProject;
import hudson.model.Cause;
import hudson.model.Job;
import hudson.model.Queue;
import hudson.model.*;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.displayurlapi.DisplayURLProvider;
Expand All @@ -24,7 +21,7 @@ public class PendingBuildsHandler {

private static final Logger LOGGER = Logger.getLogger(PendingBuildsHandler.class.getName());

public void cancelPendingBuilds(Job<?, ?> job, Integer projectId, String branch) {
public void cancelPendingBuilds(Job<?, ?> job, Integer projectId, String sourceBranch) {
Queue queue = Jenkins.getInstance().getQueue();
for (Queue.Item item : queue.getItems()) {
if (!job.getName().equals(item.task.getName())) {
Expand All @@ -38,11 +35,29 @@ public void cancelPendingBuilds(Job<?, ?> job, Integer projectId, String branch)
if (!projectId.equals(queueItemCauseData.getSourceProjectId())) {
continue;
}
if (branch.equals(queueItemCauseData.getBranch())) {
cancel(item, queue, branch);
if (sourceBranch.equals(queueItemCauseData.getBranch())) {
cancel(item, queue, sourceBranch);
setCommitStatusCancelledIfNecessary(queueItemCauseData, job);
}
}
stopRunningBuilds(job, sourceBranch);
}

private void stopRunningBuilds(Job<?, ?> job, String sourceBranch) {
for (Run<?, ?> build : job.getBuilds()) {
if (build.isBuilding() && runsCausedByMergeToSourceBranch(build, sourceBranch)) {
LOGGER.log(Level.INFO, "Stopping build {0} of job {1} caused by commit to branch {2}", LoggerUtil.toArray(build.getDisplayName(), job.getName(), sourceBranch));
Executor executor = build.getExecutor();
if (executor != null) executor.doStop();
GitLabWebHookCause cause = build.getCause(GitLabWebHookCause.class);
if (cause != null) setCommitStatusCancelledIfNecessary(cause.getData(), job);
}
}
}

private boolean runsCausedByMergeToSourceBranch(Run<?, ?> build, String sourceBranch) {
GitLabWebHookCause cause = build.getCause(GitLabWebHookCause.class);
return cause != null && cause.getData().getSourceBranch().equals(sourceBranch);
}

private GitLabWebHookCause getGitLabWebHookCauseData(Queue.Item item) {
Expand Down