Skip to content

Commit 0df21a7

Browse files
authored
Ensure container generation uniformly reports outputs to MSBuild (#47234)
1 parent 8d01a62 commit 0df21a7

File tree

6 files changed

+41
-16
lines changed

6 files changed

+41
-16
lines changed

src/Containers/Microsoft.NET.Build.Containers/ImageBuilder.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,11 @@ internal void AddLayer(Layer l)
107107
_baseImageConfig.AddLayer(l);
108108
}
109109

110-
internal void AddBaseImageDigestLabel()
110+
internal (string name, string value) AddBaseImageDigestLabel()
111111
{
112-
AddLabel("org.opencontainers.image.base.digest", _baseImageManifest.GetDigest());
112+
var label = ("org.opencontainers.image.base.digest", _baseImageManifest.GetDigest());
113+
AddLabel(label.Item1, label.Item2);
114+
return label;
113115
}
114116

115117
/// <summary>

src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net10.0/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedContainerNames.get
261261
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedContainerNames.set -> void
262262
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.ImageFormat.get -> string?
263263
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.ImageFormat.set -> void
264+
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedDigestLabel.get -> Microsoft.Build.Framework.ITaskItem?
265+
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedDigestLabel.set -> void
264266
Microsoft.NET.Build.Containers.Tasks.ParseContainerProperties
265267
Microsoft.NET.Build.Containers.Tasks.ParseContainerProperties.ContainerEnvironmentVariables.get -> Microsoft.Build.Framework.ITaskItem![]!
266268
Microsoft.NET.Build.Containers.Tasks.ParseContainerProperties.ContainerEnvironmentVariables.set -> void

src/Containers/Microsoft.NET.Build.Containers/PublicAPI/net472/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedContainerNames.get
9494
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedContainerNames.set -> void
9595
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.ImageFormat.get -> string?
9696
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.ImageFormat.set -> void
97+
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedDigestLabel.get -> Microsoft.Build.Framework.ITaskItem?
98+
Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GeneratedDigestLabel.set -> void
9799
override Microsoft.NET.Build.Containers.Tasks.CreateNewImage.ToolName.get -> string!
98100
override Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GenerateCommandLineCommands() -> string!
99101
override Microsoft.NET.Build.Containers.Tasks.CreateNewImage.GenerateFullPathToTool() -> string!

src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.Interface.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ partial class CreateNewImage
192192
[Output]
193193
public ITaskItem[] GeneratedContainerNames { get; set; }
194194

195+
[Output]
196+
public ITaskItem? GeneratedDigestLabel { get; set; }
197+
195198
public CreateNewImage()
196199
{
197200
ContainerizeDirectory = "";
@@ -227,6 +230,7 @@ public CreateNewImage()
227230
GeneratedArchiveOutputPath = "";
228231
GeneratedContainerMediaType = "";
229232
GeneratedContainerNames = Array.Empty<ITaskItem>();
233+
GeneratedDigestLabel = null;
230234

231235
GenerateLabels = false;
232236
GenerateDigestLabel = false;

src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ internal async Task<bool> ExecuteAsync(CancellationToken cancellationToken)
121121
}
122122

123123
(string message, object[] parameters) = SkipPublishing ?
124-
( Strings.ContainerBuilder_StartBuildingImageForRid, new object[] { Repository, ContainerRuntimeIdentifier, sourceImageReference }) :
125-
( Strings.ContainerBuilder_StartBuildingImage, new object[] { Repository, String.Join(",", ImageTags), sourceImageReference });
124+
(Strings.ContainerBuilder_StartBuildingImageForRid, new object[] { Repository, ContainerRuntimeIdentifier, sourceImageReference }) :
125+
(Strings.ContainerBuilder_StartBuildingImage, new object[] { Repository, String.Join(",", ImageTags), sourceImageReference });
126126
Log.LogMessage(MessageImportance.High, message, parameters);
127127

