diff --git a/.vsts-ci.yml b/.vsts-ci.yml index d6421f73acc2..6ab58854063b 100644 --- a/.vsts-ci.yml +++ b/.vsts-ci.yml @@ -69,7 +69,7 @@ extends: centosStream9: image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9 debian12Amd64: - image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc14-amd64 + image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc15-amd64 fedora39: image: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-39 mariner20CrossArm: diff --git a/.vsts-pr.yml b/.vsts-pr.yml index 2478c07d6590..60d2d4f865f3 100644 --- a/.vsts-pr.yml +++ b/.vsts-pr.yml @@ -32,7 +32,7 @@ resources: - container: centosStream9 image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9 - container: debian12Amd64 - image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc14-amd64 + image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc15-amd64 - container: fedora39 image: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-39 - container: ubuntu2204DebPkg diff --git a/eng/pipelines/templates/jobs/sdk-job-matrix.yml b/eng/pipelines/templates/jobs/sdk-job-matrix.yml index 778441d1176a..0829e8f5bf94 100644 --- a/eng/pipelines/templates/jobs/sdk-job-matrix.yml +++ b/eng/pipelines/templates/jobs/sdk-job-matrix.yml @@ -32,9 +32,7 @@ parameters: container: ubuntu2204DebPkg helixTargetContainer: $(helixTargetContainerPrefix)ubuntu-22.04-helix-amd64 osProperties: $(linuxOsPortableProperties) - # Skipping all container-based testing for now. - # See: https://github.com/dotnet/sdk/issues/40935 - runTests: false + runTests: true - categoryName: ContainerBased container: fedora39 # No fedora Helix container is available, so use the ubuntu one instead. @@ -54,9 +52,7 @@ parameters: container: debian12Amd64 helixTargetContainer: $(helixTargetContainerPrefix)debian-11-helix-amd64 osProperties: /p:OSName=linux /p:BuildSdkDeb=true - # Skipping all container-based testing for now. - # See: https://github.com/dotnet/sdk/issues/40935 - runTests: false + runTests: true - categoryName: ContainerBased container: alpine319WithNode helixTargetContainer: $(helixTargetContainerPrefix)alpine-3.18-helix-amd64 diff --git a/test/Microsoft.NET.TestFramework/EnvironmentInfo.cs b/test/Microsoft.NET.TestFramework/EnvironmentInfo.cs index a1ef8b832be7..200292717175 100644 --- a/test/Microsoft.NET.TestFramework/EnvironmentInfo.cs +++ b/test/Microsoft.NET.TestFramework/EnvironmentInfo.cs @@ -101,6 +101,13 @@ public static bool SupportsTargetFramework(string targetFramework) return false; } } + else if (osId.Equals("debian", StringComparison.OrdinalIgnoreCase)) + { + if (nugetFramework.Version < new Version(2, 0, 0, 0)) + { + return false; + } + } else if (Version.TryParse(versionString, out Version? osVersion)) { if (osId.Equals("fedora", StringComparison.OrdinalIgnoreCase)) diff --git a/test/dotnet.Tests/CommandTests/Workload/Restore/GivenDotnetWorkloadRestore.cs b/test/dotnet.Tests/CommandTests/Workload/Restore/GivenDotnetWorkloadRestore.cs index eabc6de3b5cc..edefc3678acc 100644 --- a/test/dotnet.Tests/CommandTests/Workload/Restore/GivenDotnetWorkloadRestore.cs +++ b/test/dotnet.Tests/CommandTests/Workload/Restore/GivenDotnetWorkloadRestore.cs @@ -15,6 +15,12 @@ public GivenDotnetWorkloadRestore(ITestOutputHelper log) : base(log) [Fact] public void ProjectsThatDoNotSupportWorkloadsAreNotInspected() { + if(IsRunningInContainer()) + { + // Skipping test in a Helix container environment due to read-only DOTNET_ROOT, which causes workload restore to fail when writing workload metadata. + return; + } + var projectPath = _testAssetsManager .CopyTestAsset(DcProjAssetName) @@ -32,6 +38,12 @@ public void ProjectsThatDoNotSupportWorkloadsAreNotInspected() [Fact] public void ProjectsThatDoNotSupportWorkloadsAndAreTransitivelyReferencedDoNotBreakTheBuild() { + if(IsRunningInContainer()) + { + // Skipping test in a Helix container environment due to read-only DOTNET_ROOT, which causes workload restore to fail when writing workload metadata. + return; + } + var projectPath = _testAssetsManager .CopyTestAsset(TransitiveReferenceNoWorkloadsAssetName) @@ -45,4 +57,9 @@ public void ProjectsThatDoNotSupportWorkloadsAndAreTransitivelyReferencedDoNotBr // if we did try to restore the esproj in this TestAsset we would fail, so passing means we didn't! .Pass(); } + + private bool IsRunningInContainer() + { + return File.Exists("/.dockerenv") && (RuntimeInformation.OSDescription.Contains("Ubuntu") || RuntimeInformation.OSDescription.Contains("Debian")); + } } diff --git a/test/dotnet.Tests/CommandTests/Workload/Update/GivenDotnetWorkloadUpdate.cs b/test/dotnet.Tests/CommandTests/Workload/Update/GivenDotnetWorkloadUpdate.cs index 872365371f67..37e20984f26c 100644 --- a/test/dotnet.Tests/CommandTests/Workload/Update/GivenDotnetWorkloadUpdate.cs +++ b/test/dotnet.Tests/CommandTests/Workload/Update/GivenDotnetWorkloadUpdate.cs @@ -257,7 +257,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks(bool userLocal) }; Directory.CreateDirectory(Path.GetDirectoryName(installStatePath)); File.WriteAllText(installStatePath, oldInstallState.ToString()); - new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"])).Execute().Should().Be(0); + new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), workloadResolverFactory: workloadResolverFactory).Execute().Should().Be(0); updateCommand.Execute(); var newInstallState = InstallStateContents.FromPath(installStatePath); newInstallState.Manifests.Should().BeNull(); @@ -280,7 +280,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks(bool userLocal) public void GivenWorkloadUpdateItUpdatesOutOfDatePacks() { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; - (_, var command, var installer, _, _, _) = GetTestInstallers(_parseResult, installedWorkloads: mockWorkloadIds, installedFeatureBand: "6.0.100"); + (_, var command, var installer, _, _, _, _) = GetTestInstallers(_parseResult, installedWorkloads: mockWorkloadIds, installedFeatureBand: "6.0.100"); command.Execute(); @@ -405,7 +405,7 @@ public void GivenWorkloadUpdateItFindsGreatestWorkloadSetWithSpecifiedComponents public void GivenWorkloadUpdateItRollsBackOnFailedUpdate() { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android"), new WorkloadId("xamarin-android-build") }; - (_, var command, var installer, var workloadResolver, _, _) = GetTestInstallers(_parseResult, installedWorkloads: mockWorkloadIds, failingPack: "Xamarin.Android.Framework", installedFeatureBand: "6.0.100"); + (_, var command, var installer, var workloadResolver, _, _, _) = GetTestInstallers(_parseResult, installedWorkloads: mockWorkloadIds, failingPack: "Xamarin.Android.Framework", installedFeatureBand: "6.0.100"); var exceptionThrown = Assert.Throws(() => command.Execute()); @@ -425,7 +425,7 @@ public void GivenWorkloadUpdateItCanDownloadToOfflineCache() var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var cachePath = Path.Combine(_testAssetsManager.CreateTestDirectory(identifier: "cachePath").Path, "mockCachePath"); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--download-to-cache", cachePath }); - (_, var command, _, _, var manifestUpdater, var packageDownloader) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, includeInstalledPacks: true, installedFeatureBand: "6.0.100"); + (_, var command, _, _, var manifestUpdater, var packageDownloader, _) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, includeInstalledPacks: true, installedFeatureBand: "6.0.100"); command.Execute(); @@ -446,7 +446,7 @@ public void GivenWorkloadUpdateItCanInstallFromOfflineCache() var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var cachePath = "mockCachePath"; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--from-cache", cachePath }); - (_, var command, var installer, _, _, var nugetDownloader) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, installedFeatureBand: "6.0.100"); + (_, var command, var installer, _, _, var nugetDownloader, _) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, installedFeatureBand: "6.0.100"); command.Execute(); @@ -462,7 +462,7 @@ public void GivenWorkloadUpdateItPrintsDownloadUrls() { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--print-download-link-only" }); - (_, var command, _, _, _, _) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, includeInstalledPacks: true, installedFeatureBand: "6.0.100"); + (_, var command, _, _, _, _, _) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, includeInstalledPacks: true, installedFeatureBand: "6.0.100"); command.Execute(); @@ -476,7 +476,7 @@ public void GivenWorkloadUpdateItPrintsDownloadUrlsForNewFeatureBand() { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--print-download-link-only", "--sdk-version", "7.0.100" }); - (_, var command, _, _, _, _) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, includeInstalledPacks: true, sdkVersion: "6.0.400"); + (_, var command, _, _, _, _, _) = GetTestInstallers(parseResult, installedWorkloads: mockWorkloadIds, includeInstalledPacks: true, sdkVersion: "6.0.400"); command.Execute(); @@ -504,7 +504,7 @@ public void GivenWorkloadUpdateWithSdkVersionItErrors() public void GivenOnlyUpdateAdManifestItSucceeds() { var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--advertising-manifests-only" }); - (_, var command, _, _, var manifestUpdater, _) = GetTestInstallers(parseResult, installedFeatureBand: "6.0.100"); + (_, var command, _, _, var manifestUpdater, _, _) = GetTestInstallers(parseResult, installedFeatureBand: "6.0.100"); command.Execute(); manifestUpdater.UpdateAdvertisingManifestsCallCount.Should().Be(1); @@ -514,7 +514,7 @@ public void GivenOnlyUpdateAdManifestItSucceeds() public void GivenPrintRollbackDefinitionItIncludesAllInstalledManifests() { var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--print-rollback" }); - (_, var updateCommand, _, _, _, _) = GetTestInstallers(parseResult, installedFeatureBand: "6.0.100"); + (_, var updateCommand, _, _, _, _, _) = GetTestInstallers(parseResult, installedFeatureBand: "6.0.100"); updateCommand.Execute(); @@ -539,10 +539,10 @@ public void ApplyRollbackAcrossFeatureBand(string existingSdkFeatureBand, string { new(new ManifestVersionUpdate(new ManifestId("mock-manifest"), new ManifestVersion("2.0.0"), newSdkFeatureBand), null), }; - (var dotnetPath, var updateCommand, var packInstaller, _, _, _) = GetTestInstallers(parseResult, manifestUpdates: manifestsToUpdate, sdkVersion: "6.0.300", identifier: existingSdkFeatureBand + newSdkFeatureBand, installedFeatureBand: existingSdkFeatureBand); + (var dotnetPath, var updateCommand, var packInstaller, _, _, _, var resolverFactory) = GetTestInstallers(parseResult, manifestUpdates: manifestsToUpdate, sdkVersion: "6.0.300", identifier: existingSdkFeatureBand + newSdkFeatureBand, installedFeatureBand: existingSdkFeatureBand); parseResult = Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]); - WorkloadConfigCommand configCommand = new(parseResult); + WorkloadConfigCommand configCommand = new(parseResult, workloadResolverFactory: resolverFactory); configCommand.Execute().Should().Be(0); updateCommand.Execute() .Should().Be(0); @@ -571,7 +571,7 @@ public void ApplyRollbackWithMultipleManifestsAcrossFeatureBand() new(new ManifestVersionUpdate(new ManifestId("mock-manifest-2"), new ManifestVersion("2.0.0"), "6.0.300"), null), new(new ManifestVersionUpdate(new ManifestId("mock-manifest-3"), new ManifestVersion("2.0.0"), "6.0.100"), null), }; - (_, var updateCommand, var packInstaller, _, _, _) = GetTestInstallers(parseResult, manifestUpdates: manifestsToUpdate, sdkVersion: "6.0.300", installedFeatureBand: "6.0.300"); + (_, var updateCommand, var packInstaller, _, _, _, _) = GetTestInstallers(parseResult, manifestUpdates: manifestsToUpdate, sdkVersion: "6.0.300", installedFeatureBand: "6.0.300"); updateCommand.Execute() .Should().Be(0); @@ -614,7 +614,7 @@ public void GivenInvalidVersionInRollbackFileItErrors() exception.InnerException.Message.Should().Contain(string.Format(CliCommandStrings.InvalidVersionForWorkload, "mock.workload", "6.0.0.15")); } - internal (string, WorkloadUpdateCommand, MockPackWorkloadInstaller, IWorkloadResolver, MockWorkloadManifestUpdater, MockNuGetPackageDownloader) GetTestInstallers( + internal (string, WorkloadUpdateCommand, MockPackWorkloadInstaller, IWorkloadResolver, MockWorkloadManifestUpdater, MockNuGetPackageDownloader, IWorkloadResolverFactory) GetTestInstallers( ParseResult parseResult, [CallerMemberName] string testName = "", string failingWorkload = null, @@ -657,7 +657,7 @@ public void GivenInvalidVersionInRollbackFileItErrors() nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater); - return (dotnetRoot, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader); + return (dotnetRoot, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader, workloadResolverFactory); } } }