diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 654e130343a6..6b5bf1179e77 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -68,13 +68,13 @@ a69bbaaf5f8d7249b8cab7309e81ad2221ce396c - + https://github.com/dotnet/fsharp - af2f522de602281d4ef5a7b71507c428e814c5c1 + 05af489c957d1846f60b2e6b40df3841c0f1cfa6 - + https://github.com/dotnet/fsharp - af2f522de602281d4ef5a7b71507c428e814c5c1 + 05af489c957d1846f60b2e6b40df3841c0f1cfa6 @@ -82,34 +82,34 @@ 7bb270d0f3380ff4adcb5e917fb5a2111d50bbad - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e - + https://github.com/dotnet/roslyn - 5649376e0e5f5db3743a94a62b073f2cce4be5d9 + 5a06a4caf73c5b086776763ebbee36c9b51c515e https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore @@ -289,18 +289,18 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore 954f61dd38b33caa2b736c73530bd5a294174437 - + https://github.com/dotnet/razor - 41acbdeb665c11bf26fea16b017ebf54e6a74e22 + 8b1b103ae8587094180fd43303622205c83e2f71 - + https://github.com/dotnet/razor - 41acbdeb665c11bf26fea16b017ebf54e6a74e22 + 8b1b103ae8587094180fd43303622205c83e2f71 - + https://github.com/dotnet/razor - 41acbdeb665c11bf26fea16b017ebf54e6a74e22 + 8b1b103ae8587094180fd43303622205c83e2f71 https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore diff --git a/eng/Versions.props b/eng/Versions.props index 3b00dbdb022c..5a6dd7cb659e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -11,7 +11,7 @@ - 8.0.403 + 8.0.404 8.0.400 true @@ -36,7 +36,7 @@ 8.0.0 4.0.0 8.0.0 - 8.0.0-beta.24461.2 + 8.0.0-beta.24504.2 7.0.0-preview.22423.2 8.0.0 4.3.0 @@ -153,7 +153,7 @@ - 12.8.401-beta.24421.7 + 12.8.402-beta.24477.4 @@ -178,9 +178,9 @@ - 7.0.0-preview.24502.3 - 7.0.0-preview.24502.3 - 7.0.0-preview.24502.3 + 9.0.0-preview.24502.7 + 9.0.0-preview.24502.7 + 9.0.0-preview.24502.7 diff --git a/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs b/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs index 3a1ff7b8d004..46d1b7ba3cae 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs @@ -41,10 +41,10 @@ public static class ContainerHelpers [Flags] public enum ParsePortError { - MissingPortNumber, - InvalidPortNumber, - InvalidPortType, - UnknownPortFormat + MissingPortNumber = 1, + InvalidPortNumber = 2, + InvalidPortType = 4, + UnknownPortFormat = 8 } /// @@ -68,9 +68,9 @@ public static bool TryParsePort(string? portNumber, string? portType, [NotNullWh error = ParsePortError.InvalidPortNumber; } - if (!Enum.TryParse(portType, out PortType t)) + if (!Enum.TryParse(portType, out PortType t)) { - if (portType is not null) + if (!string.IsNullOrEmpty(portType)) { error = (error ?? ParsePortError.InvalidPortType) | ParsePortError.InvalidPortType; } diff --git a/src/Containers/Microsoft.NET.Build.Containers/KnownStrings.cs b/src/Containers/Microsoft.NET.Build.Containers/KnownStrings.cs index 82df9dc64404..ed6b31031841 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/KnownStrings.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/KnownStrings.cs @@ -48,8 +48,14 @@ public static class Items public static class ErrorCodes { + // current version doesn't support containerization public static readonly string CONTAINER002 = nameof(CONTAINER002); + // containerimagename rename public static readonly string CONTAINER003 = nameof(CONTAINER003); + // generic http error + public static readonly string CONTAINER004 = nameof(CONTAINER004); + // don't use the containers package + public static readonly string CONTAINER005 = nameof(CONTAINER005); public static readonly string CONTAINER1011 = nameof(CONTAINER1011); public static readonly string CONTAINER1012 = nameof(CONTAINER1012); public static readonly string CONTAINER1013 = nameof(CONTAINER1013); diff --git a/src/Containers/Microsoft.NET.Build.Containers/ManifestListV2.cs b/src/Containers/Microsoft.NET.Build.Containers/ManifestListV2.cs index 44a294d65473..b75547d8f166 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/ManifestListV2.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/ManifestListV2.cs @@ -10,3 +10,5 @@ public record struct ManifestListV2(int schemaVersion, string mediaType, Platfor public record struct PlatformInformation(string architecture, string os, string? variant, string[] features, [property: JsonPropertyName("os.version")][field: JsonPropertyName("os.version")] string? version); public record struct PlatformSpecificManifest(string mediaType, long size, string digest, PlatformInformation platform); + +public record struct ImageIndexV1(int schemaVersion, string mediaType, PlatformSpecificManifest[] manifests); diff --git a/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net472/PublicAPI.Unshipped.txt b/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net472/PublicAPI.Unshipped.txt index adf04ca7a59b..6dd6551ddb37 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net472/PublicAPI.Unshipped.txt +++ b/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net472/PublicAPI.Unshipped.txt @@ -1,9 +1,9 @@ Microsoft.NET.Build.Containers.ContainerHelpers Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortNumber = 1 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortType = 2 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.MissingPortNumber = 0 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.UnknownPortFormat = Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortNumber | Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortType -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortNumber = 2 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortType = 4 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.MissingPortNumber = 1 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.UnknownPortFormat = 8 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError Microsoft.NET.Build.Containers.Port Microsoft.NET.Build.Containers.Port.Deconstruct(out int Number, out Microsoft.NET.Build.Containers.PortType Type) -> void Microsoft.NET.Build.Containers.Port.Equals(Microsoft.NET.Build.Containers.Port other) -> bool diff --git a/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net8.0/PublicAPI.Unshipped.txt index 698c2894586b..8e7f42f35d3f 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -21,10 +21,10 @@ Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageAndTag.UsesInvariantG static readonly Microsoft.NET.Build.Containers.Constants.Version -> string! Microsoft.NET.Build.Containers.ContainerHelpers Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortNumber = 1 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortType = 2 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.MissingPortNumber = 0 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError -Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.UnknownPortFormat = Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortNumber | Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortType -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortNumber = 2 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.InvalidPortType = 4 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.MissingPortNumber = 1 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError +Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError.UnknownPortFormat = 8 -> Microsoft.NET.Build.Containers.ContainerHelpers.ParsePortError Microsoft.NET.Build.Containers.Descriptor Microsoft.NET.Build.Containers.Descriptor.Annotations.get -> System.Collections.Generic.Dictionary? Microsoft.NET.Build.Containers.Descriptor.Annotations.init -> void @@ -72,6 +72,15 @@ Microsoft.NET.Build.Containers.ManifestListV2.mediaType.get -> string! Microsoft.NET.Build.Containers.ManifestListV2.mediaType.set -> void Microsoft.NET.Build.Containers.ManifestListV2.schemaVersion.get -> int Microsoft.NET.Build.Containers.ManifestListV2.schemaVersion.set -> void +Microsoft.NET.Build.Containers.ImageIndexV1 +Microsoft.NET.Build.Containers.ImageIndexV1.ImageIndexV1() -> void +Microsoft.NET.Build.Containers.ImageIndexV1.ImageIndexV1(int schemaVersion, string! mediaType, Microsoft.NET.Build.Containers.PlatformSpecificManifest[]! manifests) -> void +Microsoft.NET.Build.Containers.ImageIndexV1.manifests.get -> Microsoft.NET.Build.Containers.PlatformSpecificManifest[]! +Microsoft.NET.Build.Containers.ImageIndexV1.manifests.set -> void +Microsoft.NET.Build.Containers.ImageIndexV1.mediaType.get -> string! +Microsoft.NET.Build.Containers.ImageIndexV1.mediaType.set -> void +Microsoft.NET.Build.Containers.ImageIndexV1.schemaVersion.get -> int +Microsoft.NET.Build.Containers.ImageIndexV1.schemaVersion.set -> void Microsoft.NET.Build.Containers.ManifestV2 Microsoft.NET.Build.Containers.ManifestV2.Config.get -> Microsoft.NET.Build.Containers.ManifestConfig Microsoft.NET.Build.Containers.ManifestV2.Config.init -> void @@ -268,4 +277,11 @@ static Microsoft.NET.Build.Containers.ManifestListV2.operator ==(Microsoft.NET.B override Microsoft.NET.Build.Containers.ManifestListV2.GetHashCode() -> int ~override Microsoft.NET.Build.Containers.ManifestListV2.Equals(object obj) -> bool Microsoft.NET.Build.Containers.ManifestListV2.Equals(Microsoft.NET.Build.Containers.ManifestListV2 other) -> bool -Microsoft.NET.Build.Containers.ManifestListV2.Deconstruct(out int schemaVersion, out string! mediaType, out Microsoft.NET.Build.Containers.PlatformSpecificManifest[]! manifests) -> void \ No newline at end of file +Microsoft.NET.Build.Containers.ManifestListV2.Deconstruct(out int schemaVersion, out string! mediaType, out Microsoft.NET.Build.Containers.PlatformSpecificManifest[]! manifests) -> void +~override Microsoft.NET.Build.Containers.ImageIndexV1.ToString() -> string +static Microsoft.NET.Build.Containers.ImageIndexV1.operator !=(Microsoft.NET.Build.Containers.ImageIndexV1 left, Microsoft.NET.Build.Containers.ImageIndexV1 right) -> bool +static Microsoft.NET.Build.Containers.ImageIndexV1.operator ==(Microsoft.NET.Build.Containers.ImageIndexV1 left, Microsoft.NET.Build.Containers.ImageIndexV1 right) -> bool +override Microsoft.NET.Build.Containers.ImageIndexV1.GetHashCode() -> int +~override Microsoft.NET.Build.Containers.ImageIndexV1.Equals(object obj) -> bool +Microsoft.NET.Build.Containers.ImageIndexV1.Equals(Microsoft.NET.Build.Containers.ImageIndexV1 other) -> bool +Microsoft.NET.Build.Containers.ImageIndexV1.Deconstruct(out int schemaVersion, out string! mediaType, out Microsoft.NET.Build.Containers.PlatformSpecificManifest[]! manifests) -> void \ No newline at end of file diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs index 09d2274467db..5439d3755aa7 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs @@ -1,21 +1,27 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. -// +using System.Net.Http.Headers; using Microsoft.Extensions.Logging; +using NuGet.Packaging; namespace Microsoft.NET.Build.Containers; internal static class HttpExtensions { + private static readonly MediaTypeWithQualityHeaderValue[] _knownManifestFormats = [ + new("application/json"), + new(SchemaTypes.DockerManifestListV2), + new(SchemaTypes.OciImageIndexV1), + new(SchemaTypes.DockerManifestV2), + new(SchemaTypes.OciManifestV1), + new(SchemaTypes.DockerContainerV1), + ]; + internal static HttpRequestMessage AcceptManifestFormats(this HttpRequestMessage request) { request.Headers.Accept.Clear(); - request.Headers.Accept.Add(new("application/json")); - request.Headers.Accept.Add(new(SchemaTypes.DockerManifestListV2)); - request.Headers.Accept.Add(new(SchemaTypes.DockerManifestV2)); - request.Headers.Accept.Add(new(SchemaTypes.OciManifestV1)); - request.Headers.Accept.Add(new(SchemaTypes.DockerContainerV1)); + request.Headers.Accept.AddRange(_knownManifestFormats); return request; } diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs index b5bd47226a05..6f64ec7d4f64 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs @@ -81,7 +81,7 @@ internal Registry(string registryName, ILogger logger, IRegistryAPI registryAPI, this(new Uri($"https://{registryName}"), logger, registryAPI, settings) { } - internal Registry(string registryName, ILogger logger, RegistryMode mode, RegistrySettings? settings = null) : + internal Registry(string registryName, ILogger logger, RegistryMode mode, RegistrySettings? settings = null) : this(new Uri($"https://{registryName}"), logger, new RegistryApiFactory(mode), settings) { } @@ -191,6 +191,14 @@ await initialManifestResponse.Content.ReadFromJsonAsync(cancella runtimeIdentifier, manifestPicker, cancellationToken).ConfigureAwait(false), + SchemaTypes.OciImageIndexV1 => + await PickBestImageFromImageIndexAsync( + repositoryName, + reference, + await initialManifestResponse.Content.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false), + runtimeIdentifier, + manifestPicker, + cancellationToken).ConfigureAwait(false), var unknownMediaType => throw new NotImplementedException(Resource.FormatString( nameof(Strings.UnknownMediaType), repositoryName, @@ -236,10 +244,10 @@ private async Task ReadSingleImageAsync(string repositoryName, Man } - private static IReadOnlyDictionary GetManifestsByRid(ManifestListV2 manifestList) + private static IReadOnlyDictionary GetManifestsByRid(PlatformSpecificManifest[] manifestList) { var ridDict = new Dictionary(); - foreach (var manifest in manifestList.manifests) + foreach (var manifest in manifestList) { if (CreateRidForPlatform(manifest.platform) is { } rid) { @@ -291,14 +299,51 @@ private async Task PickBestImageFromManifestListAsync( CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - var ridManifestDict = GetManifestsByRid(manifestList); - if (manifestPicker.PickBestManifestForRid(ridManifestDict, runtimeIdentifier) is PlatformSpecificManifest matchingManifest) + var ridManifestDict = GetManifestsByRid(manifestList.manifests); + return await PickBestImageFromManifestsAsync( + repositoryName, + reference, + ridManifestDict, + runtimeIdentifier, + manifestPicker, + cancellationToken).ConfigureAwait(false); + } + + private async Task PickBestImageFromImageIndexAsync( + string repositoryName, + string reference, + ImageIndexV1 index, + string runtimeIdentifier, + IManifestPicker manifestPicker, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + var ridManifestDict = GetManifestsByRid(index.manifests); + return await PickBestImageFromManifestsAsync( + repositoryName, + reference, + ridManifestDict, + runtimeIdentifier, + manifestPicker, + cancellationToken).ConfigureAwait(false); + } + + private async Task PickBestImageFromManifestsAsync( + string repositoryName, + string reference, + IReadOnlyDictionary knownManifests, + string runtimeIdentifier, + IManifestPicker manifestPicker, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + if (manifestPicker.PickBestManifestForRid(knownManifests, runtimeIdentifier) is PlatformSpecificManifest matchingManifest) { using HttpResponseMessage manifestResponse = await _registryAPI.Manifest.GetAsync(repositoryName, matchingManifest.digest, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); var manifest = await manifestResponse.Content.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false); - if (manifest is null) throw new BaseImageNotFoundException(runtimeIdentifier, repositoryName, reference, ridManifestDict.Keys); + if (manifest is null) throw new BaseImageNotFoundException(runtimeIdentifier, repositoryName, reference, knownManifests.Keys); manifest.KnownDigest = matchingManifest.digest; return await ReadSingleImageAsync( repositoryName, @@ -307,7 +352,7 @@ private async Task PickBestImageFromManifestListAsync( } else { - throw new BaseImageNotFoundException(runtimeIdentifier, repositoryName, reference, ridManifestDict.Keys); + throw new BaseImageNotFoundException(runtimeIdentifier, repositoryName, reference, knownManifests.Keys); } } diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs index d740c7621ecc..8021f652f72d 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs @@ -10,6 +10,7 @@ internal class SchemaTypes internal const string DockerManifestListV2 = "application/vnd.docker.distribution.manifest.list.v2+json"; internal const string DockerManifestV2 = "application/vnd.docker.distribution.manifest.v2+json"; internal const string OciManifestV1 = "application/vnd.oci.image.manifest.v1+json"; // https://containers.gitbook.io/build-containers-the-hard-way/#registry-format-oci-image-manifest + internal const string OciImageIndexV1 = "application/vnd.oci.image.index.v1+json"; internal const string DockerLayerGzip = "application/vnd.docker.image.rootfs.diff.tar.gzip"; internal const string OciLayerGzipV1 = "application/vnd.oci.image.layer.v1.tar+gzip"; } diff --git a/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets b/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets index 0a880a3b710c..16c70d8e09dc 100644 --- a/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets +++ b/src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets @@ -222,6 +222,7 @@ ($(_SdkCanPublishWorker) and $(_IsWorkerProject)) or ($(_SdkCanPublishConsole) and '$(EnableSdkContainerSupport)' == 'true') )" + Code="CONTAINER005" Text="The $(_ContainersPackageIdentity) NuGet package is explicitly referenced but the current SDK can natively publish the project as a container. Consider removing the package reference to $(_ContainersPackageIdentity) because it is no longer needed." /> diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets index a506081a2017..3d68d1de7830 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/sdk/Sdk.targets @@ -55,12 +55,14 @@ Copyright (c) .NET Foundation. All rights reserved. - <_ContainersTargetsDir Condition=" '$(_ContainersTargetsDir)'=='' ">$(MSBuildThisFileDirectory)..\..\..\Containers\build\ + <_IsNotSetContainersTargetsDir>false + <_IsNotSetContainersTargetsDir Condition=" '$(_ContainersTargetsDir)'=='' ">true + <_ContainersTargetsDir Condition="$(_IsNotSetContainersTargetsDir)">$(MSBuildThisFileDirectory)..\..\..\Containers\build\ + Condition="$(_IsNotSetContainersTargetsDir) AND Exists('$(_ContainersTargetsDir)Microsoft.NET.Build.Containers.targets') AND '$(TargetFramework)' != ''" /> diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index d78b88cc211b..efe6ddcd039f 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -369,7 +369,7 @@ public async Task EndToEnd_NoAPI_ProjectType(string projectType, bool addPackage if (addPackageReference) { - commandResult.Should().HaveStdOutContaining("warning : The Microsoft.NET.Build.Containers NuGet package is explicitly referenced but the current SDK can natively publish the project as a container. Consider removing the package reference to Microsoft.NET.Build.Containers because it is no longer needed."); + commandResult.Should().HaveStdOutContaining("warning CONTAINER005: The Microsoft.NET.Build.Containers NuGet package is explicitly referenced but the current SDK can natively publish the project as a container. Consider removing the package reference to Microsoft.NET.Build.Containers because it is no longer needed."); } else { diff --git a/src/Tests/Microsoft.NET.Build.Containers.UnitTests/ContainerHelpersTests.cs b/src/Tests/Microsoft.NET.Build.Containers.UnitTests/ContainerHelpersTests.cs index 4d83f91b175c..ecf0cf61f691 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.UnitTests/ContainerHelpersTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.UnitTests/ContainerHelpersTests.cs @@ -109,7 +109,7 @@ public void IsValidImageTag_InvalidLength() [InlineData("80", true, 80, PortType.tcp, null)] [InlineData("125/dup", false, 125, PortType.tcp, ContainerHelpers.ParsePortError.InvalidPortType)] [InlineData("invalidNumber", false, null, null, ContainerHelpers.ParsePortError.InvalidPortNumber)] - [InlineData("welp/unknowntype", false, null, null, (ContainerHelpers.ParsePortError)3)] + [InlineData("welp/unknowntype", false, null, null, (ContainerHelpers.ParsePortError)6)] [InlineData("a/b/c", false, null, null, ContainerHelpers.ParsePortError.UnknownPortFormat)] [InlineData("/tcp", false, null, null, ContainerHelpers.ParsePortError.MissingPortNumber)] public void CanParsePort(string input, bool shouldParse, int? expectedPortNumber, PortType? expectedType, ContainerHelpers.ParsePortError? expectedError) { diff --git a/src/Tests/containerize.UnitTests/ParserTests.cs b/src/Tests/containerize.UnitTests/ParserTests.cs index 7a43de11b233..079d3068d1ae 100644 --- a/src/Tests/containerize.UnitTests/ParserTests.cs +++ b/src/Tests/containerize.UnitTests/ParserTests.cs @@ -204,9 +204,9 @@ public void CanParsePorts() } [Theory] - [InlineData("1501/smth", "(MissingPortNumber, InvalidPortType)")] - [InlineData("1501\\tcp", "(MissingPortNumber, InvalidPortNumber)")] - [InlineData("not-a-number", "(MissingPortNumber, InvalidPortNumber)")] + [InlineData("1501/smth", "(InvalidPortType)")] + [InlineData("1501\\tcp", "(InvalidPortNumber)")] + [InlineData("not-a-number", "(InvalidPortNumber)")] public void CanHandleInvalidPorts(string portStr, string reason) { string errorMessage = $"Incorrectly formatted ports:{Environment.NewLine}\t{portStr}:\t{reason}{Environment.NewLine}";