128128
// forcibly change the media type if required
@@ -150,6 +150,8 @@ internal async Task<bool> ExecuteAsync(CancellationToken cancellationToken)
150150
(string[] entrypoint, string[] cmd) = DetermineEntrypointAndCmd(baseImageEntrypoint: imageBuilder.BaseImageConfig.GetEntrypoint());
151151
imageBuilder.SetEntrypointAndCmd(entrypoint, cmd);
152152

153+
string? baseImageLabel = null;
154+
string? baseImageDigest = null;
153155
if (GenerateLabels)
154156
{
155157
foreach (ITaskItem label in Labels)
@@ -159,7 +161,7 @@ internal async Task<bool> ExecuteAsync(CancellationToken cancellationToken)
159161

160162
if (GenerateDigestLabel)
161163
{
162-
imageBuilder.AddBaseImageDigestLabel();
164+
(baseImageLabel, baseImageDigest) = imageBuilder.AddBaseImageDigestLabel();
163165
}
164166
}
165167
else
@@ -195,13 +197,19 @@ internal async Task<bool> ExecuteAsync(CancellationToken cancellationToken)
195197
GeneratedArchiveOutputPath = ArchiveOutputPath;
196198
GeneratedContainerMediaType = builtImage.ManifestMediaType;
197199
GeneratedContainerNames = destinationImageReference.FullyQualifiedImageNames().Select(name => new Microsoft.Build.Utilities.TaskItem(name)).ToArray();
200+
if (baseImageLabel is not null && baseImageDigest is not null)
201+
{
202+
var labelItem = new Microsoft.Build.Utilities.TaskItem(baseImageLabel);
203+
labelItem.SetMetadata("Value", baseImageDigest);
204+
GeneratedDigestLabel = labelItem;
205+
}
198206

199207
if (!SkipPublishing)
200208
{
201209
await ImagePublisher.PublishImageAsync(builtImage, sourceImageReference, destinationImageReference, Log, telemetry, cancellationToken)
202210
.ConfigureAwait(false);
203211
}
204-
212+
205213
return !Log.HasLoggedErrors;
206214
}
207215

src/Containers/packaging/build/Microsoft.NET.Build.Containers.targets

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@
240240
</Target>
241241

242242
<Target Name="_PublishSingleContainer"
243-
Returns="@(GeneratedContainers)">
243+
Returns="@(GeneratedContainer)">
244244
<PropertyGroup Condition="'$(DOTNET_HOST_PATH)' == ''">
245245
<DotNetHostDirectory>$(NetCoreRoot)</DotNetHostDirectory>
246246
<DotNetHostFileName>dotnet</DotNetHostFileName>
@@ -284,26 +284,27 @@
284284
<Output TaskParameter="GeneratedArchiveOutputPath" PropertyName="GeneratedArchiveOutputPath" />
285285
<Output TaskParameter="GeneratedContainerMediaType" PropertyName="GeneratedContainerMediaType" />
286286
<Output TaskParameter="GeneratedContainerNames" ItemName="GeneratedContainerName" />
287+
<Output TaskParameter="GeneratedDigestLabel" ItemName="ContainerLabel" />
287288
</CreateNewImage>
288289

289290
<ItemGroup>
290-
<GeneratedContainers Include="GeneratedContainer">
291+
<GeneratedContainer Include="GeneratedContainer">
291292
<Manifest>$(GeneratedContainerManifest)</Manifest>
292293
<Configuration>$(GeneratedContainerConfiguration)</Configuration>
293294
<ManifestDigest>$(GeneratedContainerDigest)</ManifestDigest>
294295
<ManifestMediaType>$(GeneratedContainerMediaType)</ManifestMediaType>
295-
</GeneratedContainers>
296+
</GeneratedContainer>
296297
</ItemGroup>
297298
</Target>
298299

