Skip to content

Commit fcc0e63

Browse files
authored
Merge pull request #164 from garethjevans/record-failure
fix: record failure if pipelinerun fails to start
2 parents e10e377 + c7568d3 commit fcc0e63

4 files changed

Lines changed: 147 additions & 18 deletions

File tree

src/main/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/CreateRaw.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import hudson.tasks.Builder;
2323
import hudson.util.FormValidation;
2424
import hudson.util.ListBoxModel;
25+
import io.fabric8.knative.internal.pkg.apis.Condition;
2526
import io.fabric8.kubernetes.client.KubernetesClient;
2627
import io.fabric8.tekton.client.TektonClient;
2728
import io.fabric8.tekton.pipeline.v1beta1.ArrayOrString;
@@ -271,6 +272,20 @@ public String createPipelineRun(InputStream inputStream, EnvVars envVars) throws
271272

272273
streamPipelineRunLogsToConsole(updatedPipelineRun);
273274

275+
PipelineRun reloaded = pipelineRunClient.withName(resourceName).get();
276+
List<Condition> conditions = reloaded
277+
.getStatus()
278+
.getConditions();
279+
Optional<Condition> succeeded = conditions
280+
.stream()
281+
.filter(c -> c.getType().equalsIgnoreCase("Succeeded"))
282+
.findFirst();
283+
284+
if (succeeded.isPresent() && succeeded.get().getStatus().equalsIgnoreCase("false")) {
285+
// pass the error message
286+
throw new Exception(succeeded.get().getReason() + ": " + succeeded.get().getMessage());
287+
}
288+
274289
return resourceName;
275290
}
276291

src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/CreateRawMockServerTest.java

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.waveywaves.jenkins.plugins.tekton.client.build.create;
22

33
import hudson.EnvVars;
4+
import io.fabric8.knative.internal.pkg.apis.Condition;
5+
import io.fabric8.kubernetes.api.model.ConditionBuilder;
46
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;
57
import io.fabric8.kubernetes.client.KubernetesClient;
68

