diff --git a/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs b/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs index c786c3ff326..4cdb9d57e88 100644 --- a/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs +++ b/src/Aspire.Hosting/Pipelines/DistributedApplicationPipeline.cs @@ -36,7 +36,7 @@ public DistributedApplicationPipeline() _steps.Add(new PipelineStep { Name = WellKnownPipelineSteps.Deploy, - Action = _ => Task.CompletedTask, + Action = _ => Task.CompletedTask }); _steps.Add(new PipelineStep @@ -116,7 +116,8 @@ public DistributedApplicationPipeline() resource.Annotations.Add(new DeploymentImageTagCallbackAnnotation(_ => uniqueDeployTag)); } - } + }, + Tags = [WellKnownPipelineTags.ProvisionInfrastructure] }); // Add a default "build" step @@ -124,12 +125,14 @@ public DistributedApplicationPipeline() { Name = WellKnownPipelineSteps.Build, Action = _ => Task.CompletedTask, + Tags = [WellKnownPipelineTags.BuildCompute] }); _steps.Add(new PipelineStep { Name = WellKnownPipelineSteps.BuildPrereq, - Action = context => Task.CompletedTask + Action = context => Task.CompletedTask, + Tags = [WellKnownPipelineTags.BuildCompute] }); // Add a default "Publish" meta-step that all publish steps should be required by @@ -142,7 +145,7 @@ public DistributedApplicationPipeline() _steps.Add(new PipelineStep { Name = WellKnownPipelineSteps.PublishPrereq, - Action = _ => Task.CompletedTask, + Action = _ => Task.CompletedTask }); // Add diagnostic step for dependency graph analysis diff --git a/src/Aspire.Hosting/Pipelines/PipelineConfigurationContext.cs b/src/Aspire.Hosting/Pipelines/PipelineConfigurationContext.cs index 781e6d8d2de..be458f2bd68 100644 --- a/src/Aspire.Hosting/Pipelines/PipelineConfigurationContext.cs +++ b/src/Aspire.Hosting/Pipelines/PipelineConfigurationContext.cs @@ -45,7 +45,7 @@ public required IReadOnlyList Steps /// /// The tag to search for. /// A collection of steps that have the specified tag. - public IEnumerable GetSteps(string tag) + public IEnumerable GetStepsByTag(string tag) { ArgumentNullException.ThrowIfNull(tag); return Steps.Where(s => s.Tags.Contains(tag)); diff --git a/tests/Aspire.Hosting.Tests/Pipelines/DistributedApplicationPipelineTests.cs b/tests/Aspire.Hosting.Tests/Pipelines/DistributedApplicationPipelineTests.cs index dd8c1a89fcf..361248466f3 100644 --- a/tests/Aspire.Hosting.Tests/Pipelines/DistributedApplicationPipelineTests.cs +++ b/tests/Aspire.Hosting.Tests/Pipelines/DistributedApplicationPipelineTests.cs @@ -1566,7 +1566,7 @@ public async Task PipelineConfigurationContext_GetStepsByTag_ReturnsCorrectSteps pipeline.AddPipelineConfiguration((configContext) => { - foundSteps.AddRange(configContext.GetSteps("test-tag")); + foundSteps.AddRange(configContext.GetStepsByTag("test-tag")); return Task.CompletedTask; }); @@ -1768,6 +1768,47 @@ public void WellKnownPipelineTags_ConstantsAccessible() Assert.Equal("deploy-compute", WellKnownPipelineTags.DeployCompute); } + [Fact] + public async Task DefaultPipelineSteps_HaveCorrectTags() + { + // Arrange + using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish, step: null); + var pipeline = new DistributedApplicationPipeline(); + + var capturedSteps = new List(); + + pipeline.AddPipelineConfiguration((configContext) => + { + capturedSteps.AddRange(configContext.Steps); + return Task.CompletedTask; + }); + + var context = CreateDeployingContext(builder.Build()); + await pipeline.ExecuteAsync(context); + + // Act & Assert - Verify each default step has the correct tag + var deployStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.Deploy); + Assert.Empty(deployStep.Tags); + + var deployPrereqStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.DeployPrereq); + Assert.Contains(WellKnownPipelineTags.ProvisionInfrastructure, deployPrereqStep.Tags); + + var buildStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.Build); + Assert.Contains(WellKnownPipelineTags.BuildCompute, buildStep.Tags); + + var buildPrereqStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.BuildPrereq); + Assert.Contains(WellKnownPipelineTags.BuildCompute, buildPrereqStep.Tags); + + var publishStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.Publish); + Assert.Empty(publishStep.Tags); + + var publishPrereqStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.PublishPrereq); + Assert.Empty(publishPrereqStep.Tags); + + var diagnosticsStep = capturedSteps.Single(s => s.Name == WellKnownPipelineSteps.Diagnostics); + Assert.Empty(diagnosticsStep.Tags); + } + [Fact] public async Task ConfigurationCallback_CanCreateComplexDependencyRelationships() { @@ -1822,9 +1863,9 @@ public async Task ConfigurationCallback_CanCreateComplexDependencyRelationships( pipeline.AddPipelineConfiguration((configContext) => { - var provisionSteps = configContext.GetSteps(WellKnownPipelineTags.ProvisionInfrastructure).ToList(); - var buildSteps = configContext.GetSteps(WellKnownPipelineTags.BuildCompute).ToList(); - var deploySteps = configContext.GetSteps(WellKnownPipelineTags.DeployCompute).ToList(); + var provisionSteps = configContext.GetStepsByTag(WellKnownPipelineTags.ProvisionInfrastructure).ToList(); + var buildSteps = configContext.GetStepsByTag(WellKnownPipelineTags.BuildCompute).ToList(); + var deploySteps = configContext.GetStepsByTag(WellKnownPipelineTags.DeployCompute).ToList(); foreach (var buildStep in buildSteps) {