299-
<Target Name="_PublishMultiArchContainers" DependsOnTargets="$(PublishContainerDependsOn)" >
300+
<Target Name="_PublishMultiArchContainers" DependsOnTargets="$(PublishContainerDependsOn)" Returns="@(GeneratedContainer)" >
300301
<PropertyGroup>
301302
<!--We want to skip publishing individual images in case of multi-arch tarball publishing or local daemon (only docker) publishing because all images are published in one tarball.-->
302303
<!--We don't want to skip publishing individual images in case of remote registry because the individual images should be available in the registry before image index is pushed.-->
303304
<!--We don't want to skip publishing individual images in case of local daemon podman because podman loads multi-arch tarball differently - only individual image for the current platform.-->
304305
<_SkipContainerPublishing>false</_SkipContainerPublishing>
305306
<_SkipContainerPublishing Condition="$(ContainerArchiveOutputPath) != '' or ( $(ContainerRegistry) == '' and ( $(LocalRegistry) == '' or $(LocalRegistry) == 'Docker' ) )">true</_SkipContainerPublishing>
306-
307+
307308
<!--We want to skip CreateImageIndex task in case of local daemon podman because it is not supported.-->
308309
<_SkipCreateImageIndex>false</_SkipCreateImageIndex>
309310
<_SkipCreateImageIndex Condition="$(ContainerArchiveOutputPath) == '' and $(ContainerRegistry) == '' and $(LocalRegistry) == 'Podman'">true</_SkipCreateImageIndex>
@@ -346,11 +347,11 @@
346347
Projects="@(_InnerBuild)"
347348
Targets="Publish;_ParseItemsForPublishingSingleContainer;_PublishSingleContainer"
348349
BuildInParallel="true">
349-
<Output TaskParameter="TargetOutputs" ItemName="GeneratedContainers" />
350+
<Output TaskParameter="TargetOutputs" ItemName="GeneratedContainer" />
350351
</MSBuild>
351352

352353
<CreateImageIndex Condition="'$(_SkipCreateImageIndex)' == 'false' "
353-
GeneratedContainers="@(GeneratedContainers)"
354+
GeneratedContainers="@(GeneratedContainer)"
354355
LocalRegistry="$(LocalRegistry)"
355356
OutputRegistry="$(ContainerRegistry)"
356357
ArchiveOutputPath="$(ContainerArchiveOutputPath)"
@@ -403,7 +404,9 @@
403404

404405
<Target Name="PublishContainer"
405406
DependsOnTargets="$(PublishContainerDependsOn)"
406-
Condition="'$(IsPublishable)' == 'true' AND '$(EnableSdkContainerSupport)' == 'true'">
407+
Condition="'$(IsPublishable)' == 'true' AND '$(EnableSdkContainerSupport)' == 'true'"
408+
Returns="@(GeneratedContainer)"
409+
>
407410
<PropertyGroup>
408411
<_IsMultiTFMBuild Condition="'$(TargetFrameworks)' != '' and '$(TargetFramework)' == ''">true</_IsMultiTFMBuild>
409412
<!-- we are multi-RID if:
@@ -418,8 +421,12 @@
418421
</PropertyGroup>
419422

420423
<!-- Call _PublishMultiArchContainers if we are in a multi-rid build, and call _PublishSingleContainer if we are in a single-RID build -->
421-
<CallTarget Condition="'$(_IsMultiRIDBuild)' == 'true' " Targets="_PublishMultiArchContainers" />
422-
<CallTarget Condition="'$(_IsSingleRIDBuild)' == 'true' " Targets="_PublishSingleContainer" />
424+
<CallTarget Condition="'$(_IsMultiRIDBuild)' == 'true' " Targets="_PublishMultiArchContainers">
425+
<Output TaskParameter="TargetOutputs" ItemName="GeneratedContainer" />
426+
</CallTarget>
427+
<CallTarget Condition="'$(_IsSingleRIDBuild)' == 'true' " Targets="_PublishSingleContainer">
428+
<Output TaskParameter="TargetOutputs" ItemName="GeneratedContainer" />
429+
</CallTarget>
423430

424431
<Error Condition="'$(_IsMultiTFMBuild)' == 'true'" Code="CONTAINERS0666" Text="Containers cannot be published for multiple TargetFrameworks at this time. Please specify a TargetFramework." />
425432
</Target>

0 commit comments

Comments
 (0)