From 0b5e0e4fe97ff05d3602bc0f60ab3479dffb0e76 Mon Sep 17 00:00:00 2001 From: Michal Pavlik Date: Tue, 21 Nov 2023 14:17:59 +0100 Subject: [PATCH 1/6] Containers support was moved higher to enable creating image of CLI applications. --- src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets | 13 +++++++++++++ .../Publish/Targets/Microsoft.NET.Sdk.Publish.props | 3 --- .../Targets/Microsoft.NET.Sdk.Publish.targets | 13 ------------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets index 136d5d2cb673..511ae5a4cf7c 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets @@ -52,4 +52,17 @@ Copyright (c) .NET Foundation. All rights reserved. + + + + <_ContainersTargetsDir Condition=" '$(_ContainersTargetsDir)'=='' ">$(MSBuildThisFileDirectory)..\..\..\Containers\build\ + + + + + diff --git a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props index ac284f1689d5..862cdafc5d89 100644 --- a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props +++ b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.props @@ -15,7 +15,4 @@ Copyright (c) .NET Foundation. All rights reserved. true - - diff --git a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets index b7c1c1ac853b..c4d769c792cd 100644 --- a/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets +++ b/src/WebSdk/Publish/Targets/Microsoft.NET.Sdk.Publish.targets @@ -29,7 +29,6 @@ Copyright (C) Microsoft Corporation. All rights reserved. <_PublishTargetsDir Condition=" '$(_PublishTargetsDir)'=='' ">$(MSBuildThisFileDirectory)PublishTargets\ <_DotNetCLIToolTargetsDir Condition=" '$(_DotNetCLIToolTargetsDir)'=='' ">$(MSBuildThisFileDirectory)DotNetCLIToolTargets\ <_PublishProfilesDir Condition=" '$(_PublishProfilesDir)'=='' ">$(MSBuildThisFileDirectory)PublishProfiles\ - <_ContainersTargetsDir Condition=" '$(_ContainersTargetsDir)'=='' ">$(MSBuildThisFileDirectory)..\..\..\Containers\build\ - - - - + Condition="'$(IsPublishable)' == 'true' AND '$(EnableSdkContainerSupport)' == 'true'"> $(NetCoreRoot) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets index 511ae5a4cf7c..a506081a2017 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets @@ -59,10 +59,8 @@ Copyright (c) .NET Foundation. All rights reserved. + Condition="Exists('$(MSBuildThisFileDirectory)..\..\..\Containers\build\Microsoft.NET.Build.Containers.props')" /> + Condition="Exists('$(_ContainersTargetsDir)Microsoft.NET.Build.Containers.targets') AND '$(TargetFramework)' != ''" /> From fe076237ce48015656af1f6384efe77c22b28557 Mon Sep 17 00:00:00 2001 From: Michal Pavlik Date: Tue, 5 Dec 2023 16:28:06 +0100 Subject: [PATCH 3/6] Added end to end test --- .../EndToEndTests.cs | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index 0471455a9530..3fd9a1b15b4e 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -6,6 +6,8 @@ using Microsoft.NET.Build.Containers.LocalDaemons; using Microsoft.NET.Build.Containers.Resources; using Microsoft.NET.Build.Containers.UnitTests; +using Newtonsoft.Json.Linq; +using NuGet.ProjectModel; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace Microsoft.NET.Build.Containers.IntegrationTests; @@ -209,6 +211,90 @@ private string BuildLocalApp([CallerMemberName] string testName = "TestName", st return publishDirectory; } + // [DockerAvailableFact(Skip = "https://github.com/dotnet/sdk/issues/36160")] + [Fact] + public async Task EndToEnd_MultiProjectSolution() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(EndToEnd_MultiProjectSolution)); + DirectoryInfo newSolutionDir = new(Path.Combine(TestSettings.TestArtifactsDirectory, $"CreateNewImageTest_EndToEnd_MultiProjectSolution")); + + if (newSolutionDir.Exists) + { + newSolutionDir.Delete(recursive: true); + } + + newSolutionDir.Create(); + + // Create solution with projects + new DotnetNewCommand(_testOutput, "sln", "-n", nameof(EndToEnd_MultiProjectSolution)) + .WithVirtualHive() + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetNewCommand(_testOutput, "console", "-n", "ConsoleApp") + .WithVirtualHive() + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetCommand(_testOutput, "sln", "add", "ConsoleApp\\ConsoleApp.csproj") + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetNewCommand(_testOutput, "web", "-n", "WebApp") + .WithVirtualHive() + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + new DotnetCommand(_testOutput, "sln", "add", "WebApp\\WebApp.csproj") + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute() + .Should().Pass(); + + // Add 'EnableSdkContainerSupport' property to the ConsoleApp and set TFM + using (FileStream stream = File.Open(Path.Join(newSolutionDir.FullName, "ConsoleApp", "ConsoleApp.csproj"), FileMode.Open, FileAccess.ReadWrite)) + { + XDocument document = await XDocument.LoadAsync(stream, LoadOptions.None, CancellationToken.None); + document + .Descendants() + .First(e => e.Name.LocalName == "PropertyGroup")? + .Add(new XElement("EnableSdkContainerSupport", "true")); + document + .Descendants() + .First(e => e.Name.LocalName == "TargetFramework") + .Value = ToolsetInfo.CurrentTargetFramework; + + stream.SetLength(0); + await document.SaveAsync(stream, SaveOptions.None, CancellationToken.None); + } + + // Set TFM for WebApp + using (FileStream stream = File.Open(Path.Join(newSolutionDir.FullName, "WebApp", "WebApp.csproj"), FileMode.Open, FileAccess.ReadWrite)) + { + XDocument document = await XDocument.LoadAsync(stream, LoadOptions.None, CancellationToken.None); + document + .Descendants() + .First(e => e.Name.LocalName == "TargetFramework") + .Value = ToolsetInfo.CurrentTargetFramework; + + stream.SetLength(0); + await document.SaveAsync(stream, SaveOptions.None, CancellationToken.None); + } + + // Publish + CommandResult commandResult = new DotnetCommand(_testOutput, "publish", "/t:PublishContainer") + .WithWorkingDirectory(newSolutionDir.FullName) + .Execute(); + + string stdOut = commandResult.StdOut; + + commandResult.Should().Pass(); + commandResult.Should().HaveStdOutContaining("Pushed image 'webapp:latest'"); + commandResult.Should().HaveStdOutContaining("Pushed image 'consoleapp:latest'"); + } [DockerAvailableTheory(Skip = "https://github.com/dotnet/sdk/issues/36160")] [InlineData("webapi", false)] From e7859a7fdbbdbc0cd4e6fcf90c498b144f19046f Mon Sep 17 00:00:00 2001 From: Michal Pavlik Date: Tue, 5 Dec 2023 16:29:16 +0100 Subject: [PATCH 4/6] Enabled DockerAvailableFact for the test --- .../EndToEndTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index 3fd9a1b15b4e..3827ee13a2e4 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -211,8 +211,7 @@ private string BuildLocalApp([CallerMemberName] string testName = "TestName", st return publishDirectory; } - // [DockerAvailableFact(Skip = "https://github.com/dotnet/sdk/issues/36160")] - [Fact] + [DockerAvailableFact(Skip = "https://github.com/dotnet/sdk/issues/36160")] public async Task EndToEnd_MultiProjectSolution() { ILogger logger = _loggerFactory.CreateLogger(nameof(EndToEnd_MultiProjectSolution)); From 19b609c735caba18b3571238a3f41e9a8b1c38a9 Mon Sep 17 00:00:00 2001 From: Michal Pavlik Date: Tue, 5 Dec 2023 16:32:52 +0100 Subject: [PATCH 5/6] Removed unnecessary assignment --- .../EndToEndTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index 3827ee13a2e4..d40f7291e5f6 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -288,8 +288,6 @@ public async Task EndToEnd_MultiProjectSolution() .WithWorkingDirectory(newSolutionDir.FullName) .Execute(); - string stdOut = commandResult.StdOut; - commandResult.Should().Pass(); commandResult.Should().HaveStdOutContaining("Pushed image 'webapp:latest'"); commandResult.Should().HaveStdOutContaining("Pushed image 'consoleapp:latest'"); From 4d02f5c71468be60068b0cf3509f36718cb6f643 Mon Sep 17 00:00:00 2001 From: Michal Pavlik Date: Tue, 5 Dec 2023 16:33:39 +0100 Subject: [PATCH 6/6] Removed unnecessary usings --- .../EndToEndTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index d40f7291e5f6..e30a7b785ead 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -6,8 +6,6 @@ using Microsoft.NET.Build.Containers.LocalDaemons; using Microsoft.NET.Build.Containers.Resources; using Microsoft.NET.Build.Containers.UnitTests; -using Newtonsoft.Json.Linq; -using NuGet.ProjectModel; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace Microsoft.NET.Build.Containers.IntegrationTests;