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.
This commit is contained in:
Josh Ghiloni
2019-05-29 08:38:49 -06:00
parent 5468e43963
commit bcd1f20a5a
3 changed files with 60 additions and 0 deletions

View File

@@ -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);

View File

@@ -0,0 +1,19 @@
<p>Performs the given steps in parallel.</p><p>If any sub-steps in an in_parallel result in an error, the in_parallel step as a
whole is considered to have errored.</p><p>Similarly, when aggregating <a href="task-step.html"><code>task</code></a> steps, if any
<em>fail</em>, the in_parallel step will fail. This is useful for build matrixes:</p><div class="highlight"><pre class="verbatim"><span class="t"></span><span class="t"></span><span class="t"></span><span class="nv"></span><span class="py">plan</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"></span><span class="t"></span><span class="t">
</span><span class="t"></span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">get</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">some-repo</span><span class="t">
</span><span class="t"></span><span class="t"></span><span class="t"></span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">in_parallel</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"></span><span class="t"></span><span class="t">
</span><span class="t"> </span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">task</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">unit-windows</span><span class="t">
</span><span class="t"> </span><span class="t"></span><span class="t"></span><span class="t"></span><span class="t"></span><span class="nv"></span><span class="py">file</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">some-repo/ci/windows.yml</span><span class="t">
</span><span class="t"> </span><span class="nv">-</span><span class="sp"> </span><span class="py">task</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">unit-linux</span><span class="t">
</span><span class="t"> </span><span class="py">file</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">some-repo/ci/linux.yml</span><span class="t">
</span><span class="t"> </span><span class="nv">-</span><span class="sp"> </span><span class="py">task</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">unit-darwin</span><span class="t">
</span><span class="t"> </span><span class="py">file</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">some-repo/ci/darwin.yml</span></pre></div><p>The <code>in_parallel</code> 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:</p><div class="highlight"><pre class="verbatim"><span class="t"></span><span class="t"></span><span class="t"></span><span class="nv"></span><span class="py">plan</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"></span><span class="t"></span><span class="t">
</span><span class="t"></span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">in_parallel</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"></span><span class="t"></span><span class="t">
</span><span class="t"> </span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">get</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">component-a</span><span class="t">
</span><span class="t"> </span><span class="t"></span><span class="t"></span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">get</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">component-b</span><span class="t">
</span><span class="t"> </span><span class="t"></span><span class="t"></span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">get</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">integration-suite</span><span class="t">
</span><span class="t"></span><span class="t"></span><span class="t"></span><span class="pi">-</span><span class="t"></span><span class="t"> </span><span class="t"></span><span class="nv"></span><span class="py">task</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">integration</span><span class="t">
</span><span class="t"> </span><span class="t"></span><span class="t"></span><span class="t"></span><span class="t"></span><span class="nv"></span><span class="py">file</span><span class="t"></span><span class="pi">:</span><span class="t"></span><span class="t"> </span><span class="nv"></span><span class="nv">integration-suite/task.yml</span></pre></div>

View File

@@ -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{