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{