Improve deploy pipeline step DX by introducing `skip` state
- Dominant language
- C#
- Stars
- 6.3k
- Forks
- 991
- Avg merge
- 2d 15h
- Merged PRs (30d)
- 196
Description
Today, when you run `aspire deploy` and your AppHost defines pipeline steps, each step can only be represented in one of two states: pass or fail.
Consider the following example output:
```bash
10:47:01 (pipeline-execution) → Starting pipeline-execution...
10:47:01 (process-parameters) → Starting process-parameters...
10:47:01 (process-parameters) ✓ process-parameters completed successfully
10:47:01 (deploy-prereq) → Starting deploy-prereq...
10:47:01 (build-prereq) → Starting build-prereq...
10:47:01 (build-prereq) ✓ build-prereq completed successfully
10:47:01 (deploy-prereq) i [INF] Initializing deployment for environment 'Development'
10:47:01 (deploy-prereq) i [INF] Setting default deploy tag 'aspire-deploy-20260317154701' for compute resource(s).
10:47:01 (deploy-prereq) ✓ deploy-prereq completed successfully
10:47:01 (build-python-player) → Starting build-python-player...
10:47:01 (build-node-player) → Starting build-node-player...
10:47:01 (build-frontend) → Starting build-frontend...
10:47:01 (validate-azure-login) → Starting validate-azure-login...
10:47:01 (build-csharp-player) → Starting build-csharp-player...
10:47:01 (build-python-player) i [INF] Building container image for resource python-player
10:47:01 (build-node-player) i [INF] Building container image for resource node-player
10:47:01 (build-csharp-player) i [INF] Building container image for resource csharp-player
10:47:01 (build-frontend) i [INF] Building container image for resource frontend
10:47:02 (build-frontend) i [INF] Building image: frontend
10:47:02 (build-node-player) i [INF] Building image: node-player
10:47:02 (build-csharp-player) i [INF] Building image: csharp-player
10:47:02 (build-python-player) i [INF] Building image: python-player
10:47:06 (validate-azure-login) ✓ Azure CLI authentication validated successfully
10:47:06 (create-provisioning-context) → Starting create-provisioning-context...
10:47:06 (fetch-tenant) → Starting fetch-tenant...
10:47:06 (fetch-tenant) → Fetching available tenants
10:47:06 (build-node-player) i [INF] docker buildx for node-player:b32c6d6f5f96786e2b821d96a705eb7a3bb2656a succeeded.
10:47:06 (build-node-player) i [INF] Building image for node-player completed
10:47:06 (build-node-player) ✓ build-node-player completed successfully
10:47:08 (build-csharp-player) ✗ [ERR] Step 'build-csharp-player' failed.
10:47:08 (build-csharp-player) ✗ Step 'build-csharp-player' failed: Command dotnet publish "D:\GitHub\rockPaperScissors\src\csharp\player.cs" --configuration Release /t:PublishContainer
/p:ContainerRepository="csharp-player" /p:ContainerImageTag="latest" /p:RuntimeIdentifier="linux-x64" /p:ContainerRuntimeIdentifier="linux-x64" returned non-zero exit code 1
10:47:08 (create-provisioning-context) ⚠ [WRN] Failed to enumerate available tenants. Falling back to manual input.
10:47:08 (fetch-tenant) ✓ Fetching available tenants (1.5s)
10:47:08 (create-provisioning-context) ✗ [ERR] Failed to retrieve Azure tenant information.
10:47:08 (create-provisioning-context) ✗ [ERR] Step 'create-provisioning-context' failed.
10:47:08 (create-provisioning-context) ✗ Step 'create-provisioning-context' failed: A task was canceled.
10:47:08 (build-python-player) ✗ [ERR] Failed to build container image from Dockerfile for python-player
10:47:08 (build-python-player) ✗ [ERR] Step 'build-python-player' failed.
10:47:08 (build-python-player) ✗ Step 'build-python-player' failed: A task was canceled.
10:47:08 (build-frontend) ✗ [ERR] Failed to build container image from Dockerfile for frontend
10:47:08 (build-frontend) ✗ [ERR] Step 'build-frontend' failed.
10:47:08 (build-frontend) ✗ Step 'build-frontend' failed: A task was canceled.
10:47:08 (pipeline-execution) ✗ [ERR] Multiple pipeline steps failed: create-provisioning-context, build-frontend, build-csharp-player, build-python-player (Step 'create-provisioning-context' failed: A task
was canceled.) (Step 'build-frontend' failed: A task was canceled.) (Step 'build-csharp-player' failed: Command dotnet publish "D:\GitHub\rockPaperScissors\src\csharp\player.cs" --configuration Release
/t:PublishContainer /p:ContainerRepository="csharp-player" /p:ContainerImageTag="latest" /p:RuntimeIdentifier="linux-x64" /p:ContainerRuntimeIdentifier="linux-x64" returned non-zero exit code 1) (Step
'build-python-player' failed: A task was canceled.)
10:47:08 (pipeline-execution) ✗ Failed
------------------------------------------------------------
✓ 6/11 steps succeeded • ✗ 5 failed • Total time: 7.56s
Steps Summary:
7.49s ✗ pipeline-execution
7.46s ✗ build-frontend
7.37s ✗ build-python-player
7.24s ✗ build-csharp-player
5.87s ✓ build-node-player
5.71s ✓ validate-azure-login
1.75s → fetch-tenant
1.55s ✗ create-provisioning-context
8.20ms ✓ deploy-prereq
1.42ms ✓ process-parameters
1.15ms ✓ build-prereq
✗ PIPELINE FAILED
For more details, add --log-level debug/trace to the command.
------------------------------------------------------------
```
This claims that 5 steps failed, when really 4 of them were skipped (early exit, task cancellation).
Here's the terminal rendering, see all that extra red, could be a grey or something for skipped:
I'm proposing that we introduce a new deploy step status: `skipped` and colorize skipped steps differently, as the red screams error. Perhaps we could use a skip (`↻` or `≫`) symbol too.
Contributor guide
Assessment
This issue has not been assessed yet.