Skip to content

Commit ec37e45

Browse files
authored
[automated] Merge branch 'release/9.0.1xx' => 'release/9.0.2xx' (#44963)
2 parents 7b721d1 + a2a3942 commit ec37e45

33 files changed

+921
-516
lines changed

eng/ManualVersions.props

+14-14
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@
99
Basically: In this file, choose the highest version when resolving merge conflicts.
1010
-->
1111
<PropertyGroup>
12-
<MicrosoftWindowsSDKNETRef10_0_17763PackageVersion>10.0.17763.54</MicrosoftWindowsSDKNETRef10_0_17763PackageVersion>
13-
<MicrosoftWindowsSDKNETRef10_0_18362PackageVersion>10.0.18362.54</MicrosoftWindowsSDKNETRef10_0_18362PackageVersion>
14-
<MicrosoftWindowsSDKNETRef10_0_19041PackageVersion>10.0.19041.54</MicrosoftWindowsSDKNETRef10_0_19041PackageVersion>
15-
<MicrosoftWindowsSDKNETRef10_0_20348PackageVersion>10.0.20348.54</MicrosoftWindowsSDKNETRef10_0_20348PackageVersion>
16-
<MicrosoftWindowsSDKNETRef10_0_22000PackageVersion>10.0.22000.54</MicrosoftWindowsSDKNETRef10_0_22000PackageVersion>
17-
<MicrosoftWindowsSDKNETRef10_0_22621PackageVersion>10.0.22621.54</MicrosoftWindowsSDKNETRef10_0_22621PackageVersion>
18-
<MicrosoftWindowsSDKNETRef10_0_26100PackageVersion>10.0.26100.54</MicrosoftWindowsSDKNETRef10_0_26100PackageVersion>
19-
<MicrosoftWindowsSDKNETRef10_0_17763PackageVersionNet6>10.0.17763.52</MicrosoftWindowsSDKNETRef10_0_17763PackageVersionNet6>
20-
<MicrosoftWindowsSDKNETRef10_0_18362PackageVersionNet6>10.0.18362.52</MicrosoftWindowsSDKNETRef10_0_18362PackageVersionNet6>
21-
<MicrosoftWindowsSDKNETRef10_0_19041PackageVersionNet6>10.0.19041.52</MicrosoftWindowsSDKNETRef10_0_19041PackageVersionNet6>
22-
<MicrosoftWindowsSDKNETRef10_0_20348PackageVersionNet6>10.0.20348.52</MicrosoftWindowsSDKNETRef10_0_20348PackageVersionNet6>
23-
<MicrosoftWindowsSDKNETRef10_0_22000PackageVersionNet6>10.0.22000.52</MicrosoftWindowsSDKNETRef10_0_22000PackageVersionNet6>
24-
<MicrosoftWindowsSDKNETRef10_0_22621PackageVersionNet6>10.0.22621.52</MicrosoftWindowsSDKNETRef10_0_22621PackageVersionNet6>
25-
<MicrosoftWindowsSDKNETRef10_0_26100PackageVersionNet6>10.0.26100.52</MicrosoftWindowsSDKNETRef10_0_26100PackageVersionNet6>
12+
<MicrosoftWindowsSDKNETRef10_0_17763PackageVersion>10.0.17763.57</MicrosoftWindowsSDKNETRef10_0_17763PackageVersion>
13+
<MicrosoftWindowsSDKNETRef10_0_18362PackageVersion>10.0.18362.57</MicrosoftWindowsSDKNETRef10_0_18362PackageVersion>
14+
<MicrosoftWindowsSDKNETRef10_0_19041PackageVersion>10.0.19041.57</MicrosoftWindowsSDKNETRef10_0_19041PackageVersion>
15+
<MicrosoftWindowsSDKNETRef10_0_20348PackageVersion>10.0.20348.57</MicrosoftWindowsSDKNETRef10_0_20348PackageVersion>
16+
<MicrosoftWindowsSDKNETRef10_0_22000PackageVersion>10.0.22000.57</MicrosoftWindowsSDKNETRef10_0_22000PackageVersion>
17+
<MicrosoftWindowsSDKNETRef10_0_22621PackageVersion>10.0.22621.57</MicrosoftWindowsSDKNETRef10_0_22621PackageVersion>
18+
<MicrosoftWindowsSDKNETRef10_0_26100PackageVersion>10.0.26100.57</MicrosoftWindowsSDKNETRef10_0_26100PackageVersion>
19+
<MicrosoftWindowsSDKNETRef10_0_17763PackageVersionNet6>10.0.17763.55</MicrosoftWindowsSDKNETRef10_0_17763PackageVersionNet6>
20+
<MicrosoftWindowsSDKNETRef10_0_18362PackageVersionNet6>10.0.18362.55</MicrosoftWindowsSDKNETRef10_0_18362PackageVersionNet6>
21+
<MicrosoftWindowsSDKNETRef10_0_19041PackageVersionNet6>10.0.19041.55</MicrosoftWindowsSDKNETRef10_0_19041PackageVersionNet6>
22+
<MicrosoftWindowsSDKNETRef10_0_20348PackageVersionNet6>10.0.20348.55</MicrosoftWindowsSDKNETRef10_0_20348PackageVersionNet6>
23+
<MicrosoftWindowsSDKNETRef10_0_22000PackageVersionNet6>10.0.22000.55</MicrosoftWindowsSDKNETRef10_0_22000PackageVersionNet6>
24+
<MicrosoftWindowsSDKNETRef10_0_22621PackageVersionNet6>10.0.22621.55</MicrosoftWindowsSDKNETRef10_0_22621PackageVersionNet6>
25+
<MicrosoftWindowsSDKNETRef10_0_26100PackageVersionNet6>10.0.26100.55</MicrosoftWindowsSDKNETRef10_0_26100PackageVersionNet6>
2626
</PropertyGroup>
2727

2828
</Project>

eng/Versions.props

+7-7
Original file line numberDiff line numberDiff line change
@@ -328,13 +328,13 @@
328328
<PropertyGroup Label="Workload manifest package versions">
329329
<AspireFeatureBand>8.0.100</AspireFeatureBand>
330330
<MicrosoftNETSdkAspireManifest80100PackageVersion>8.2.2</MicrosoftNETSdkAspireManifest80100PackageVersion>
331-
<MauiFeatureBand>9.0.100-rc.2</MauiFeatureBand>
332-
<MauiWorkloadManifestVersion>9.0.0-rc.2.24503.2</MauiWorkloadManifestVersion>
333-
<XamarinAndroidWorkloadManifestVersion>35.0.0-rc.2.152</XamarinAndroidWorkloadManifestVersion>
334-
<XamarinIOSWorkloadManifestVersion>18.0.9600-net9-rc2</XamarinIOSWorkloadManifestVersion>
335-
<XamarinMacCatalystWorkloadManifestVersion>18.0.9600-net9-rc2</XamarinMacCatalystWorkloadManifestVersion>
336-
<XamarinMacOSWorkloadManifestVersion>15.0.9600-net9-rc2</XamarinMacOSWorkloadManifestVersion>
337-
<XamarinTvOSWorkloadManifestVersion>18.0.9600-net9-rc2</XamarinTvOSWorkloadManifestVersion>
331+
<MauiFeatureBand>9.0.100</MauiFeatureBand>
332+
<MauiWorkloadManifestVersion>9.0.0</MauiWorkloadManifestVersion>
333+
<XamarinAndroidWorkloadManifestVersion>35.0.7</XamarinAndroidWorkloadManifestVersion>
334+
<XamarinIOSWorkloadManifestVersion>18.0.9617</XamarinIOSWorkloadManifestVersion>
335+
<XamarinMacCatalystWorkloadManifestVersion>18.0.9617</XamarinMacCatalystWorkloadManifestVersion>
336+
<XamarinMacOSWorkloadManifestVersion>15.0.9617</XamarinMacOSWorkloadManifestVersion>
337+
<XamarinTvOSWorkloadManifestVersion>18.0.9617</XamarinTvOSWorkloadManifestVersion>
338338
<!-- Workloads from dotnet/emsdk -->
339339
<MicrosoftNETWorkloadEmscriptenCurrentManifest90100PackageVersion>9.0.0</MicrosoftNETWorkloadEmscriptenCurrentManifest90100PackageVersion>
340340
<EmscriptenWorkloadManifestVersion>$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100PackageVersion)</EmscriptenWorkloadManifestVersion>