@@ -214,7 +216,10 @@ public void testPipelineRunCreate() {
214216
.endMetadata()
215217
.withNewSpec()
216218
.withParams(new Param("param", new ArrayOrString("value")))
217-
.endSpec();
219+
.endSpec()
220+
.withNewStatus()
221+
.withConditions(new Condition("lastTransitionTime","","","","True","Succeeded"))
222+
.endStatus();
218223

219224
PipelineRunList pipelineRunList = new PipelineRunListBuilder()
220225
.addToItems(pipelineRunBuilder.build())
@@ -224,6 +229,8 @@ public void testPipelineRunCreate() {
224229
.andReturn(HttpURLConnection.HTTP_CREATED, pipelineRunBuilder.build()).once();
225230
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelines")
226231
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunList).once();
232+
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelines/testPipelineRun")
233+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
227234

228235
// When
229236
CreateRaw createRaw = new CreateRaw(testPipelineRunYaml, CreateRaw.InputType.YAML.toString()) {
@@ -255,4 +262,70 @@ public void streamPipelineRunLogsToConsole(PipelineRun pipelineRun) {
255262
assertThat(createdPipelineName, is("testPipelineRun"));
256263
assertThat(testPipelineRunList.getItems().size(), is(1));
257264
}
265+
266+
@Test
267+
public void testPipelineRunCreateWithFailingPod() {
268+
// Given
269+
String testPipelineRunYaml = "apiVersion: tekton.dev/v1beta1\n" +
270+
"kind: PipelineRun\n" +
271+
"metadata:\n" +
272+
" name: testPipelineRun\n" +
273+
"spec:\n" +
274+
" params: []\n";
275+
276+
KubernetesClient client = server.getClient();
277+
InputStream crdAsInputStream = getClass().getResourceAsStream("/pipeline-crd.yaml");
278+
CustomResourceDefinition pipelineRunCrd = client.apiextensions().v1beta1().customResourceDefinitions().load(crdAsInputStream).get();
279+
MixedOperation<PipelineRun, PipelineRunList, Resource<PipelineRun>> pipelineRunClient = client
280+
.customResources(CustomResourceDefinitionContext.fromCrd(pipelineRunCrd), PipelineRun.class, PipelineRunList.class);
281+
282+
// Mocked Responses
283+
PipelineRunBuilder pipelineRunBuilder = new PipelineRunBuilder()
284+
.withNewMetadata()
285+
.withName("testPipelineRun")
286+
.endMetadata()
287+
.withNewSpec()
288+
.withParams(new Param("param", new ArrayOrString("value")))
289+
.endSpec()
290+
.withNewStatus()
291+
.withConditions(new Condition("lastTransitionTime","This is an error message","ParameterMissing","","False","Succeeded"))
292+
.endStatus();
293+
294+
PipelineRunList pipelineRunList = new PipelineRunListBuilder()
295+
.addToItems(pipelineRunBuilder.build())
296+
.build();
297+
298+
server.expect().post().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelines")
299+
.andReturn(HttpURLConnection.HTTP_CREATED, pipelineRunBuilder.build()).once();
300+
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelines")
301+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunList).once();
302+
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelines/testPipelineRun")
303+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
304+
305+
// When
306+
CreateRaw createRaw = new CreateRaw(testPipelineRunYaml, CreateRaw.InputType.YAML.toString()) {
307+
@Override
308+
public void streamPipelineRunLogsToConsole(PipelineRun pipelineRun) {
309+
return;
310+
}
311+
};
312+
313+
createRaw.setNamespace(namespace);
314+
createRaw.setClusterName(TektonUtils.DEFAULT_CLIENT_KEY);
315+
createRaw.setEnableCatalog(enableCatalog);
316+
createRaw.setTektonClient(client);
317+
createRaw.setPipelineRunClient(pipelineRunClient);
318+
319+
createRaw.setChecksPublisher(checksPublisher);
320+
321+
try {
322+
createRaw.createPipelineRun(
323+
new ByteArrayInputStream(testPipelineRunYaml.getBytes(StandardCharsets.UTF_8)), new EnvVars());
324+
fail("Expected this to fail");
325+
} catch (Exception e) {
326+
assertThat(e.getMessage(), is("ParameterMissing: This is an error message"));
327+
}
328+
329+
assertThat(checksPublisher.getCounter(), is(1));
330+
}
258331
}

