Skip to content

Commit fef46c5

Browse files
committed
JENKINS-12092 Block job by category
1 parent 880acd2 commit fef46c5

File tree

5 files changed

+53
-6
lines changed

5 files changed

+53
-6
lines changed

src/main/java/hudson/plugins/throttleconcurrents/ThrottleJobProperty.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,30 @@ public class ThrottleJobProperty extends JobProperty<AbstractProject<?,?>> {
4444
private String throttleOption;
4545
private transient boolean throttleConfiguration;
4646
private @CheckForNull ThrottleMatrixProjectOptions matrixOptions;
47+
private boolean blockedByCategory;
4748

4849
/**
4950
* Store a config version so we're able to migrate config on various
5051
* functionality upgrades.
5152
*/
5253
private Long configVersion;
53-
54+
5455
@DataBoundConstructor
5556
public ThrottleJobProperty(Integer maxConcurrentPerNode,
5657
Integer maxConcurrentTotal,
5758
List<String> categories,
5859
boolean throttleEnabled,
5960
String throttleOption,
60-
@CheckForNull ThrottleMatrixProjectOptions matrixOptions
61+
@CheckForNull ThrottleMatrixProjectOptions matrixOptions,
62+
boolean blockedByCategory
6163
) {
6264
this.maxConcurrentPerNode = maxConcurrentPerNode == null ? 0 : maxConcurrentPerNode;
6365
this.maxConcurrentTotal = maxConcurrentTotal == null ? 0 : maxConcurrentTotal;
6466
this.categories = categories;
6567
this.throttleEnabled = throttleEnabled;
6668
this.throttleOption = throttleOption;
6769
this.matrixOptions = matrixOptions;
70+
this.blockedByCategory = blockedByCategory;
6871
}
6972

7073

@@ -131,7 +134,11 @@ public String getThrottleOption() {
131134
public List<String> getCategories() {
132135
return categories;
133136
}
134-
137+
138+
public boolean isBlockedByCategory() {
139+
return blockedByCategory;
140+
}
141+
135142
public Integer getMaxConcurrentPerNode() {
136143
if (maxConcurrentPerNode == null)
137144
maxConcurrentPerNode = 0;

src/main/java/hudson/plugins/throttleconcurrents/ThrottleQueueTaskDispatcher.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package hudson.plugins.throttleconcurrents;
22

3+
34
import hudson.Extension;
45
import hudson.matrix.MatrixConfiguration;
56
import hudson.matrix.MatrixProject;
@@ -18,6 +19,7 @@
1819
import java.util.Set;
1920
import java.util.logging.Level;
2021
import java.util.logging.Logger;
22+
2123
import javax.annotation.CheckForNull;
2224
import javax.annotation.Nonnull;
2325

@@ -153,6 +155,11 @@ else if (tjp.getThrottleOption().equals("category")) {
153155

154156
// Double check category itself isn't null
155157
if (category != null) {
158+
// Check if this job is blocked by category
159+
if (isBlockedByCategory(task, categoryProjects)) {
160+
return CauseOfBlockage.fromMessage(Messages._ThrottleQueueTaskDispatcher_BlockedByCategory(catNm));
161+
}
162+
156163
if (category.getMaxConcurrentTotal().intValue() > 0) {
157164
int maxConcurrentTotal = category.getMaxConcurrentTotal().intValue();
158165
int totalRunCount = 0;
@@ -178,6 +185,35 @@ else if (tjp.getThrottleOption().equals("category")) {
178185
return null;
179186
}
180187

188+
private boolean isBlockedByCategory(Task task, List<AbstractProject<?, ?>> categoryProjects) {
189+
ThrottleJobProperty buildProperty = getThrottleJobProperty(task);
190+
if (buildProperty.isBlockedByCategory()) {
191+
return areOtherProjectsInCategoryBuilding(task, categoryProjects);
192+
}
193+
return false;
194+
}
195+
196+
private boolean areOtherProjectsInCategoryBuilding(Task task, List<AbstractProject<?, ?>> categoryProjects) {
197+
for (AbstractProject<?, ?> catProj : categoryProjects) {
198+
if (!task.equals(catProj)) {
199+
if (isBlockingProjectBuilding(catProj)) {
200+
return true;
201+
}
202+
}
203+
}
204+
return false;
205+
}
206+
207+
private boolean isBlockingProjectBuilding(AbstractProject<?, ?> catProj) {
208+
ThrottleJobProperty catProjThrottleProperty = catProj.getProperty(ThrottleJobProperty.class);
209+
if (!catProjThrottleProperty.isBlockedByCategory()) {
210+
if (catProj.isBuilding() || catProj.isInQueue()) {
211+
return true;
212+
}
213+
}
214+
return false;
215+
}
216+
181217
@CheckForNull
182218
private ThrottleJobProperty getThrottleJobProperty(Task task) {
183219
if (task instanceof AbstractProject) {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
ThrottleQueueTaskDispatcher.MaxCapacityOnNode=Already running {0} builds on node
22
ThrottleQueueTaskDispatcher.MaxCapacityTotal=Already running {0} builds across all nodes
33
ThrottleQueueTaskDispatcher.BuildPending=A build is pending launch
4+
ThrottleQueueTaskDispatcher.BlockedByCategory=Build is blocked by other jobs in category {0}
45

56
ThrottleMatrixProjectOptions.DisplayName=Additional options for Matrix projects

src/main/resources/hudson/plugins/throttleconcurrents/ThrottleJobProperty/config.jelly

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
<st:nbsp/>
2929
</j:forEach>
3030
</f:entry>
31+
<f:entry title="${%Let this Job be blocked by selected Categories}">
32+
<f:checkbox name="blockedByCategory" checked="${instance.blockedByCategory}" />
33+
</f:entry>
3134
</j:if>
3235
<!--Specific options for Matrix projects-->
3336
<j:if test="${descriptor.isMatrixProject(it)}">

src/test/java/hudson/plugins/throttleconcurrents/ThrottleJobPropertyTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ public void testGetCategoryProjects() throws Exception {
2121
String alpha = "alpha", beta = "beta", gamma = "gamma"; // category names
2222
FreeStyleProject p1 = createFreeStyleProject("p1");
2323
FreeStyleProject p2 = createFreeStyleProject("p2");
24-
p2.addProperty(new ThrottleJobProperty(1, 1, Arrays.asList(alpha), false, THROTTLE_OPTION_CATEGORY, ThrottleMatrixProjectOptions.DEFAULT));
24+
p2.addProperty(new ThrottleJobProperty(1, 1, Arrays.asList(alpha), false, THROTTLE_OPTION_CATEGORY, ThrottleMatrixProjectOptions.DEFAULT, false));
2525
FreeStyleProject p3 = createFreeStyleProject("p3");
26-
p3.addProperty(new ThrottleJobProperty(1, 1, Arrays.asList(alpha, beta), true, THROTTLE_OPTION_CATEGORY, ThrottleMatrixProjectOptions.DEFAULT));
26+
p3.addProperty(new ThrottleJobProperty(1, 1, Arrays.asList(alpha, beta), true, THROTTLE_OPTION_CATEGORY, ThrottleMatrixProjectOptions.DEFAULT, false));
2727
FreeStyleProject p4 = createFreeStyleProject("p4");
28-
p4.addProperty(new ThrottleJobProperty(1, 1, Arrays.asList(beta, gamma), true, THROTTLE_OPTION_CATEGORY, ThrottleMatrixProjectOptions.DEFAULT));
28+
p4.addProperty(new ThrottleJobProperty(1, 1, Arrays.asList(beta, gamma), true, THROTTLE_OPTION_CATEGORY, ThrottleMatrixProjectOptions.DEFAULT, false));
2929
// TODO when core dep ≥1.480.3, add cloudbees-folder as a test dependency so we can check jobs inside folders
3030
assertProjects(alpha, p3);
3131
assertProjects(beta, p3, p4);

0 commit comments

Comments
 (0)