88import com .dabsquared .gitlabjenkins .gitlab .api .model .BuildState ;
99import com .dabsquared .gitlabjenkins .publisher .GitLabCommitStatusPublisher ;
1010import com .dabsquared .gitlabjenkins .util .LoggerUtil ;
11- import hudson .model .AbstractProject ;
12- import hudson .model .Cause ;
13- import hudson .model .Job ;
14- import hudson .model .Queue ;
11+ import hudson .model .*;
1512import jenkins .model .Jenkins ;
1613import org .apache .commons .lang .StringUtils ;
1714import org .jenkinsci .plugins .displayurlapi .DisplayURLProvider ;
@@ -24,7 +21,7 @@ public class PendingBuildsHandler {
2421
2522 private static final Logger LOGGER = Logger .getLogger (PendingBuildsHandler .class .getName ());
2623
27- public void cancelPendingBuilds (Job <?, ?> job , Integer projectId , String branch ) {
24+ public void cancelPendingBuilds (Job <?, ?> job , Integer projectId , String sourceBranch ) {
2825 Queue queue = Jenkins .getInstance ().getQueue ();
2926 for (Queue .Item item : queue .getItems ()) {
3027 if (!job .getName ().equals (item .task .getName ())) {
@@ -38,11 +35,29 @@ public void cancelPendingBuilds(Job<?, ?> job, Integer projectId, String branch)
3835 if (!projectId .equals (queueItemCauseData .getSourceProjectId ())) {
3936 continue ;
4037 }
41- if (branch .equals (queueItemCauseData .getBranch ())) {
42- cancel (item , queue , branch );
38+ if (sourceBranch .equals (queueItemCauseData .getBranch ())) {
39+ cancel (item , queue , sourceBranch );
4340 setCommitStatusCancelledIfNecessary (queueItemCauseData , job );
4441 }
4542 }
43+ stopRunningBuilds (job , sourceBranch );
44+ }
45+
46+ private void stopRunningBuilds (Job <?, ?> job , String sourceBranch ) {
47+ for (Run <?, ?> build : job .getBuilds ()) {
48+ if (build .isBuilding () && runsCausedByMergeToSourceBranch (build , sourceBranch )) {
49+ LOGGER .log (Level .INFO , "Stopping build {0} of job {1} caused by commit to branch {2}" , LoggerUtil .toArray (build .getDisplayName (), job .getName (), sourceBranch ));
50+ Executor executor = build .getExecutor ();
51+ if (executor != null ) executor .doStop ();
52+ GitLabWebHookCause cause = build .getCause (GitLabWebHookCause .class );
53+ if (cause != null ) setCommitStatusCancelledIfNecessary (cause .getData (), job );
54+ }
55+ }
56+ }
57+
58+ private boolean runsCausedByMergeToSourceBranch (Run <?, ?> build , String sourceBranch ) {
59+ GitLabWebHookCause cause = build .getCause (GitLabWebHookCause .class );
60+ return cause != null && cause .getData ().getSourceBranch ().equals (sourceBranch );
4661 }
4762
4863 private GitLabWebHookCause getGitLabWebHookCauseData (Queue .Item item ) {
0 commit comments