Skip to content

Commit 233bec7

Browse files
authored
Merge pull request #1137 from Vlatombe/invalid-image-gets-cancelled
2 parents e8c6b7b + 7bf3979 commit 233bec7

File tree

4 files changed

+45
-12
lines changed

4 files changed

+45
-12
lines changed

src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesLauncher.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.util.stream.Collectors;
4949
import jenkins.metrics.api.Metrics;
5050
import org.apache.commons.lang.StringUtils;
51+
import org.csanchez.jenkins.plugins.kubernetes.pod.retention.Reaper;
5152
import org.kohsuke.stapler.DataBoundConstructor;
5253

5354
import static java.util.logging.Level.FINE;
@@ -94,6 +95,8 @@ public synchronized void launch(SlaveComputer computer, TaskListener listener) {
9495
if (!(computer instanceof KubernetesComputer)) {
9596
throw new IllegalArgumentException("This Launcher can be used only with KubernetesComputer");
9697
}
98+
// Activate reaper if it never got activated.
99+
Reaper.getInstance().maybeActivate();
97100
KubernetesComputer kubernetesComputer = (KubernetesComputer) computer;
98101
computer.setAcceptingTasks(false);
99102
KubernetesSlave node = kubernetesComputer.getNode();

src/main/java/org/csanchez/jenkins/plugins/kubernetes/pod/retention/Reaper.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,13 @@ public static Reaper getInstance() {
9292

9393
@Override
9494
public void onOnline(Computer c, TaskListener listener) throws IOException, InterruptedException {
95-
if (c instanceof KubernetesComputer && activated.compareAndSet(false, true)) {
95+
if (c instanceof KubernetesComputer) {
96+
maybeActivate();
97+
}
98+
}
99+
100+
public void maybeActivate() {
101+
if (activated.compareAndSet(false, true)) {
96102
activate();
97103
}
98104
}
@@ -107,6 +113,10 @@ private void activate() {
107113
continue;
108114
}
109115
KubernetesSlave ks = (KubernetesSlave) n;
116+
if (ks.getLauncher().isLaunchSupported()) {
117+
// Being launched, don't touch it.
118+
continue;
119+
}
110120
String ns = ks.getNamespace();
111121
String name = ks.getPodName();
112122
try {
@@ -230,7 +240,7 @@ public void onEvent(@NonNull Action action, @NonNull KubernetesSlave node, @NonN
230240
LOGGER.info(() -> ns + "/" + name + " Container " + c.getName() + " was just terminated, so removing the corresponding Jenkins agent");
231241
runListener.getLogger().printf("%s/%s Container %s was terminated (Exit Code: %d, Reason: %s)%n", ns, name, c.getName(), t.getExitCode(), t.getReason());
232242
});
233-
node.terminate();
243+
logLastLinesThenTerminateNode(node, pod, runListener);
234244
}
235245
}
236246
}
@@ -248,20 +258,24 @@ public void onEvent(@NonNull Action action, @NonNull KubernetesSlave node, @NonN
248258
TaskListener runListener = node.getTemplate().getListener();
249259
LOGGER.info(() -> ns + "/" + name + " Pod just failed. Removing the corresponding Jenkins agent. Reason: " + pod.getStatus().getReason() + ", Message: " + pod.getStatus().getMessage());
250260
runListener.getLogger().printf("%s/%s Pod just failed (Reason: %s, Message: %s)%n", ns, name, pod.getStatus().getReason(), pod.getStatus().getMessage());
251-
try {
252-
String lines = PodUtils.logLastLines(pod, node.getKubernetesCloud().connect());
253-
if (lines != null) {
254-
runListener.getLogger().print(lines);
255-
}
256-
} catch (KubernetesAuthException e) {
257-
LOGGER.log(Level.FINE, e, () -> "Unable to get logs after pod failed event");
258-
} finally {
259-
node.terminate();
260-
}
261+
logLastLinesThenTerminateNode(node, pod, runListener);
261262
}
262263
}
263264
}
264265

266+
private static void logLastLinesThenTerminateNode(KubernetesSlave node, Pod pod, TaskListener runListener) throws IOException, InterruptedException {
267+
try {
268+
String lines = PodUtils.logLastLines(pod, node.getKubernetesCloud().connect());
269+
if (lines != null) {
270+
runListener.getLogger().print(lines);
271+
}
272+
} catch (KubernetesAuthException e) {
273+
LOGGER.log(Level.FINE, e, () -> "Unable to get logs after pod failed event");
274+
} finally {
275+
node.terminate();
276+
}
277+
}
278+
265279
@Extension
266280
public static class TerminateAgentOnImagePullBackOff implements Listener {
267281

src/test/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/KubernetesPipelineTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,12 @@ public void invalidPodGetsCancelled() throws Exception {
701701
r.assertLogContains("Queue task was cancelled", b);
702702
}
703703

704+
@Test
705+
public void invalidImageGetsCancelled() throws Exception {
706+
r.assertBuildStatus(Result.ABORTED, r.waitForCompletion(b));
707+
r.assertLogContains("Queue task was cancelled", b);
708+
}
709+
704710
@Issue("SECURITY-1646")
705711
@Test
706712
public void substituteEnv() throws Exception {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
podTemplate(yaml: '''
2+
spec:
3+
containers:
4+
- name: jnlp
5+
image: some/invalid
6+
''') {
7+
node(POD_LABEL) {
8+
sh 'false'
9+
}
10+
}

0 commit comments

Comments
 (0)