diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java index 437d251d8..8e1a186c2 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java @@ -450,6 +450,7 @@ public class PipelineYmlSchema implements YamlSchema { addProp(step, subStep, "on_success", step); addProp(step, subStep, "on_failure", step); addProp(step, subStep, "on_abort", step); + addProp(step, subStep, "on_error", step); addProp(step, subStep, "ensure", step); addProp(step, subStep, "tags", t_strings); addProp(step, subStep, "timeout", t_duration); diff --git a/headless-services/concourse-language-server/src/main/resources/desc/Step/on_error.md b/headless-services/concourse-language-server/src/main/resources/desc/Step/on_error.md new file mode 100644 index 000000000..14deb4ac6 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/Step/on_error.md @@ -0,0 +1,17 @@ +A hook step to execute after the parent step if the parent step terminates abnormally +in any way other than those handled by the [on_abort](https://concourse-ci.org/on-abort-hook.html#schema.on_abort) +or [on_failure](https://concourse-ci.org/on-failure-hook.html#schema.on_failure). +This covers scenarios as broad as configuration mistakes, temporary network issues with the workers, +or running longer than a timeout. + +##Example: Send a notification + +``` +plan: +- do: + - get: ci + - task: unit + file: ci/unit.yml + on_error: + put: slack +``` \ No newline at end of file diff --git a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java index 075c0503e..63527a582 100644 --- a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java +++ b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java @@ -27,7 +27,6 @@ import java.util.stream.Collectors; import org.eclipse.lsp4j.CompletionItem; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.DiagnosticSeverity; -import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.InsertTextFormat; import org.junit.Before; import org.junit.Ignore; @@ -74,6 +73,39 @@ public class ConcourseEditorTest { serverInitializer.setMaxCompletions(100); } + @Test public void GH_737_support_on_error_in_steps() throws Exception { + //See: https://github.com/spring-projects/sts4/issues/737 + Editor editor = harness.newEditor( + "jobs:\n" + + "- name: myjob\n" + + " serial: false\n" + + " plan:\n" + + " - task: build-app\n" + + " params:\n" + + " STAGE: dev\n" + + " APP: app\n" + + " file: build.xml\n" + + " on_success:\n" + + " put: buildstatus\n" + + " params:\n" + + " context: build\n" + + " repo: src\n" + + " state: SUCCESSFUL\n" + + " on_error:\n" + + " put: buildstatus\n" + + " params:\n" + + " context: build\n" + + " repo: src\n" + + " state: FAILED" + ); + editor.assertProblems( + "buildstatus|does not exist", + "buildstatus|does not exist" + ); + + editor.assertHoverContains("on_error", "execute after the parent step if the parent step terminates abnormally"); + } + @Test public void GH_752_accross_step_modifier() throws Exception { //See: https://github.com/spring-projects/sts4/issues/752 //See: https://concourse-ci.org/across-step.html#schema.across @@ -4685,6 +4717,7 @@ public class ConcourseEditorTest { "→ image", "→ input_mapping", "→ on_abort", + "→ on_error", "→ on_failure", "→ on_success", "→ output_mapping",