src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/create/JenkinsTest.java

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import hudson.model.FreeStyleBuild;
44
import hudson.model.FreeStyleProject;
55
import hudson.model.Result;
6+
import io.fabric8.knative.internal.pkg.apis.Condition;
67
import io.fabric8.kubernetes.api.model.ContainerBuilder;
78
import io.fabric8.kubernetes.api.model.ContainerStateBuilder;
89
import io.fabric8.kubernetes.api.model.ContainerStateTerminatedBuilder;
@@ -64,7 +65,9 @@ public void before() {
6465
@Test
6566
public void testScriptedPipeline() throws Exception {
6667
TaskBuilder taskBuilder = new TaskBuilder()
67-
.withNewMetadata().withName("testTask").endMetadata();
68+
.withNewMetadata()
69+
.withName("testTask")
70+
.endMetadata();
6871

6972
kubernetesRule.expect()
7073
.post()
@@ -95,7 +98,9 @@ public void testScriptedPipeline() throws Exception {
9598
@Test
9699
public void testDeclarativePipelineWithFileInput() throws Exception {
97100
TaskBuilder taskBuilder = new TaskBuilder()
98-
.withNewMetadata().withName("testTask").endMetadata();
101+
.withNewMetadata()
102+
.withName("testTask")
103+
.endMetadata();
99104

100105
kubernetesRule.expect()
101106
.post()
@@ -133,7 +138,9 @@ public void testDeclarativePipelineWithFileInput() throws Exception {
133138
@Test
134139
public void testDeclarativePipelineWithYamlInput() throws Exception {
135140
TaskBuilder taskBuilder = new TaskBuilder()
136-
.withNewMetadata().withName("testTask").endMetadata();
141+
.withNewMetadata()
142+
.withName("testTask")
143+
.endMetadata();
137144

138145
kubernetesRule.expect()
139146
.post()
@@ -175,7 +182,9 @@ public void testDeclarativePipelineWithYamlInput() throws Exception {
175182
@Test
176183
public void testFreestyleJobWithFileInput() throws Exception {
177184
TaskBuilder taskBuilder = new TaskBuilder()
178-
.withNewMetadata().withName("testTask").endMetadata();
185+
.withNewMetadata()
186+
.withName("testTask")
187+
.endMetadata();
179188

180189
kubernetesRule.expect()
181190
.post()
@@ -202,7 +211,9 @@ public void testFreestyleJobWithFileInput() throws Exception {
202211
@Test
203212
public void testFreestyleJobWithYamlInput() throws Exception {
204213
TaskBuilder taskBuilder = new TaskBuilder()
205-
.withNewMetadata().withName("testTask").endMetadata();
214+
.withNewMetadata()
215+
.withName("testTask")
216+
.endMetadata();
206217

207218
kubernetesRule.expect()
208219
.post()
@@ -245,14 +256,23 @@ public void testFreestyleJobWithComplexYamlInput() throws Exception {
245256
.withName("pipelineTaskName")
246257
.endTask()
247258
.endPipelineSpec()
248-
.endSpec();
259+
.endSpec()
260+
.withNewStatus()
261+
.withConditions(new Condition("lastTransitionTime","","","","True","Succeeded"))
262+
.endStatus();
249263

250264
kubernetesRule.expect()
251265
.post()
252266
.withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns")
253267
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build())
254268
.once();
255269

270+
kubernetesRule.expect()
271+
.get()
272+
.withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns/release")
273+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build())
274+
.once();
275+
256276
TaskRunList taskRunList = new TaskRunListBuilder()
257277
.addToItems(
258278
new TaskRunBuilder()
@@ -326,7 +346,7 @@ public void testFreestyleJobWithComplexYamlInput() throws Exception {
326346
assertThat(log, containsString("Legacy code started this job"));
327347
assertThat(log, containsString("Whoop! This is the pod log"));
328348

329-
assertThat(kubernetesRule.getMockServer().getRequestCount(), is(8));
349+
assertThat(kubernetesRule.getMockServer().getRequestCount(), is(9));
330350
}
331351

332352
@Test
@@ -345,14 +365,23 @@ public void testFreestyleJobWithExpandedYamlInput() throws Exception {
345365
.withName("pipelineTaskName")
346366
.endTask()
347367
.endPipelineSpec()
348-
.endSpec();
368+
.endSpec()
369+
.withNewStatus()
370+
.withConditions(new Condition("lastTransitionTime","","","","True","Succeeded"))
371+
.endStatus();
349372

350373
kubernetesRule.expect()
351374
.post()
352375
.withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns")
353376
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build())
354377
.once();
355378

379+
kubernetesRule.expect()
380+
.get()
381+
.withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns/release")
382+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build())
383+
.once();
384+
356385
TaskRunList taskRunList = new TaskRunListBuilder()
357386
.addToItems(
358387
new TaskRunBuilder()
@@ -371,9 +400,9 @@ public void testFreestyleJobWithExpandedYamlInput() throws Exception {
371400

372401
Pod pod = new PodBuilder()
373402
.withNewMetadata()
374-
.withName("hello-world-pod")
375-
.withNamespace("test")
376-
.withOwnerReferences(ownerReference("TaskRun","testTaskRun"))
403+
.withName("hello-world-pod")
404+
.withNamespace("test")
405+
.withOwnerReferences(ownerReference("TaskRun","testTaskRun"))
377406
.endMetadata()
378407
.withNewSpec()
379408
.withContainers(
@@ -426,7 +455,7 @@ public void testFreestyleJobWithExpandedYamlInput() throws Exception {
426455
assertThat(log, containsString("Legacy code started this job"));
427456
assertThat(log, containsString("Whoop! This is the pod log"));
428457

429-
assertThat(kubernetesRule.getMockServer().getRequestCount(), is(8));
458+
assertThat(kubernetesRule.getMockServer().getRequestCount(), is(9));
430459
}
431460

432461
private String contents(String filename) throws IOException {

src/test/java/org/waveywaves/jenkins/plugins/tekton/client/build/delete/DeleteRawMockServerTest.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.waveywaves.jenkins.plugins.tekton.client.build.delete;
22

33
import hudson.EnvVars;
4+
import io.fabric8.knative.internal.pkg.apis.Condition;
45
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;
56
import io.fabric8.kubernetes.client.KubernetesClient;
67
import io.fabric8.kubernetes.client.dsl.MixedOperation;
@@ -33,8 +34,6 @@
3334
import java.io.InputStream;
3435
import java.net.HttpURLConnection;
3536
import java.nio.charset.StandardCharsets;
36-
import java.util.ArrayList;
37-
import java.util.List;
3837

3938
import static org.assertj.core.api.Assertions.fail;
4039
import static org.hamcrest.CoreMatchers.is;
@@ -525,7 +524,11 @@ public void testPipelineRunDelete() {
525524
PipelineRunBuilder pipelineRunBuilder = new PipelineRunBuilder()
526525
.withNewMetadata()
527526
.withName(TEST_PIPELINERUN)
528-
.endMetadata();
527+
.endMetadata()
528+
.withNewStatus()
529+
.withConditions(new Condition("lastTransitionTime","","","","True","Succeeded"))
530+
.endStatus();
531+
529532
PipelineRunList pipelineRunList = new PipelineRunListBuilder()
530533
.addToItems(pipelineRunBuilder.build())
531534
.build();
@@ -538,6 +541,8 @@ public void testPipelineRunDelete() {
538541
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
539542
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns")
540543
.andReturn(HttpURLConnection.HTTP_OK, new PipelineRunList()).once();
544+
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns/"+TEST_PIPELINERUN)
545+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
541546

542547
// When
543548
CreateRaw createRaw = new CreateRaw(CreateRaw.InputType.YAML.toString(), testPipelineRunYaml){
@@ -601,8 +606,11 @@ public void testPipelineRunDeleteAll() {
601606
// Mocked Responses
602607
PipelineRunBuilder pipelineRunBuilder = new PipelineRunBuilder()
603608
.withNewMetadata()
604-
.withName(TEST_PIPELINERUN1)
605-
.endMetadata();
609+
.withName(TEST_PIPELINERUN1)
610+
.endMetadata()
611+
.withNewStatus()
612+
.withConditions(new Condition("lastTransitionTime","","","","True","Succeeded"))
613+
.endStatus();
606614
PipelineRunList pipelineRunList = new PipelineRunListBuilder()
607615
.addToItems(pipelineRunBuilder.build())
608616
.build();
@@ -615,6 +623,10 @@ public void testPipelineRunDeleteAll() {
615623
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
616624
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns")
617625
.andReturn(HttpURLConnection.HTTP_OK, new PipelineRunList()).once();
626+
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns/"+TEST_PIPELINERUN1)
627+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
628+
server.expect().get().withPath("/apis/tekton.dev/v1beta1/namespaces/test/pipelineruns/"+TEST_PIPELINERUN2)
629+
.andReturn(HttpURLConnection.HTTP_OK, pipelineRunBuilder.build()).once();
618630

619631
// PipelineRun 2
620632
pipelineRunBuilder = new PipelineRunBuilder()

0 commit comments

Comments
 (0)