Skip to content

Commit ba615af

Browse files
docs(site): fix job/stage targets — dependsOn and condition must be parameters (#830)
1 parent 1238ab3 commit ba615af

1 file changed

Lines changed: 26 additions & 9 deletions

File tree

site/src/content/docs/reference/targets.mdx

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ The `target` field in the front matter determines the output format and executio
1212
### `standalone` (default)
1313

1414
Generates a self-contained Azure DevOps pipeline with:
15-
- Full 3-job pipeline: `Agent` -> `Detection` -> `SafeOutputs`
15+
- Full 3-job pipeline: `Agent` `Detection` `SafeOutputs`
1616
- AWF (Agentic Workflow Firewall) L7 domain whitelisting via Squid proxy + Docker
1717
- MCP Gateway (MCPG) for MCP routing with SafeOutputs HTTP backend
1818
- Setup/teardown job support
@@ -25,7 +25,7 @@ This is the recommended target for maximum flexibility and security controls.
2525
Generates a pipeline that extends the 1ES Unofficial Pipeline Template:
2626
- Uses `templateContext.type: buildJob` with Copilot CLI + AWF + MCPG (same execution model as standalone)
2727
- Integrates with 1ES SDL scanning and compliance tools
28-
- Full 3-job pipeline: Agent -> Detection -> SafeOutputs
28+
- Full 3-job pipeline: Agent Detection SafeOutputs
2929
- Requires 1ES Pipeline Templates repository access
3030

3131
Example:
@@ -38,14 +38,14 @@ When using `target: 1es`, the pipeline will extend `1es/1ES.Unofficial.PipelineT
3838
### `job`
3939

4040
Generates a **job-level ADO YAML template** with `jobs:` at root. This is a
41-
reusable template that can be included in an existing pipeline -- it does not
41+
reusable template that can be included in an existing pipeline it does not
4242
generate a complete pipeline.
4343

44-
The output contains the same 3-job chain (Agent -> Detection -> SafeOutputs) as
44+
The output contains the same 3-job chain (Agent Detection SafeOutputs) as
4545
`standalone`, with:
4646
- Job names prefixed with the agent name for uniqueness (e.g., `DailyReview_Agent`)
4747
- No triggers, pipeline name, or resource declarations (the parent pipeline owns those)
48-
- Pool baked in from the front matter `pool:` field
48+
- Pool baked in from the front matter `pool:` field (`vmImage` or `name`; defaults to `vmImage: ubuntu-22.04`)
4949

5050
Example front matter:
5151
```yaml
@@ -59,6 +59,9 @@ jobs:
5959
- job: Build
6060
steps: ...
6161
- template: agents/review.lock.yml
62+
parameters:
63+
dependsOn: [Build] # list of upstream job names; omit for implicit dep on previous job
64+
condition: succeeded('Build') # optional; ANDed into the agent job's internal condition
6265
```
6366

6467
#### Usage inside a user-defined stage
@@ -73,6 +76,12 @@ stages:
7376
- template: agents/review.lock.yml
7477
```
7578

79+
#### Notes
80+
81+
- ADO's [`jobs.template`](https://learn.microsoft.com/azure/devops/pipelines/yaml-schema/jobs-template) schema only allows `template:` and `parameters:` at the call site. `dependsOn:` and `condition:` as bare keys on the `- template:` line are rejected; the compiled template surfaces them as parameters and applies them to the agent job internally.
82+
- When the agent has a Setup job (e.g. PR or pipeline filters), the `dependsOn` parameter **must** be a YAML list — the template uses `${{ each }}` to merge `Setup` with the caller's deps, and `${{ each }}` requires an iterable. For agents without a Setup job, either a string or a list works.
83+
- The `condition` parameter is ANDed into the agent job's existing internal condition. Omit it to preserve ADO's native `succeeded()` behaviour.
84+
7685
### `stage`
7786

7887
Generates a **stage-level ADO YAML template** with `stages:` at root. This
@@ -91,12 +100,16 @@ stages:
91100
- stage: Build
92101
jobs: ...
93102
- template: agents/review.lock.yml
94-
dependsOn: Build
95-
condition: succeeded()
103+
parameters:
104+
dependsOn: Build # or [Build, Test]; omit for implicit dep on previous stage
105+
condition: succeeded('Build') # optional; omit for ADO's default succeeded()
96106
```
97107

98-
ADO natively supports `dependsOn` and `condition` at the template call site --
99-
no template parameters are needed for stage ordering.
108+
#### Notes
109+
110+
- ADO's [`stages.template`](https://learn.microsoft.com/azure/devops/pipelines/yaml-schema/stages-template) schema only allows `template:` and `parameters:` at the call site. `dependsOn:` and `condition:` as bare top-level keys on the `- template:` line are **rejected** by the YAML parser. The compiled template surfaces them as parameters and applies them to the inner stage block.
111+
- The `dependsOn` parameter accepts a single string or a list (matching ADO's native `dependsOn:` semantics).
112+
- Same 3-job chain, job-name prefixing, and pool handling as `target: job`.
100113

101114
---
102115

@@ -109,3 +122,7 @@ If your agent declares additional repositories via `repos:`, you must manually a
109122
</Aside>
110123

111124
Both `job` and `stage` targets produce templates with the same 3-job execution chain (Agent → Detection → SafeOutputs), job-name prefixing for uniqueness, and pool configuration baked in from the `pool:` front-matter field. The difference is only in the YAML wrapper: `jobs:` at root vs. `stages:` at root.
125+
126+
<Aside type="caution" title="dependsOn and condition must be parameters">
127+
ADO's template call-site schema only allows `template:` and `parameters:` as top-level keys on a `- template:` entry. Bare `dependsOn:` and `condition:` keys on the `- template:` line are rejected by ADO. Always pass them through `parameters:` as shown in the usage examples above.
128+
</Aside>

0 commit comments

Comments
 (0)