diff --git a/src/Containers/Microsoft.NET.Build.Containers/Tasks/ComputeDotnetBaseImageAndTag.cs b/src/Containers/Microsoft.NET.Build.Containers/Tasks/ComputeDotnetBaseImageAndTag.cs index 92cd3f5a5c85..69ced08eae1e 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Tasks/ComputeDotnetBaseImageAndTag.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Tasks/ComputeDotnetBaseImageAndTag.cs @@ -130,7 +130,7 @@ private bool TargetRuntimeIdentiriersAreValid() { if (muslRidsCount == TargetRuntimeIdentifiers.Length) { - IsMuslRid = true; + IsMuslRid = true; } else { @@ -191,7 +191,7 @@ private bool ComputeRepositoryAndTag([NotNullWhen(true)] out string? repository, && !UsesInvariantGlobalization && versionAllowsUsingAOTAndExtrasImages // the extras only became available on the stable tags of the FirstVersionWithNewTaggingScheme - && (!parsedVersion.IsPrerelease && parsedVersion.Major == FirstVersionWithNewTaggingScheme)) + && (!parsedVersion.IsPrerelease && parsedVersion.Major >= FirstVersionWithNewTaggingScheme)) { Log.LogMessage("Using extra variant because the application needs globalization"); tag += "-extra"; diff --git a/test/Microsoft.NET.Build.Containers.IntegrationTests/TargetsTests.cs b/test/Microsoft.NET.Build.Containers.IntegrationTests/TargetsTests.cs index d0cb12539451..e2f88f362aaa 100644 --- a/test/Microsoft.NET.Build.Containers.IntegrationTests/TargetsTests.cs +++ b/test/Microsoft.NET.Build.Containers.IntegrationTests/TargetsTests.cs @@ -26,7 +26,7 @@ public void CanDeferContainerAppCommand( }, projectName: $"{nameof(CanDeferContainerAppCommand)}_{prop}_{value}_{string.Join("_", expectedAppCommandArgs)}"); using var _ = d; var instance = project.CreateProjectInstance(ProjectInstanceSettings.None); - instance.Build([ ComputeContainerConfig ], []); + instance.Build([ComputeContainerConfig], []); var computedAppCommand = instance.GetItems(ContainerAppCommand).Select(i => i.EvaluatedInclude); // The test was not testing anything previously, as the list returned was zero length, @@ -614,6 +614,49 @@ public void AOTAppsLessThan8WithCulturesDoNotGetExtraImages(string rid, string e computedBaseImageTag.Should().BeEquivalentTo(expectedImage); } + [InlineData("9.0.100", "v9.0", "noble-chiseled", "mcr.microsoft.com/dotnet/runtime:9.0-noble-chiseled-extra")] + [InlineData("10.0.100", "v10.0", "noble-chiseled", "mcr.microsoft.com/dotnet/runtime:10.0-noble-chiseled-extra")] + [Theory] + public void FDDConsoleAppWithCulturesAndOptingIntoChiseledGetsExtrasForNet9AndLater(string sdkVersion, string tfm, string containerFamily, string expectedImage) + { + var (project, logger, d) = ProjectInitializer.InitProject(new() + { + ["NetCoreSdkVersion"] = sdkVersion, + ["TargetFrameworkVersion"] = tfm, + [KnownStrings.Properties.ContainerRuntimeIdentifier] = "linux-x64", + [KnownStrings.Properties.ContainerFamily] = containerFamily, + [KnownStrings.Properties.InvariantGlobalization] = false.ToString(), + }, projectName: $"{nameof(FDDConsoleAppWithCulturesAndOptingIntoChiseledGetsExtrasForNet9AndLater)}_{sdkVersion}_{tfm}_{containerFamily}"); + using var _ = d; + var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None); + instance.Build(new[] { ComputeContainerBaseImage }, null, null, out var outputs).Should().BeTrue(String.Join(Environment.NewLine, logger.Errors)); + var computedBaseImageTag = instance.GetProperty(ContainerBaseImage)?.EvaluatedValue; + computedBaseImageTag.Should().BeEquivalentTo(expectedImage); + } + + [InlineData("9.0.100", "v9.0", "noble-chiseled", "mcr.microsoft.com/dotnet/aspnet:9.0-noble-chiseled-extra")] + [InlineData("10.0.100", "v10.0", "noble-chiseled", "mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled-extra")] + [Theory] + public void FDDAspNetAppWithCulturesAndOptingIntoChiseledGetsExtrasForNet9AndLater(string sdkVersion, string tfm, string containerFamily, string expectedImage) + { + var (project, logger, d) = ProjectInitializer.InitProject(new() + { + ["NetCoreSdkVersion"] = sdkVersion, + ["TargetFrameworkVersion"] = tfm, + [KnownStrings.Properties.ContainerRuntimeIdentifier] = "linux-x64", + [KnownStrings.Properties.ContainerFamily] = containerFamily, + [KnownStrings.Properties.InvariantGlobalization] = false.ToString(), + }, bonusItems: new() + { + [KnownStrings.Items.FrameworkReference] = KnownFrameworkReferences.WebApp + }, projectName: $"{nameof(FDDAspNetAppWithCulturesAndOptingIntoChiseledGetsExtrasForNet9AndLater)}_{sdkVersion}_{tfm}_{containerFamily}"); + using var _ = d; + var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None); + instance.Build(new[] { ComputeContainerBaseImage }, null, null, out var outputs).Should().BeTrue(String.Join(Environment.NewLine, logger.Errors)); + var computedBaseImageTag = instance.GetProperty(ContainerBaseImage)?.EvaluatedValue; + computedBaseImageTag.Should().BeEquivalentTo(expectedImage); + } + [Fact] public void AspNetFDDAppsGetAspNetBaseImage() {