Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Containers/Microsoft.NET.Build.Containers/KnownStrings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ internal static class KnownStrings
public static class Properties
{
public static readonly string ContainerBaseImage = nameof(ContainerBaseImage);
public static readonly string ContainerFamily = nameof(ContainerFamily);
public static readonly string _ContainerBaseImageTag = nameof(_ContainerBaseImageTag);
public static readonly string ContainerRegistry = nameof(ContainerRegistry);
/// <summary>Note that this is deprecated in favor of <see cref="ContainerRepository"/></summary>
public static readonly string ContainerImageName = nameof(ContainerImageName);
Expand All @@ -22,6 +24,8 @@ public static class Properties
public static readonly string ContainerPort = nameof(ContainerPort);
public static readonly string ContainerEnvironmentVariable = nameof(ContainerEnvironmentVariable);

public static readonly string ComputeContainerBaseImage = nameof(ComputeContainerBaseImage);
public static readonly string _ComputeContainerBaseImageTag = nameof(_ComputeContainerBaseImageTag);
public static readonly string ComputeContainerConfig = nameof(ComputeContainerConfig);
public static readonly string AssemblyName = nameof(AssemblyName);
public static readonly string ContainerBaseRegistry = nameof(ContainerBaseRegistry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ Microsoft.NET.Build.Containers.PortType.udp = 1 -> Microsoft.NET.Build.Container
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.ComputedBaseImageTag.get -> string?
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.ComputeDotnetBaseImageTag() -> void
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.ContainerFamily.get -> string!
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.ContainerFamily.set -> void
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.SdkVersion.get -> string!
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.SdkVersion.set -> void
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.TargetFrameworkVersion.get -> string!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ Microsoft.NET.Build.Containers.PortType
Microsoft.NET.Build.Containers.PortType.tcp = 0 -> Microsoft.NET.Build.Containers.PortType
Microsoft.NET.Build.Containers.PortType.udp = 1 -> Microsoft.NET.Build.Containers.PortType
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.ContainerFamily.get -> string!
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.ContainerFamily.set -> void
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.SdkVersion.get -> string!
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.SdkVersion.set -> void
Microsoft.NET.Build.Containers.Tasks.ComputeDotnetBaseImageTag.TargetFrameworkVersion.get -> string!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,33 +25,41 @@ public sealed class ComputeDotnetBaseImageTag : Microsoft.Build.Utilities.Task
[Required]
public string TargetFrameworkVersion { get; set; }

public string ContainerFamily { get; set; }

[Output]
public string? ComputedBaseImageTag { get; private set; }

public ComputeDotnetBaseImageTag()
{
SdkVersion = "";
TargetFrameworkVersion = "";
ContainerFamily = "";
}

public override bool Execute()
{
if (SemanticVersion.TryParse(TargetFrameworkVersion, out var tfm) && tfm.Major < FirstVersionWithNewTaggingScheme)
{
ComputedBaseImageTag = $"{tfm.Major}.{tfm.Minor}";
return true;
}

if (SemanticVersion.TryParse(SdkVersion, out var version))
else if (SemanticVersion.TryParse(SdkVersion, out var version))
{
ComputedBaseImageTag = ComputeVersionInternal(version, tfm);
return true;
}
else
{
Log.LogError(Resources.Strings.InvalidSdkVersion, SdkVersion);
return false;
return !Log.HasLoggedErrors;
}

if (!string.IsNullOrWhiteSpace(ContainerFamily))
{
// for the inferred image tags, 'family' aka 'flavor' comes after the 'version' portion (including any preview/rc segments).
// so it's safe to just append here
ComputedBaseImageTag += $"-{ContainerFamily}";
}
return true;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
<Target Name="_ComputeContainerBaseImageTag" Returns="$(_ContainerBaseImageTag)">
<ComputeDotnetBaseImageTag
SdkVersion="$(NetCoreSdkVersion)"
TargetFrameworkVersion="$(_TargetFrameworkVersionWithoutV).0">
TargetFrameworkVersion="$(_TargetFrameworkVersionWithoutV).0"
ContainerFamily="$(ContainerFamily)">
<Output TaskParameter="ComputedBaseImageTag" PropertyName="_ContainerBaseImageTag" />
</ComputeDotnetBaseImageTag>
</Target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,4 +222,26 @@ public void WindowsUsersGetLinuxContainers(string sdkPortableRid, string expecte
var computedRid = instance.GetProperty(KnownStrings.Properties.ContainerRuntimeIdentifier)?.EvaluatedValue;
computedRid.Should().Be(expectedRid);
}

[InlineData("8.0.100", "v7.0", "", "7.0")]
[InlineData("8.0.100-preview.2", "v8.0", "", "8.0.0-preview.2")]
[InlineData("8.0.100-preview.2", "v8.0", "jammy", "8.0.0-preview.2-jammy")]
[InlineData("8.0.100-preview.2", "v8.0", "jammy-chiseled", "8.0.0-preview.2-jammy-chiseled")]
[InlineData("8.0.100-rc.2", "v8.0", "jammy-chiseled", "8.0.0-rc.2-jammy-chiseled")]
[InlineData("8.0.100", "v8.0", "jammy-chiseled", "8.0-jammy-chiseled")]
[Theory]
public void CanTakeContainerBaseFamilyIntoAccount(string sdkVersion, string tfmMajMin, string containerFamily, string expectedTag)
{
var (project, logger, d) = ProjectInitializer.InitProject(new()
{
["NetCoreSdkVersion"] = sdkVersion,
["TargetFrameworkVersion"] = tfmMajMin,
[KnownStrings.Properties.ContainerFamily] = containerFamily,
}, projectName: $"{nameof(CanTakeContainerBaseFamilyIntoAccount)}_{sdkVersion}_{tfmMajMin}_{containerFamily}_{expectedTag}");
using var _ = d;
var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
instance.Build(new[]{ _ComputeContainerBaseImageTag }, null, null, out var outputs).Should().BeTrue(String.Join(Environment.NewLine, logger.Errors));
var computedBaseImageTag = instance.GetProperty(KnownStrings.Properties._ContainerBaseImageTag)?.EvaluatedValue;
computedBaseImageTag.Should().Be(expectedTag);
}
}