From bcd1f20a5a5670582529fa43a3bf5bba41ebecd1 Mon Sep 17 00:00:00 2001 From: Josh Ghiloni Date: Wed, 29 May 2019 08:38:49 -0600 Subject: [PATCH] Add support for Concourse 5.x in_parallel step Resolves #300. Because `in_parallel` is a drop-in replacement for `aggregate`, the code has been designed to mimic `aggregate` exactly. --- .../vscode/concourse/PipelineYmlSchema.java | 3 ++ .../desc/InParallelStep/in_parallel.html | 19 ++++++++++ .../vscode/concourse/ConcourseEditorTest.java | 38 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 headless-services/concourse-language-server/src/main/resources/desc/InParallelStep/in_parallel.html 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 aa06baa3d..984eeede1 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 @@ -361,17 +361,20 @@ public class PipelineYmlSchema implements YamlSchema { YBeanType aggregateStep = f.ybean("AggregateStep"); YBeanType doStep = f.ybean("DoStep"); YBeanType tryStep = f.ybean("TryStep"); + YBeanType inParallelStep = f.ybean("InParallelStep"); YBeanType[] stepTypes = { getStep, putStep, taskStep, aggregateStep, + inParallelStep, doStep, tryStep }; YBeanUnionType step = f.yBeanUnion("Step", stepTypes); addProp(aggregateStep, "aggregate", f.yseq(step)); + addProp(inParallelStep, "in_parallel", f.yseq(step)); addProp(doStep, "do", f.yseq(step)); addProp(tryStep, "try", step); diff --git a/headless-services/concourse-language-server/src/main/resources/desc/InParallelStep/in_parallel.html b/headless-services/concourse-language-server/src/main/resources/desc/InParallelStep/in_parallel.html new file mode 100644 index 000000000..3bb213052 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/InParallelStep/in_parallel.html @@ -0,0 +1,19 @@ +

Performs the given steps in parallel.

If any sub-steps in an in_parallel result in an error, the in_parallel step as a +whole is considered to have errored.

Similarly, when aggregating task steps, if any +fail, the in_parallel step will fail. This is useful for build matrixes:

plan:
+- get: some-repo
+- in_parallel:
+  - task: unit-windows
+    file: some-repo/ci/windows.yml
+  - task: unit-linux
+    file: some-repo/ci/linux.yml
+  - task: unit-darwin
+    file: some-repo/ci/darwin.yml

The in_parallel step is also useful for performing arbitrary steps in +parallel, for the sake of speeding up the build. It is often used to fetch +all dependent resources together:

plan:
+- in_parallel:
+  - get: component-a
+  - get: component-b
+  - get: integration-suite
+- task: integration
+  file: integration-suite/task.yml
\ 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 893865e84..1220b7759 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 @@ -313,6 +313,9 @@ public class ConcourseEditorTest { , // ============== "get: <*>" , // ============== + "in_parallel:\n" + + " - <*>" + , // ============== "put: <*>" , // ============== "task: <*>" @@ -349,6 +352,8 @@ public class ConcourseEditorTest { " - do: []\n" + " - aggregate:\n" + " - task: perform-something\n" + + " - in_parallel:\n" + + " - task: perform-something\n" + " - try:\n" + " put: test-logs\n" ); @@ -356,6 +361,7 @@ public class ConcourseEditorTest { editor.assertHoverContains("get", "Fetches a resource"); editor.assertHoverContains("put", "Pushes to the given [Resource]"); editor.assertHoverContains("aggregate", "Performs the given steps in parallel"); + editor.assertHoverContains("in_parallel", "Performs the given steps in parallel"); editor.assertHoverContains("task", "Executes a [Task]"); editor.assertHoverContains("do", "performs the given steps serially"); editor.assertHoverContains("try", "Performs the given step, swallowing any failure"); @@ -500,6 +506,21 @@ public class ConcourseEditorTest { editor.assertHoverContains("aggregate", "Performs the given steps in parallel"); } + @Test + public void inParallelStepHovers() throws Exception { + Editor editor; + + editor = harness.newEditor( + "jobs:\n" + + "- name: some-job\n" + + " plan:\n" + + " - in_parallel:\n" + + " - get: some-resource\n" + ); + + editor.assertHoverContains("in_parallel", "Performs the given steps in parallel"); + } + @Test public void reconcileSimpleTypes() throws Exception { Editor editor; @@ -3714,6 +3735,7 @@ public class ConcourseEditorTest { "- aggregate", "- do", "- get", + "- in_parallel", "- put", "- task", "- try", @@ -4143,6 +4165,22 @@ public class ConcourseEditorTest { " - aggregate:\n" + " - <*>" ); + + editor = harness.newEditor( + "jobs:\n" + + "- name: build-docker-image\n" + + " serial: true\n" + + " plan:\n" + + " in_" + ); + editor.assertCompletionWithLabel("- in_parallel", + "jobs:\n" + + "- name: build-docker-image\n" + + " serial: true\n" + + " plan:\n" + + " - in_parallel:\n" + + " - <*>" + ); } @Test public void relaxedContentAssist_primary_properties() throws Exception{