eng/pipelines/templates/steps/vmr-prepare.yml

+6-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ steps:
1010
displayName: Clone dotnet/dotnet
1111
path: vmr
1212
clean: true
13+
fetchTags: true
14+
fetchDepth: 0
1315

14-
- script: |
15-
git checkout --track origin/${{ parameters.vmrBranch }}
16-
echo "##vso[task.setvariable variable=vmrBranch]${{ parameters.vmrBranch }}"
16+
- powershell: |
17+
$branchName = "${{ parameters.vmrBranch }}" -replace "refs/heads/", ""
18+
git checkout --track origin/$branchName || exit 1
19+
echo "##vso[task.setvariable variable=vmrBranch]$branchName"
1720
displayName: Check out ${{ parameters.vmrBranch }}
1821
workingDirectory: $(Agent.BuildDirectory)/vmr
+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# This YAML is used by these PR pipelines:
2+
#
3+
# - dotnet-sdk-source-build-internal
4+
# https://dev.azure.com/dnceng/internal/_build?definitionId=1378
5+
6+
trigger: none
7+
pr:
8+
branches:
9+
include:
10+
- internal/release/*
11+
exclude:
12+
- internal/release/*.0.2xx
13+
- internal/release/*.0.3xx
14+
- internal/release/*.0.4xx
15+
16+
parameters:
17+
- name: vmrBranch
18+
displayName: dotnet/dotnet branch to push to
19+
type: string
20+
default: ' '
21+
22+
- name: disableBuild
23+
displayName: Skip the VMR Build stage
24+
type: boolean
25+
default: false
26+
27+
variables:
28+
- template: /eng/common/templates/variables/pool-providers.yml@self
29+
30+
- ${{ if ne(parameters.vmrBranch, ' ') }}:
31+
- name: VmrBranch
32+
value: ${{ replace(parameters.vmrBranch, ' ', '') }}
33+
- ${{ else }}:
34+
- name: VmrBranch
35+
value: ${{ replace(replace(variables['System.PullRequest.TargetBranch'], 'refs/heads/', ''), 'refs/pull/', '') }}
36+
37+
# enable source-only build for pipelines with the -source-build suffix
38+
- name: isSourceOnlyBuild
39+
value: ${{ contains(variables['Build.DefinitionName'], '-source-build') }}
40+
41+
resources:
42+
repositories:
43+
- repository: vmr
44+
name: dotnet-dotnet
45+
type: git
46+
ref: ${{ variables.VmrBranch }}
47+
48+
stages:
49+
# You can temporarily disable the VMR Build stage by setting the disableBuild variable
50+
- ${{ if not(parameters.disableBuild) }}:
51+
- template: templates/stages/vmr-build.yml
52+
parameters:
53+
vmrBranch: ${{ variables.VmrBranch }}
54+
isBuiltFromVmr: false
55+
isSourceOnlyBuild: ${{ variables.isSourceOnlyBuild }}
56+
${{ if contains(variables['Build.DefinitionName'], '-full') }}:
57+
scope: full
58+
${{ elseif eq(variables.isSourceOnlyBuild, 'true') }}:
59+
scope: ultralite
60+
${{ else }}:
61+
scope: lite
62+
63+
# In case the VMR Build stage is temporarily disabled, the VMR synchronization step is run to validate
64+
# that the PR can be merged and later synchronized into the VMR without problems.
65+
- ${{ else }}:
66+
- stage: Synchronize_VMR
67+
displayName: Synchronize VMR
68+
dependsOn: []
69+
jobs:
70+
- template: templates/jobs/vmr-synchronization.yml
71+
parameters:
72+
vmrBranch: ${{ variables.VmrBranch }}
73+
noPush: true

global.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"tools": {
3-
"dotnet": "9.0.100-rc.2.24474.11",
3+
"dotnet": "9.0.100",
44
"runtimes": {
55
"dotnet": [
66
"$(VSRedistCommonNetCoreSharedFrameworkx6490PackageVersion)"

src/Containers/Microsoft.NET.Build.Containers/LocalDaemons/DockerCli.cs

+158-9
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ internal sealed class DockerCli
3333
private string? _fullCommandPath;
3434
#endif
3535

36+
private const string _blobsPath = "blobs/sha256";
37+
3638
public DockerCli(string? command, ILoggerFactory loggerFactory)
3739
{
3840
if (!(command == null ||
@@ -104,8 +106,8 @@ public async Task LoadAsync(BuiltImage image, SourceImageReference sourceReferen
104106
}
105107

106108
// Create new stream tarball
107-
108-
await WriteImageToStreamAsync(image, sourceReference, destinationReference, loadProcess.StandardInput.BaseStream, cancellationToken).ConfigureAwait(false);
109+
// We want to be able to export to docker, even oci images.
110+
await WriteDockerImageToStreamAsync(image, sourceReference, destinationReference, loadProcess.StandardInput.BaseStream, cancellationToken).ConfigureAwait(false);
109111

110112
cancellationToken.ThrowIfCancellationRequested();
111113

@@ -270,13 +272,55 @@ public static bool IsInsecureRegistry(string registryDomain)
270272

271273
#if NET
272274
public static async Task WriteImageToStreamAsync(BuiltImage image, SourceImageReference sourceReference, DestinationImageReference destinationReference, Stream imageStream, CancellationToken cancellationToken)
275+
{
276+
if (image.ManifestMediaType == SchemaTypes.DockerManifestV2)
277+
{
278+
await WriteDockerImageToStreamAsync(image, sourceReference, destinationReference, imageStream, cancellationToken);
279+
}
280+
else if (image.ManifestMediaType == SchemaTypes.OciManifestV1)
281+
{
282+
await WriteOciImageToStreamAsync(image, sourceReference, destinationReference, imageStream, cancellationToken);
283+
}
284+
else
285+
{
286+
throw new ArgumentException(Resource.FormatString(nameof(Strings.UnsupportedMediaTypeForTarball), image.Manifest.MediaType));
287+
}
288+
}
289+
290+
private static async Task WriteDockerImageToStreamAsync(
291+
BuiltImage image,
292+
SourceImageReference sourceReference,
293+
DestinationImageReference destinationReference,
294+
Stream imageStream,
295+
CancellationToken cancellationToken)
273296
{
274297
cancellationToken.ThrowIfCancellationRequested();
275298
using TarWriter writer = new(imageStream, TarEntryFormat.Pax, leaveOpen: true);
276299

277300

278301
// Feed each layer tarball into the stream
279302
JsonArray layerTarballPaths = new();
303+
await WriteImageLayers(writer, image, sourceReference, d => $"{d.Substring("sha256:".Length)}/layer.tar", cancellationToken, layerTarballPaths)
304+
.ConfigureAwait(false);
305+
306+
string configTarballPath = $"{image.ImageSha}.json";
307+
await WriteImageConfig(writer, image, configTarballPath, cancellationToken)
308+
.ConfigureAwait(false);
309+
310+
// Add manifest
311+
await WriteManifestForDockerImage(writer, destinationReference, configTarballPath, layerTarballPaths, cancellationToken)
312+
.ConfigureAwait(false);
313+
}
314+
315+
private static async Task WriteImageLayers(
316+
TarWriter writer,
317+
BuiltImage image,
318+
SourceImageReference sourceReference,
319+
Func<string, string> layerPathFunc,
320+
CancellationToken cancellationToken,
321+
JsonArray? layerTarballPaths = null)
322+
{
323+
cancellationToken.ThrowIfCancellationRequested();
280324

281325
foreach (var d in image.LayerDescriptors)
282326
{
@@ -287,9 +331,9 @@ public static async Task WriteImageToStreamAsync(BuiltImage image, SourceImageRe
287331

288332
// Stuff that (uncompressed) tarball into the image tar stream
289333
// TODO uncompress!!
290-
string layerTarballPath = $"{d.Digest.Substring("sha256:".Length)}/layer.tar";
334+
string layerTarballPath = layerPathFunc(d.Digest);
291335
await writer.WriteEntryAsync(localPath, layerTarballPath, cancellationToken).ConfigureAwait(false);
292-
layerTarballPaths.Add(layerTarballPath);
336+
layerTarballPaths?.Add(layerTarballPath);
293337
}
294338
else
295339
{
@@ -299,21 +343,32 @@ public static async Task WriteImageToStreamAsync(BuiltImage image, SourceImageRe
299343
sourceReference.Registry?.ToString() ?? "<null>"));
300344
}
301345
}
346+
}
302347

303-
// add config
304-
string configTarballPath = $"{image.ImageSha}.json";
348+
private static async Task WriteImageConfig(
349+
TarWriter writer,
350+
BuiltImage image,
351+
string configPath,
352+
CancellationToken cancellationToken)
353+
{
305354
cancellationToken.ThrowIfCancellationRequested();
306355
using (MemoryStream configStream = new(Encoding.UTF8.GetBytes(image.Config)))
307356
{
308-
PaxTarEntry configEntry = new(TarEntryType.RegularFile, configTarballPath)
357+
PaxTarEntry configEntry = new(TarEntryType.RegularFile, configPath)
309358
{
310359
DataStream = configStream
311360
};
312-
313361
await writer.WriteEntryAsync(configEntry, cancellationToken).ConfigureAwait(false);
314362
}
363+
}
315364

316-
// Add manifest
365+
private static async Task WriteManifestForDockerImage(
366+
TarWriter writer,
367+
DestinationImageReference destinationReference,
368+
string configTarballPath,
369+
JsonArray layerTarballPaths,
370+
CancellationToken cancellationToken)
371+
{
317372
JsonArray tagsNode = new();
318373
foreach (string tag in destinationReference.Tags)
319374
{
@@ -339,6 +394,100 @@ public static async Task WriteImageToStreamAsync(BuiltImage image, SourceImageRe
339394
}
340395
}
341396

397+
private static async Task WriteOciImageToStreamAsync(
398+
BuiltImage image,
399+
SourceImageReference sourceReference,
400+
DestinationImageReference destinationReference,
401+
Stream imageStream,
402+
CancellationToken cancellationToken)
403+
{
404+
if (destinationReference.Tags.Length > 1)
405+
{
406+
throw new ArgumentException(Resource.FormatString(nameof(Strings.OciImageMultipleTagsNotSupported)));
407+
}
408+
409+
cancellationToken.ThrowIfCancellationRequested();
410+
using TarWriter writer = new(imageStream, TarEntryFormat.Pax, leaveOpen: true);
411+
412+
await WriteOciLayout(writer, cancellationToken)
413+
.ConfigureAwait(false);
414+
415+
await WriteImageLayers(writer, image, sourceReference, d => $"{_blobsPath}/{d.Substring("sha256:".Length)}", cancellationToken)
416+
.ConfigureAwait(false);
417+
418+
await WriteImageConfig(writer, image, $"{_blobsPath}/{image.ImageSha}", cancellationToken)
419+
.ConfigureAwait(false);
420+
421+
await WriteManifestForOciImage(writer, image, destinationReference, cancellationToken)
422+
.ConfigureAwait(false);
423+
}
424+
425+
private static async Task WriteOciLayout(TarWriter writer, CancellationToken cancellationToken)
426+
{
427+
cancellationToken.ThrowIfCancellationRequested();
428+
429+
string ociLayoutPath = "oci-layout";
430+
var ociLayoutContent = "{\"imageLayoutVersion\": \"1.0.0\"}";
431+
using (MemoryStream ociLayoutStream = new MemoryStream(Encoding.UTF8.GetBytes(ociLayoutContent)))
432+
{
433+
PaxTarEntry layoutEntry = new(TarEntryType.RegularFile, ociLayoutPath)
434+
{
435+
DataStream = ociLayoutStream
436+
};
437+
await writer.WriteEntryAsync(layoutEntry, cancellationToken).ConfigureAwait(false);
438+
}
439+
}
440+
441+
private static async Task WriteManifestForOciImage(
442+
TarWriter writer,
443+
BuiltImage image,
444+
DestinationImageReference destinationReference,
445+
CancellationToken cancellationToken)
446+
{
447+
cancellationToken.ThrowIfCancellationRequested();
448+
449+
string manifestContent = JsonSerializer.SerializeToNode(image.Manifest)!.ToJsonString();
450+
string manifestDigest = image.Manifest.GetDigest();
451+
452+
// 1. add manifest to blobs
453+
string manifestPath = $"{_blobsPath}/{manifestDigest.Substring("sha256:".Length)}";
454+
using (MemoryStream manifestStream = new MemoryStream(Encoding.UTF8.GetBytes(manifestContent)))
455+
{
456+
PaxTarEntry manifestEntry = new(TarEntryType.RegularFile, manifestPath)
457+
{
458+
DataStream = manifestStream
459+
};
460+
await writer.WriteEntryAsync(manifestEntry, cancellationToken).ConfigureAwait(false);
461+
}
462+
463+
cancellationToken.ThrowIfCancellationRequested();
464+
465+
// 2. add index.json
466+
var index = new ImageIndexV1
467+
{
468+
schemaVersion = 2,
469+
mediaType = SchemaTypes.OciImageIndexV1,
470+
manifests =
471+
[
472+
new PlatformSpecificOciManifest
473+
{
474+
mediaType = SchemaTypes.OciManifestV1,
475+
size = manifestContent.Length,
476+
digest = manifestDigest,
477+
annotations = new Dictionary<string, string> { { "org.opencontainers.image.ref.name", $"{destinationReference.Repository}:{destinationReference.Tags[0]}" } }
478+
}
479+
]
480+
};
481+
using (MemoryStream indexStream = new MemoryStream(Encoding.UTF8.GetBytes(JsonSerializer.SerializeToNode(index)!.ToJsonString())))
482+
{
483+
PaxTarEntry indexEntry = new(TarEntryType.RegularFile, "index.json")
484+
{
485+
DataStream = indexStream
486+
};
487+
await writer.WriteEntryAsync(indexEntry, cancellationToken).ConfigureAwait(false);
488+
}
489+
}
490+
342491
private async ValueTask<string?> GetCommandAsync(CancellationToken cancellationToken)
343492
{
344493
if (_command != null)

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public record struct ManifestListV2(int schemaVersion, string mediaType, Platfor
1010
public record struct PlatformInformation(string architecture, string os, string? variant, string[] features, [property: JsonPropertyName("os.version")][field: JsonPropertyName("os.version")] string? version);
1111

1212
public record struct PlatformSpecificManifest(string mediaType, long size, string digest, PlatformInformation platform);
13+
public record struct ImageIndexV1(int schemaVersion, string mediaType, PlatformSpecificOciManifest[] manifests);
1314

14-
public record struct ImageIndexV1(int schemaVersion, string mediaType, PlatformSpecificManifest[] manifests);
15+
public record struct PlatformSpecificOciManifest(string mediaType, long size, string digest, PlatformInformation platform, Dictionary<string, string> annotations);

0 commit comments

Comments
 (0)