From 1650b2cd945311e6021b5317d01e6940603ef738 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
Date: Wed, 21 Oct 2026 17:26:09 +0000
Subject: [PATCH 1/4] Backflow from https://github.com/dotnet/dotnet / fba04ff
build 337533
Diff: https://github.com/dotnet/dotnet/compare/985a731f3a4676c5a731541ec707685d4f4ea2ba..fba04ffe869680486931c78fd815b3f694087f91
From: https://github.com/dotnet/dotnet/commit/985a731f3a4676c5a731541ec707685d4f4ea2ba
To: https://github.com/dotnet/dotnet/commit/fba04ffe869680486931c78fd815b3f694087f91
[[ commit created by automation ]]
---
Directory.Build.targets | 2 +-
eng/Signing.props | 1 -
eng/Versions.props | 6 +-
eng/native/Info.plist.in | 12 +
eng/native/functions.cmake | 11 +
eng/packaging.targets | 2 +-
eng/toolAot.targets | 36 +
src/coreclr/.nuget/coreclr-packages.proj | 6 +-
src/coreclr/README.md | 22 +
src/coreclr/debug/createdump/CMakeLists.txt | 4 +
src/coreclr/ilasm/CMakeLists.txt | 4 +
src/coreclr/ildasm/exe/CMakeLists.txt | 4 +
.../aot/ILCompiler/ILCompiler_publish.csproj | 2 +
.../aot/crossgen2/crossgen2_publish.csproj | 2 +
.../Unix/System.Native/Interop.MkDirAt.cs | 14 +
.../Unix/System.Native/Interop.OpenAt.cs | 14 +
.../Unix/System.Native/Interop.OpenFlags.cs | 1 +
.../Unix/System.Native/Interop.UnlinkAt.cs | 22 +
.../Net/Http/HttpClientHandlerTest.Proxy.cs | 106 +++
.../System/Net/Http/LoopbackProxyServer.cs | 4 +-
src/libraries/Directory.Build.targets | 2 +-
.../System/Diagnostics/ProcessStartInfo.cs | 3 +-
.../tests/ProcessHandlesTests.Unix.cs | 112 +++
.../src/Resources/Strings.resx | 3 +
.../src/System.Formats.Tar.csproj | 8 +-
.../src/System/Formats/Tar/TarEntry.cs | 201 +++---
.../src/System/Formats/Tar/TarFile.cs | 27 +-
.../src/System/Formats/Tar/TarHelpers.Unix.cs | 41 ++
.../System/Formats/Tar/TarHelpers.Windows.cs | 63 +-
.../src/System/Formats/Tar/TarHelpers.cs | 320 +++++++++
.../TarFile.ExtractToDirectory.File.Tests.cs | 489 ++++++++++++-
.../SocketsHttpHandler/RedirectHandler.cs | 3 +-
.../src/System/Net/Security/SslStream.IO.cs | 12 +
.../System/Net/Security/SslStreamPal.Unix.cs | 4 +
.../SslStreamNetworkStreamTest.cs | 120 ++++
.../System.Private.CoreLib.Shared.projitems | 9 +
.../src/System/Globalization/DateTimeParse.cs | 20 +-
.../src/System/IO/SharedMemoryManager.Unix.cs | 662 +++++++++++-------
.../src/System/Threading/Mutex.Unix.cs | 14 +-
.../src/System/Threading/NamedMutex.Unix.cs | 62 +-
.../Xml/Core/LocalAppContextSwitches.cs | 12 +
.../src/System/Xml/Core/XmlTextReaderImpl.cs | 44 +-
.../System/Xml/Core/XmlTextReaderImplAsync.cs | 42 +-
.../tests/System.Private.Xml.Tests.csproj | 1 +
.../Tests/AttributeBufferInvalidationTests.cs | 94 +++
.../XmlCanonicalizationTest.cs | 3 +-
.../System/DateTimeTests.cs | 21 +
.../Pal/Windows/HelpersWindows.cs | 2 +-
.../Pkcs/Rfc3161TimestampRequest.cs | 2 +-
.../Security/Cryptography/Pkcs/SignedCms.cs | 186 ++++-
.../Security/Cryptography/Pkcs/SignerInfo.cs | 4 +-
.../EnvelopedCms/UnprotectedAttributeTests.cs | 35 +
.../tests/SignedCms/SignedCmsTests.cs | 153 ++++
.../src/Resources/Strings.resx | 12 +-
.../C14NAncestralNamespaceContextManager.cs | 12 +-
.../Security/Cryptography/Xml/CanonicalXml.cs | 11 +-
.../Cryptography/Xml/CanonicalXmlElement.cs | 4 +-
.../Security/Cryptography/Xml/EncryptedXml.cs | 310 ++++++--
.../ExcAncestralNamespaceContextManager.cs | 8 +-
.../Cryptography/Xml/ExcCanonicalXml.cs | 11 +-
.../Xml/LocalAppContextSwitches.cs | 70 ++
.../Security/Cryptography/Xml/SignedXml.cs | 367 ++++++----
.../Security/Cryptography/Xml/Transform.cs | 10 +-
.../Cryptography/Xml/TransformChain.cs | 11 +-
.../System/Security/Cryptography/Xml/Utils.cs | 276 +++++++-
.../Xml/XmlDecryptionTransform.cs | 69 +-
.../Xml/XmlDsigEnvelopedSignatureTransform.cs | 11 +-
.../Cryptography/Xml/XmlDsigXPathTransform.cs | 10 +-
.../Cryptography/Xml/XmlLicenseTransform.cs | 11 +
.../tests/EncryptedXmlTests.cs | 505 +++++++++++++
.../tests/SignedXmlTest.cs | 411 ++++++++++-
.../tests/SignedXmlTests.cs | 202 ++++++
.../SignedXml_SignatureMethodAlgorithm.cs | 29 +-
.../tests/XmlDecryptionTransformTest.cs | 184 ++++-
.../tests/XmlDsigC14NTransformTest.cs | 148 ++++
.../XmlDsigEnvelopedSignatureTransformTest.cs | 66 ++
.../tests/XmlDsigExcC14NTransformTest.cs | 173 +++++
.../tests/XmlDsigXPathTransformTest.cs | 66 ++
.../System.Threading/tests/MutexTests.cs | 75 ++
.../BrowserDebugProxy/EvaluateExpression.cs | 28 +-
.../browser/debugger/Directory.Build.props | 5 +
src/mono/mono/mini/CMakeLists.txt | 4 +
src/mono/nuget/Directory.Build.targets | 2 +-
src/mono/nuget/mono-packages.proj | 7 +-
...semblyNetDebugProxyAppBuilderExtensions.cs | 2 +-
src/native/corehost/dotnet/CMakeLists.txt | 4 +
src/native/corehost/hostmisc/pal.unix.cpp | 20 +-
src/native/corehost/hostpolicy/args.h | 4 +-
src/native/libs/System.Native/entrypoints.c | 3 +
src/native/libs/System.Native/pal_io.c | 77 +-
src/native/libs/System.Native/pal_io.h | 27 +
src/native/libs/System.Native/pal_process.c | 82 +--
.../Microsoft.NET.WebAssembly.Webcil.csproj | 1 +
src/tools/ilasm/src/ilasm/ilasm.csproj | 2 +
94 files changed, 5556 insertions(+), 823 deletions(-)
create mode 100644 eng/native/Info.plist.in
create mode 100644 src/libraries/Common/src/Interop/Unix/System.Native/Interop.MkDirAt.cs
create mode 100644 src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenAt.cs
create mode 100644 src/libraries/Common/src/Interop/Unix/System.Native/Interop.UnlinkAt.cs
create mode 100644 src/libraries/System.Private.Xml/tests/XmlReader/Tests/AttributeBufferInvalidationTests.cs
diff --git a/Directory.Build.targets b/Directory.Build.targets
index 193a0cd7065bd9..ea235b6827b289 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -54,7 +54,7 @@
Microsoft%AE .NET
$(ProductVersion)
- $(ProductVersion)
+ $(ProductVersion)
$(ProductVersion)-$(VersionSuffix)
diff --git a/eng/Signing.props b/eng/Signing.props
index 0cff4e67489b13..81cc4759f025cd 100644
--- a/eng/Signing.props
+++ b/eng/Signing.props
@@ -138,7 +138,6 @@
false
release
@@ -164,7 +164,7 @@
10.0.0-preview-20251006.1
- 2.5.10
+ 2.5.12
$(MicrosoftDotNetApiCompatTaskPackageVersion)
diff --git a/eng/native/Info.plist.in b/eng/native/Info.plist.in
new file mode 100644
index 00000000000000..3c70234d95104e
--- /dev/null
+++ b/eng/native/Info.plist.in
@@ -0,0 +1,12 @@
+
+
+
+
+
+ CFBundleIdentifier
+ ${MACOS_BUNDLE_IDENTIFIER}
+ CFBundleName
+ ${targetName}
+
+
diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake
index f7b11dcab7cb4c..237309bb958226 100644
--- a/eng/native/functions.cmake
+++ b/eng/native/functions.cmake
@@ -700,6 +700,17 @@ function(add_library_clr targetName kind)
endif()
endfunction()
+# Call only for concrete macOS executables, not apphost templates.
+function(set_macos_bundle_identifier targetName identifier)
+ set(MACOS_BUNDLE_IDENTIFIER "${identifier}")
+ set(infoPlist "${CMAKE_CURRENT_BINARY_DIR}/${targetName}.Info.plist")
+ configure_file("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/Info.plist.in" "${infoPlist}")
+
+ # Let signing tools use a stable identifier instead of a UUID-derived fallback.
+ target_link_options(${targetName} PRIVATE "LINKER:-sectcreate,__TEXT,__info_plist,${infoPlist}")
+ set_property(TARGET ${targetName} APPEND PROPERTY LINK_DEPENDS "${infoPlist}")
+endfunction()
+
# Adhoc sign targetName with the entitlements in entitlementsFile.
function(adhoc_sign_with_entitlements targetName entitlementsFile)
# Add a dependency from a source file for the target on the entitlements file to ensure that the target is rebuilt if only the entitlements file changes.
diff --git a/eng/packaging.targets b/eng/packaging.targets
index e5b1ee774dbbff..2437cb5e79d608 100644
--- a/eng/packaging.targets
+++ b/eng/packaging.targets
@@ -52,7 +52,7 @@
-
+
true
diff --git a/eng/toolAot.targets b/eng/toolAot.targets
index 69c54bdbd00b4b..2ad2ab58552fbd 100644
--- a/eng/toolAot.targets
+++ b/eng/toolAot.targets
@@ -28,4 +28,40 @@
+
+
+
+
+
+
+
+
+ <_HostInfoPlist>$(NativeIntermediateOutputPath)$(TargetName).Info.plist
+ <_HostBundleIdentifierXml>$(HostBundleIdentifier.Replace('&', '&').Replace('<', '<').Replace('>', '>').Replace("'", '''))
+ <_HostBundleNameXml>$(HostBundleName.Replace('&', '&').Replace('<', '<').Replace('>', '>').Replace("'", '''))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/coreclr/.nuget/coreclr-packages.proj b/src/coreclr/.nuget/coreclr-packages.proj
index b6b91f217ebe45..2b5b4c2e1dccec 100644
--- a/src/coreclr/.nuget/coreclr-packages.proj
+++ b/src/coreclr/.nuget/coreclr-packages.proj
@@ -12,8 +12,12 @@
-
+
+
+
+
+
diff --git a/src/coreclr/README.md b/src/coreclr/README.md
index eba8ddf3a998c6..3e2dd33aa11e0f 100644
--- a/src/coreclr/README.md
+++ b/src/coreclr/README.md
@@ -4,6 +4,28 @@ This folder contains the source for CoreCLR, the .NET runtime implementation
used by most workloads. CoreCLR tests live in [`../tests`](../tests/) (the
`src/tests` subtree).
+## macOS NativeAOT tool metadata
+
+NativeAOT tool publishing projects set `HostBundleIdentifier` and `HostBundleName`
+to embed an Info.plist in macOS executables. `eng/toolAot.targets` omits the optional
+bundle version keys because assembly versions do not follow Apple's bundle version
+format.
+Bundle identifiers use `com.microsoft.dotnet.` in lowercase;
+`HostBundleName` sets `CFBundleName` to the executable name without that prefix.
+Native CMake executables use the same identifier and name convention.
+Both builds use `eng/native/Info.plist.in`; NativeAOT generates it with
+`Microsoft.DotNet.Build.Tasks.Templating`.
+
+This metadata does not create an app bundle. Final signing should use the embedded
+bundle identifier, or explicitly supply the same value. The linker-generated ad
+hoc signature does not automatically use the embedded bundle identifier.
+`AdHocSignHost` applies the identifier after native linking and symbol stripping,
+before the executable is copied to its publish directory. It preserves existing
+entitlements, requirements, signing flags, hardened runtime version, and launch and
+library constraints while explicitly setting the identifier, without adding JIT
+entitlements. Official signing must preserve the identifier and security settings
+or explicitly supply the same values.
+
## Building and testing
See the workflow docs for the authoritative instructions — they cover the
diff --git a/src/coreclr/debug/createdump/CMakeLists.txt b/src/coreclr/debug/createdump/CMakeLists.txt
index bdd648c2670c3c..f3f8fbd2d475c9 100644
--- a/src/coreclr/debug/createdump/CMakeLists.txt
+++ b/src/coreclr/debug/createdump/CMakeLists.txt
@@ -106,6 +106,10 @@ endif(CLR_CMAKE_HOST_WIN32)
target_link_libraries(createdump PRIVATE minipal)
+if(CLR_CMAKE_TARGET_OSX)
+ set_macos_bundle_identifier(createdump com.microsoft.dotnet.createdump)
+endif()
+
if (CLR_CMAKE_HOST_APPLE)
adhoc_sign_with_entitlements(createdump "${CLR_ENG_NATIVE_DIR}/createdump-entitlements.plist")
endif()
diff --git a/src/coreclr/ilasm/CMakeLists.txt b/src/coreclr/ilasm/CMakeLists.txt
index 4830d08cea717a..e600f9246f4550 100644
--- a/src/coreclr/ilasm/CMakeLists.txt
+++ b/src/coreclr/ilasm/CMakeLists.txt
@@ -75,6 +75,10 @@ add_executable_clr(ilasm
${ILASM_RESOURCES}
)
+if(CLR_CMAKE_TARGET_OSX)
+ set_macos_bundle_identifier(ilasm com.microsoft.dotnet.ilasm)
+endif()
+
set(ILASM_LINK_LIBRARIES
utilcodestaticnohost
mscorpe
diff --git a/src/coreclr/ildasm/exe/CMakeLists.txt b/src/coreclr/ildasm/exe/CMakeLists.txt
index a1b3291c9847ae..e6b7531ad26d33 100644
--- a/src/coreclr/ildasm/exe/CMakeLists.txt
+++ b/src/coreclr/ildasm/exe/CMakeLists.txt
@@ -58,6 +58,10 @@ add_executable_clr(ildasm
${ILDASM_RESOURCES}
)
+if(CLR_CMAKE_TARGET_OSX)
+ set_macos_bundle_identifier(ildasm com.microsoft.dotnet.ildasm)
+endif()
+
set(ILDASM_LINK_LIBRARIES
mdcompiler_wks
mdruntime_wks
diff --git a/src/coreclr/tools/aot/ILCompiler/ILCompiler_publish.csproj b/src/coreclr/tools/aot/ILCompiler/ILCompiler_publish.csproj
index 239e3f83618a1b..e6fc3bd6592d09 100644
--- a/src/coreclr/tools/aot/ILCompiler/ILCompiler_publish.csproj
+++ b/src/coreclr/tools/aot/ILCompiler/ILCompiler_publish.csproj
@@ -9,6 +9,8 @@
true
false
true
+ com.microsoft.dotnet.ilc
+ ilc
true
diff --git a/src/coreclr/tools/aot/crossgen2/crossgen2_publish.csproj b/src/coreclr/tools/aot/crossgen2/crossgen2_publish.csproj
index f5f2fe11f65886..ccb1ceaef713f1 100644
--- a/src/coreclr/tools/aot/crossgen2/crossgen2_publish.csproj
+++ b/src/coreclr/tools/aot/crossgen2/crossgen2_publish.csproj
@@ -9,6 +9,8 @@
true
false
true
+ com.microsoft.dotnet.crossgen2
+ crossgen2
true
diff --git a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.MkDirAt.cs b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.MkDirAt.cs
new file mode 100644
index 00000000000000..2ba471d05f4ab7
--- /dev/null
+++ b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.MkDirAt.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+internal static partial class Interop
+{
+ internal static partial class Sys
+ {
+ [LibraryImport(Libraries.SystemNative, EntryPoint = "SystemNative_MkDirAt", StringMarshalling = StringMarshalling.Utf8, SetLastError = true)]
+ internal static partial int MkDirAt(SafeFileHandle directoryHandle, string path, int mode);
+ }
+}
diff --git a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenAt.cs b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenAt.cs
new file mode 100644
index 00000000000000..18f7676e56e21c
--- /dev/null
+++ b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenAt.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+internal static partial class Interop
+{
+ internal static partial class Sys
+ {
+ [LibraryImport(Libraries.SystemNative, EntryPoint = "SystemNative_OpenAt", StringMarshalling = StringMarshalling.Utf8, SetLastError = true)]
+ internal static partial SafeFileHandle OpenAt(SafeFileHandle directoryHandle, string path, OpenFlags flags, int mode);
+ }
+}
diff --git a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenFlags.cs b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenFlags.cs
index 7ab07052048f8b..6c5fa331c599e8 100644
--- a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenFlags.cs
+++ b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.OpenFlags.cs
@@ -22,6 +22,7 @@ internal enum OpenFlags
O_TRUNC = 0x0080,
O_SYNC = 0x0100,
O_NOFOLLOW = 0x0200,
+ O_DIRECTORY = 0x1000,
}
}
}
diff --git a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.UnlinkAt.cs b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.UnlinkAt.cs
new file mode 100644
index 00000000000000..59da84dc6dcf77
--- /dev/null
+++ b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.UnlinkAt.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+internal static partial class Interop
+{
+ internal static partial class Sys
+ {
+ [Flags]
+ internal enum UnlinkAtFlags
+ {
+ None = 0,
+ AT_REMOVEDIR = 0x0001,
+ }
+
+ [LibraryImport(Libraries.SystemNative, EntryPoint = "SystemNative_UnlinkAt", StringMarshalling = StringMarshalling.Utf8, SetLastError = true)]
+ internal static partial int UnlinkAt(SafeFileHandle directoryHandle, string path, UnlinkAtFlags flags);
+ }
+}
diff --git a/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Proxy.cs b/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Proxy.cs
index 51453a32eaccf0..c6b3d8f94a48c7 100644
--- a/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Proxy.cs
+++ b/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Proxy.cs
@@ -782,6 +782,112 @@ public static IEnumerable
This should launch a new browser window with debugging enabled..
Underlying exception:
-{ex}
+{WebUtility.HtmlEncode(ex.ToString())}
");
return;
diff --git a/src/native/corehost/dotnet/CMakeLists.txt b/src/native/corehost/dotnet/CMakeLists.txt
index dab92ad6518576..55602c0f70c18e 100644
--- a/src/native/corehost/dotnet/CMakeLists.txt
+++ b/src/native/corehost/dotnet/CMakeLists.txt
@@ -24,6 +24,10 @@ add_executable(dotnet ${SOURCES})
target_link_libraries(dotnet PRIVATE hostmisc fxr_resolver)
+if(CLR_CMAKE_TARGET_OSX)
+ set_macos_bundle_identifier(dotnet com.microsoft.dotnet.dotnet)
+endif()
+
add_sanitizer_runtime_support(dotnet)
if(NOT CLR_CMAKE_TARGET_WIN32)
diff --git a/src/native/corehost/hostmisc/pal.unix.cpp b/src/native/corehost/hostmisc/pal.unix.cpp
index 3663716c232fcd..be613a0c688e58 100644
--- a/src/native/corehost/hostmisc/pal.unix.cpp
+++ b/src/native/corehost/hostmisc/pal.unix.cpp
@@ -186,9 +186,7 @@ bool pal::get_default_breadcrumb_store(string_t* recv)
if (!pal::directory_exists(ext))
{
trace::info(_X("Directory core breadcrumbs [%s] was not specified or found"), ext.c_str());
- ext.clear();
- append_path(&ext, _X("opt"));
- append_path(&ext, _X("corebreadcrumbs"));
+ ext.assign(DIR_SEPARATOR_STR _X("opt") DIR_SEPARATOR_STR _X("corebreadcrumbs"));
if (!pal::directory_exists(ext))
{
trace::info(_X("Fallback directory core breadcrumbs at [%s] was not found"), ext.c_str());
@@ -196,9 +194,11 @@ bool pal::get_default_breadcrumb_store(string_t* recv)
}
}
- if (access(ext.c_str(), (R_OK | W_OK)) != 0)
+ // Writing breadcrumbs creates files at known paths, which requires write and search permission on the directory.
+ if (access(ext.c_str(), (W_OK | X_OK)) != 0)
{
- trace::info(_X("Breadcrumb store [%s] is not ACL-ed with rw-"), ext.c_str());
+ trace::info(_X("Breadcrumb store [%s] is not writable"), ext.c_str());
+ return false;
}
recv->assign(ext);
@@ -218,9 +218,7 @@ bool pal::get_default_servicing_directory(string_t* recv)
if (!pal::directory_exists(ext))
{
trace::info(_X("Directory core servicing at [%s] was not specified or found"), ext.c_str());
- ext.clear();
- append_path(&ext, _X("opt"));
- append_path(&ext, _X("coreservicing"));
+ ext.assign(DIR_SEPARATOR_STR _X("opt") DIR_SEPARATOR_STR _X("coreservicing"));
if (!pal::directory_exists(ext))
{
trace::info(_X("Fallback directory core servicing at [%s] was not found"), ext.c_str());
@@ -228,9 +226,11 @@ bool pal::get_default_servicing_directory(string_t* recv)
}
}
- if (access(ext.c_str(), R_OK) != 0)
+ // Servicing assets are looked up by known path, which requires search permission on the directory.
+ if (access(ext.c_str(), X_OK) != 0)
{
- trace::info(_X("Directory core servicing at [%s] was not ACL-ed properly"), ext.c_str());
+ trace::info(_X("Directory core servicing at [%s] is not accessible"), ext.c_str());
+ return false;
}
recv->assign(ext);
diff --git a/src/native/corehost/hostpolicy/args.h b/src/native/corehost/hostpolicy/args.h
index 0539e7e3d1edc4..279f158ebd7159 100644
--- a/src/native/corehost/hostpolicy/args.h
+++ b/src/native/corehost/hostpolicy/args.h
@@ -67,7 +67,9 @@ struct probe_config_t
, probe_deps_json(nullptr)
, fx_level(-1)
, only_runtime_assets(false)
- { }
+ {
+ assert(probe_type == type::app || pal::is_path_fully_qualified(probe_dir));
+ }
bool is_lookup() const
{
diff --git a/src/native/libs/System.Native/entrypoints.c b/src/native/libs/System.Native/entrypoints.c
index 78e08565015511..79380d874dd302 100644
--- a/src/native/libs/System.Native/entrypoints.c
+++ b/src/native/libs/System.Native/entrypoints.c
@@ -61,9 +61,11 @@ static const Entry s_sysNative[] =
DllImportEntry(SystemNative_Stat)
DllImportEntry(SystemNative_LStat)
DllImportEntry(SystemNative_Open)
+ DllImportEntry(SystemNative_OpenAt)
DllImportEntry(SystemNative_Close)
DllImportEntry(SystemNative_Dup)
DllImportEntry(SystemNative_Unlink)
+ DllImportEntry(SystemNative_UnlinkAt)
DllImportEntry(SystemNative_IsMemfdSupported)
DllImportEntry(SystemNative_MemfdCreate)
DllImportEntry(SystemNative_ShmOpen)
@@ -81,6 +83,7 @@ static const Entry s_sysNative[] =
DllImportEntry(SystemNative_FcntlSetIsNonBlocking)
DllImportEntry(SystemNative_FcntlGetIsNonBlocking)
DllImportEntry(SystemNative_MkDir)
+ DllImportEntry(SystemNative_MkDirAt)
DllImportEntry(SystemNative_ChMod)
DllImportEntry(SystemNative_FChMod)
DllImportEntry(SystemNative_FSync)
diff --git a/src/native/libs/System.Native/pal_io.c b/src/native/libs/System.Native/pal_io.c
index ebfb79d6287032..1ae712017d94cc 100644
--- a/src/native/libs/System.Native/pal_io.c
+++ b/src/native/libs/System.Native/pal_io.c
@@ -306,7 +306,7 @@ static int32_t ConvertOpenFlags(int32_t flags)
return -1;
}
- if (flags & ~(PAL_O_ACCESS_MODE_MASK | PAL_O_CLOEXEC | PAL_O_CREAT | PAL_O_EXCL | PAL_O_TRUNC | PAL_O_SYNC | PAL_O_NOFOLLOW))
+ if (flags & ~(PAL_O_ACCESS_MODE_MASK | PAL_O_CLOEXEC | PAL_O_CREAT | PAL_O_EXCL | PAL_O_TRUNC | PAL_O_SYNC | PAL_O_NOFOLLOW | PAL_O_DIRECTORY))
{
assert_msg(false, "Unknown Open flag", (int)flags);
return -1;
@@ -326,18 +326,15 @@ static int32_t ConvertOpenFlags(int32_t flags)
ret |= O_SYNC;
if (flags & PAL_O_NOFOLLOW)
ret |= O_NOFOLLOW;
+ if (flags & PAL_O_DIRECTORY)
+ ret |= O_DIRECTORY;
assert(ret != -1);
return ret;
}
-intptr_t SystemNative_Open(const char* path, int32_t flags, int32_t mode)
+static int32_t ConvertOpenFlagsAndAddDefaults(int32_t flags)
{
-// these two ifdefs are for platforms where we dont have the open version of CLOEXEC and thus
-// must simulate it by doing a fcntl with the SETFFD version after the open instead
-#if !HAVE_O_CLOEXEC
- int32_t old_flags = flags;
-#endif
flags = ConvertOpenFlags(flags);
if (flags == -1)
{
@@ -351,15 +348,47 @@ intptr_t SystemNative_Open(const char* path, int32_t flags, int32_t mode)
#ifndef TARGET_WASM
flags |= O_NOCTTY;
#endif
+ return flags;
+}
- int result;
- while ((result = open(path, flags, (mode_t)mode)) < 0 && errno == EINTR);
+static void SetCloseOnExecIfNeeded(int result, int32_t flags)
+{
#if !HAVE_O_CLOEXEC
- if (old_flags & PAL_O_CLOEXEC)
+ if (result >= 0 && (flags & PAL_O_CLOEXEC))
{
fcntl(result, F_SETFD, FD_CLOEXEC);
}
+#else
+ (void)result;
+ (void)flags;
#endif
+}
+
+intptr_t SystemNative_Open(const char* path, int32_t flags, int32_t mode)
+{
+ int32_t nativeFlags = ConvertOpenFlagsAndAddDefaults(flags);
+ if (nativeFlags == -1)
+ {
+ return -1;
+ }
+
+ int result;
+ while ((result = open(path, nativeFlags, (mode_t)mode)) < 0 && errno == EINTR);
+ SetCloseOnExecIfNeeded(result, flags);
+ return result;
+}
+
+intptr_t SystemNative_OpenAt(intptr_t dirfd, const char* path, int32_t flags, int32_t mode)
+{
+ int32_t nativeFlags = ConvertOpenFlagsAndAddDefaults(flags);
+ if (nativeFlags == -1)
+ {
+ return -1;
+ }
+
+ int result;
+ while ((result = openat(ToFileDescriptor(dirfd), path, nativeFlags, (mode_t)mode)) < 0 && errno == EINTR);
+ SetCloseOnExecIfNeeded(result, flags);
return result;
}
@@ -394,6 +423,27 @@ int32_t SystemNative_Unlink(const char* path)
return result;
}
+int32_t SystemNative_UnlinkAt(intptr_t dirfd, const char* path, int32_t flags)
+{
+ int nativeFlags;
+ switch (flags)
+ {
+ case 0:
+ nativeFlags = 0;
+ break;
+ case PAL_AT_REMOVEDIR:
+ nativeFlags = AT_REMOVEDIR;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ int32_t result;
+ while ((result = unlinkat(ToFileDescriptor(dirfd), path, nativeFlags)) < 0 && errno == EINTR);
+ return result;
+}
+
#ifdef __NR_memfd_create
#ifndef MFD_CLOEXEC
#define MFD_CLOEXEC 0x0001U
@@ -761,6 +811,13 @@ int32_t SystemNative_MkDir(const char* path, int32_t mode)
return result;
}
+int32_t SystemNative_MkDirAt(intptr_t dirfd, const char* path, int32_t mode)
+{
+ int32_t result;
+ while ((result = mkdirat(ToFileDescriptor(dirfd), path, (mode_t)mode)) < 0 && errno == EINTR);
+ return result;
+}
+
int32_t SystemNative_ChMod(const char* path, int32_t mode)
{
#if HAVE_CHMOD
diff --git a/src/native/libs/System.Native/pal_io.h b/src/native/libs/System.Native/pal_io.h
index 10332df8043230..6d62d40677166b 100644
--- a/src/native/libs/System.Native/pal_io.h
+++ b/src/native/libs/System.Native/pal_io.h
@@ -183,6 +183,12 @@ enum
PAL_O_NOFOLLOW = 0x0200, // Fails to open the target if it's a symlink, parent symlinks are allowed
PAL_O_NONBLOCK_READ = 0x0400, // Set O_NONBLOCK on the read end of a pipe
PAL_O_NONBLOCK_WRITE = 0x0800, // Set O_NONBLOCK on the write end of a pipe
+ PAL_O_DIRECTORY = 0x1000, // Fails to open the target if it's not a directory
+};
+
+enum
+{
+ PAL_AT_REMOVEDIR = 0x0001, // Remove the entry as a directory
};
/**
@@ -375,6 +381,13 @@ PALEXPORT int32_t SystemNative_LStat(const char* path, FileStatus* output);
*/
PALEXPORT intptr_t SystemNative_Open(const char* path, int32_t flags, int32_t mode);
+/**
+ * Open or create a file or device relative to a directory descriptor. Implemented as shim to openat(2).
+ *
+ * Returns file descriptor or -1 for failure. Sets errno on failure.
+ */
+PALEXPORT intptr_t SystemNative_OpenAt(intptr_t dirfd, const char* path, int32_t flags, int32_t mode);
+
/**
* Close a file descriptor. Implemented as shim to open(2).
*
@@ -396,6 +409,13 @@ PALEXPORT intptr_t SystemNative_Dup(intptr_t oldfd);
*/
PALEXPORT int32_t SystemNative_Unlink(const char* path);
+/**
+ * Delete an entry relative to a directory descriptor. Implemented as shim to unlinkat(2).
+ *
+ * Returns 0 for success, -1 for failure. Sets errno on failure.
+ */
+PALEXPORT int32_t SystemNative_UnlinkAt(intptr_t dirfd, const char* path, int32_t flags);
+
/**
* Check if the system supports memfd_create(2).
*
@@ -520,6 +540,13 @@ PALEXPORT int32_t SystemNative_FcntlGetIsNonBlocking(intptr_t fd, int32_t* isNon
*/
PALEXPORT int32_t SystemNative_MkDir(const char* path, int32_t mode);
+/**
+ * Create a directory relative to a directory descriptor. Implemented as a shim to mkdirat(2).
+ *
+ * Returns 0 for success, -1 for failure. Sets errno for failure.
+ */
+PALEXPORT int32_t SystemNative_MkDirAt(intptr_t dirfd, const char* path, int32_t mode);
+
/**
* Change permissions of a file. Implemented as a shim to chmod(2).
*
diff --git a/src/native/libs/System.Native/pal_process.c b/src/native/libs/System.Native/pal_process.c
index c5af90e397287e..3c138380877c93 100644
--- a/src/native/libs/System.Native/pal_process.c
+++ b/src/native/libs/System.Native/pal_process.c
@@ -24,7 +24,7 @@
#include
#if defined(__linux__)
-#if !defined(HAVE_CLOSE_RANGE)
+#if !HAVE_CLOSE_RANGE
#include
#if !defined(__NR_close_range)
// close_range was added in Linux 5.9. The syscall number is 436 for all
@@ -37,7 +37,7 @@
# define __NR_close_range 436
# endif
#endif // !defined(__NR_close_range)
-#endif // !defined(HAVE_CLOSE_RANGE)
+#endif // !HAVE_CLOSE_RANGE
#endif // defined(__linux__)
#if (HAVE_CLOSE_RANGE || defined(__NR_close_range)) && !defined(CLOSE_RANGE_CLOEXEC)
#define CLOSE_RANGE_CLOEXEC (1U << 2)
@@ -246,44 +246,16 @@ static int SetCloexecForFd(void* context, int fd)
}
#endif
-// Used when OS-specific bulk methods (close_range, fdwalk) are unavailable or fail.
-// Always sets FD_CLOEXEC rather than closing fds directly. Closing fds directly would close
-// waitForChildToExecPipe[WRITE_END_OF_PIPE] (which has O_CLOEXEC), making it impossible to
-// report exec() failures back to the parent when execve() fails after RestrictHandleInheritance.
-static void SetCloexecForAllFdsFallback(void)
-{
- struct rlimit rl;
- int maxFd;
- if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_cur != RLIM_INFINITY)
- {
- maxFd = (int)rl.rlim_cur;
- }
- else
- {
- maxFd = (int)sysconf(_SC_OPEN_MAX);
- if (maxFd <= 0)
- {
- maxFd = 65536; // reasonable upper bound
- }
- }
-
- // Fallback: iterate over all file descriptors and set FD_CLOEXEC on each open one >= 3.
- for (int fd = 3; fd < maxFd; fd++)
- {
- int flags = fcntl(fd, F_GETFD);
- if (flags == -1)
- {
- continue; // fd not open
- }
-
- if ((flags & FD_CLOEXEC) == 0)
- {
- fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
- }
- }
-}
-
-static void RestrictHandleInheritance(int32_t* inheritedFds, int32_t inheritedFdCount)
+// Returns 0 on success, or -1 (with errno set to ENOTSUP) if this platform/kernel doesn't provide
+// a performant native way (close_range()/fdwalk()) to restrict which fds a child process inherits.
+//
+// We intentionally do NOT fall back to manually scanning every possible fd via fcntl() in that
+// case: without close_range()/fdwalk(), there is no reliable way to learn only the fds that are
+// actually open, so such a scan would need to cover the entire valid fd range (up to INT_MAX) to
+// be correct -- something that has been measured to take multiple minutes of CPU time per
+// Process.Start call. That's not an acceptable cost, so we report failure instead and let the
+// managed layer surface a clear, actionable error.
+static int32_t RestrictHandleInheritance(int32_t* inheritedFds, int32_t inheritedFdCount)
{
// FDs 0-2 are stdin/stdout/stderr; this method must be called AFTER the dup2 calls.
// We always set FD_CLOEXEC rather than closing fds directly. This is critical because
@@ -291,29 +263,27 @@ static void RestrictHandleInheritance(int32_t* inheritedFds, int32_t inheritedFd
// until execve() is called so that exec failures can be reported back to the parent.
// Using closefrom() or close_range() with flag 0 (direct close) would destroy this pipe.
+ int result;
#if HAVE_CLOSE_RANGE
// On systems where close_range() is available as a function (FreeBSD 12.2+, Linux glibc >= 2.34).
- if (close_range(3, UINT_MAX, CLOSE_RANGE_CLOEXEC) != 0)
- {
- SetCloexecForAllFdsFallback();
- }
+ result = close_range(3, UINT_MAX, CLOSE_RANGE_CLOEXEC);
#elif defined(__NR_close_range)
// On Linux with older glibc that doesn't expose close_range() as a function,
// use the raw syscall number if the kernel supports it (kernel >= 5.9).
- if (syscall(__NR_close_range, 3, UINT_MAX, CLOSE_RANGE_CLOEXEC) != 0)
- {
- SetCloexecForAllFdsFallback();
- }
+ result = (int)syscall(__NR_close_range, 3, UINT_MAX, CLOSE_RANGE_CLOEXEC);
#elif HAVE_FDWALK
// On Illumos/Solaris, use fdwalk() to set FD_CLOEXEC on all open fds >= 3.
- if (fdwalk(SetCloexecForFd, NULL) != 0)
- {
- SetCloexecForAllFdsFallback();
- }
+ result = fdwalk(SetCloexecForFd, NULL);
#else
- SetCloexecForAllFdsFallback();
+ result = -1;
#endif
+ if (result != 0)
+ {
+ errno = ENOTSUP;
+ return -1;
+ }
+
// Remove CLOEXEC from user-provided inherited file descriptors so they survive execve.
for (int i = 0; i < inheritedFdCount; i++)
{
@@ -327,6 +297,8 @@ static void RestrictHandleInheritance(int32_t* inheritedFds, int32_t inheritedFd
}
}
}
+
+ return 0;
}
// Forward declaration of the internal fork+exec function
@@ -907,9 +879,9 @@ static int32_t ForkAndExecProcessInternal(
}
}
- if (inheritedFdCount >= 0)
+ if (inheritedFdCount >= 0 && RestrictHandleInheritance(inheritedFds, inheritedFdCount) != 0)
{
- RestrictHandleInheritance(inheritedFds, inheritedFdCount);
+ ExitChild(waitForChildToExecPipe[WRITE_END_OF_PIPE], errno);
}
#if HAVE_PR_SET_PDEATHSIG
diff --git a/src/tasks/Microsoft.NET.WebAssembly.Webcil/Microsoft.NET.WebAssembly.Webcil.csproj b/src/tasks/Microsoft.NET.WebAssembly.Webcil/Microsoft.NET.WebAssembly.Webcil.csproj
index e582aeabfe42a0..5fe4db7356ba80 100644
--- a/src/tasks/Microsoft.NET.WebAssembly.Webcil/Microsoft.NET.WebAssembly.Webcil.csproj
+++ b/src/tasks/Microsoft.NET.WebAssembly.Webcil/Microsoft.NET.WebAssembly.Webcil.csproj
@@ -2,6 +2,7 @@
$(NetCoreAppToolCurrent);$(NetFrameworkToolCurrent)
+ AnyCPU
Abstractions for modifying .NET webcil binary images
true
true
diff --git a/src/tools/ilasm/src/ilasm/ilasm.csproj b/src/tools/ilasm/src/ilasm/ilasm.csproj
index 8a1e3d9fe0a6b4..16c04c3963be8a 100644
--- a/src/tools/ilasm/src/ilasm/ilasm.csproj
+++ b/src/tools/ilasm/src/ilasm/ilasm.csproj
@@ -11,6 +11,8 @@
true
true
true
+ com.microsoft.dotnet.ilasm
+ ilasm
true
enable
From 7eafccdefb79e90412ce29dca106e5892e904a50 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
Date: Wed, 21 Oct 2026 17:26:18 +0000
Subject: [PATCH 2/4] Update dependencies from build 337533 Updated
Dependencies: Microsoft.CodeAnalysis, Microsoft.CodeAnalysis.Analyzers,
Microsoft.CodeAnalysis.BannedApiAnalyzers, Microsoft.CodeAnalysis.CSharp,
Microsoft.Net.Compilers.Toolset (Version 5.12.0-1.26465.108 ->
5.12.0-1.26520.139) Microsoft.CodeAnalysis.NetAnalyzers,
Microsoft.DotNet.ApiCompat.Task (Version 11.0.100-rc.2.26465.108 -> 11.0.100)
Microsoft.DotNet.Arcade.Sdk, Microsoft.DotNet.Build.Tasks.Archives,
Microsoft.DotNet.Build.Tasks.Feed, Microsoft.DotNet.Build.Tasks.FileCatalog,
Microsoft.DotNet.Build.Tasks.Installers,
Microsoft.DotNet.Build.Tasks.Packaging,
Microsoft.DotNet.Build.Tasks.TargetFramework,
Microsoft.DotNet.Build.Tasks.Templating, Microsoft.DotNet.CodeAnalysis,
Microsoft.DotNet.GenAPI, Microsoft.DotNet.GenFacades,
Microsoft.DotNet.Helix.JobMonitor, Microsoft.DotNet.Helix.Sdk,
Microsoft.DotNet.PackageTesting, Microsoft.DotNet.RemoteExecutor,
Microsoft.DotNet.SharedFramework.Sdk, Microsoft.DotNet.XliffTasks,
Microsoft.DotNet.XUnitExtensions (Version 11.0.0-beta.26465.108 ->
11.0.0-beta.26520.139) Microsoft.DotNet.Cecil (Version
0.11.5-preview.26465.108 -> 0.11.5-preview.26520.139)
Microsoft.DotNet.XUnitConsoleRunner (Version 2.9.3-beta.26465.108 ->
2.9.3-beta.26520.139) Microsoft.NET.Runtime.Emscripten.Internal,
Microsoft.NET.Sdk.IL, Microsoft.NETCore.App.Ref, Microsoft.NETCore.ILAsm,
runtime.native.System.IO.Ports, System.Reflection.Metadata,
System.Reflection.MetadataLoadContext, System.Text.Json (Version
11.0.0-rc.2.26465.108 -> 11.0.0)
Microsoft.NET.Workload.Emscripten.Current.Manifest-11.0.100.Transport
(Version 11.0.100-rc.2.26465.108 -> 11.0.100-rtm.26520.139) NuGet.Frameworks,
NuGet.Packaging, NuGet.ProjectModel, NuGet.Versioning (Version
7.12.0-rc.46608 -> 8.0.0-rc.52239) System.CommandLine (Version
3.0.0-rc.2.26465.108 -> 3.0.0)
runtime.linux-arm64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.linux-x64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.linux-musl-x64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.win-arm64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.win-x64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.osx-arm64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.osx-x64.Microsoft.NETCore.Runtime.JIT.Tools,
runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.linux-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,
runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,
runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.linux-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,
runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,
runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.win-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,
runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.osx-arm64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools,
runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Libclang,
runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Sdk,
runtime.osx-x64.Microsoft.NETCore.Runtime.Mono.LLVM.Tools (Version
23.1.0-alpha.1.26457.1 -> 23.1.0-alpha.1.26505.4)
runtime.linux-arm64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.linux-musl-arm64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.linux-x64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.linux-musl-x64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.osx-arm64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.osx-x64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.win-arm64.Microsoft.NETCore.Runtime.Wasm.Node.Transport,
runtime.win-x64.Microsoft.NETCore.Runtime.Wasm.Node.Transport (Version
11.0.0-alpha.1.26459.1 -> 11.0.0-alpha.1.26517.3) [[ commit created by
automation ]]
---
.config/dotnet-tools.json | 2 +-
NuGet.config | 5 +
eng/Version.Details.props | 156 ++++-----
eng/Version.Details.xml | 314 +++++++++---------
eng/common/Get-GitHubAppToken.ps1 | 123 ++++---
.../core-templates/job/helix-job-monitor.yml | 135 +++-----
eng/common/core-templates/job/onelocbuild.yml | 8 +-
.../steps/get-github-app-token.yml | 29 +-
.../core-templates/steps/send-to-helix.yml | 260 +++++++++------
eng/common/run-helix-job-monitor.sh | 64 ++++
global.json | 12 +-
11 files changed, 615 insertions(+), 493 deletions(-)
create mode 100644 eng/common/run-helix-job-monitor.sh
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 1db426b3f1f0ee..a595194b964a0e 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -27,7 +27,7 @@
]
},
"microsoft.dotnet.helix.jobmonitor": {
- "version": "11.0.0-beta.26465.108",
+ "version": "11.0.0-beta.26520.139",
"commands": [
"dotnet-helix-job-monitor"
]
diff --git a/NuGet.config b/NuGet.config
index 5e7e33e4a5838b..edc8f075911c12 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -7,6 +7,11 @@
+
+
+
+
+
- 5.12.0-1.26465.108
- 5.12.0-1.26465.108
- 5.12.0-1.26465.108
- 5.12.0-1.26465.108
- 11.0.100-rc.2.26465.108
- 11.0.100-rc.2.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 0.11.5-preview.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
- 11.0.0-beta.26465.108
+ 5.12.0-1.26520.139
+ 5.12.0-1.26520.139
+ 5.12.0-1.26520.139
+ 5.12.0-1.26520.139
+ 11.0.100
+ 11.0.100
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 0.11.5-preview.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
+ 11.0.0-beta.26520.139
3.2.2-beta.26257.113
- 2.9.3-beta.26465.108
- 11.0.0-beta.26465.108
- 5.12.0-1.26465.108
- 11.0.0-rc.2.26465.108
- 11.0.0-rc.2.26465.108
- 11.0.100-rc.2.26465.108
- 11.0.0-rc.2.26465.108
- 11.0.0-rc.2.26465.108
- 7.12.0-rc.46608
- 7.12.0-rc.46608
- 7.12.0-rc.46608
- 7.12.0-rc.46608
- 11.0.0-rc.2.26465.108
- 3.0.0-rc.2.26465.108
- 11.0.0-rc.2.26465.108
- 11.0.0-rc.2.26465.108
- 11.0.0-rc.2.26465.108
+ 2.9.3-beta.26520.139
+ 11.0.0-beta.26520.139
+ 5.12.0-1.26520.139
+ 11.0.0
+ 11.0.0
+ 11.0.100-rtm.26520.139
+ 11.0.0
+ 11.0.0
+ 8.0.0-rc.52239
+ 8.0.0-rc.52239
+ 8.0.0-rc.52239
+ 8.0.0-rc.52239
+ 11.0.0
+ 3.0.0
+ 11.0.0
+ 11.0.0
+ 11.0.0
11.0.0-alpha.0.26180.1
11.0.0-alpha.1.26505.3
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
- 23.1.0-alpha.1.26457.1
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
+ 23.1.0-alpha.1.26505.4
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
- 11.0.0-alpha.1.26459.1
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
+ 11.0.0-alpha.1.26517.3
1.0.0-prerelease.26502.1
1.0.0-prerelease.26502.1
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 3dc78e1c28097f..7576dc7a45ecc6 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -1,131 +1,131 @@
-
+
https://github.com/dotnet/icu
bbfd5321d1c6897f0b38581e45ba4e8d370d62a3
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
https://github.com/dotnet/dotnet
0eae08ed2f094f44e0151e4815e7cdd1a334fcdf
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
https://github.com/dotnet/runtime-assets
@@ -179,117 +179,117 @@
https://github.com/dotnet/runtime-assets
60aef74b20edf24857020e0b7baeab78233c1196
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/llvm-project
- d9efae02c571d39f4e2a50971af239603c37b0d0
+ ba8b85b327886a45b1574ba7b3a1cf8bd133a087
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
https://github.com/dotnet/xharness
@@ -303,9 +303,9 @@
https://github.com/dotnet/xharness
91708f0daf7d7ffc3b5d61da591c3e598c1d600e
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
@@ -331,33 +331,33 @@
https://github.com/dotnet/runtime-assets
60aef74b20edf24857020e0b7baeab78233c1196
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
@@ -369,53 +369,53 @@
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
-
+
https://github.com/dotnet/node
- 4ae8e1c1d08d09e5025db77e22a832051c56fd28
+ 1ab9161aaf6814d105d3aa78c752bfd222e0946e
https://github.com/dotnet/runtime-assets
@@ -425,9 +425,9 @@
https://github.com/dotnet/runtime-assets
60aef74b20edf24857020e0b7baeab78233c1196
-
+
https://github.com/dotnet/dotnet
- e5abd3f0528a8467c64a855a6ff569566d0daf27
+ fba04ffe869680486931c78fd815b3f694087f91
diff --git a/eng/common/Get-GitHubAppToken.ps1 b/eng/common/Get-GitHubAppToken.ps1
index ea776bd6bc28a8..ec005e487c38e2 100644
--- a/eng/common/Get-GitHubAppToken.ps1
+++ b/eng/common/Get-GitHubAppToken.ps1
@@ -1,13 +1,11 @@
# Mints a short-lived GitHub App installation access token by signing a JWT
-# with a private key stored in Azure Key Vault (RSA, RS256). The signed JWT is
-# exchanged with the GitHub API for a token scoped to a single installation.
+# with an RSA private key (RS256). The signed JWT is exchanged with the GitHub
+# API for a token scoped to a single installation.
#
# Requirements:
-# - A GitHub App whose private key has been uploaded into Key Vault as an RSA
-# key (the PEM converted to a Key Vault *key*, NOT stored as a secret).
-# - The caller (the federated Azure service connection used to run this script)
-# must have the `Key Vault Crypto User` role (or at minimum the `Sign`
-# action) on that key.
+# - A GitHub App ID and PEM private key stored as Azure Key Vault secrets.
+# - The federated Azure service connection running this script must have
+# `Get` access to those two secrets.
# - The App must be installed on the target organization/account
# (`InstallationOwner`) with the permissions/repositories it needs.
#
@@ -16,17 +14,17 @@
[CmdletBinding()]
param(
- # Name of the Key Vault that holds the GitHub App's RSA signing key.
+ # Name of the Key Vault holding the GitHub App credentials.
[Parameter(Mandatory = $true)]
[string] $KeyVaultName,
- # Name of the RSA key inside the Key Vault (the App's private key).
+ # Secret Manager projection containing the GitHub App ID.
[Parameter(Mandatory = $true)]
- [string] $KeyName,
+ [string] $AppIdSecretName,
- # The GitHub App's Client ID (the value to put in the `iss` JWT claim).
+ # Secret Manager projection containing the PEM private key.
[Parameter(Mandatory = $true)]
- [string] $AppClientId,
+ [string] $AppPrivateKeySecretName,
# Login of the organization or user account whose installation we should
# mint the token for (e.g. `dotnet`, `microsoft`).
@@ -39,16 +37,69 @@ param(
[Parameter(Mandatory = $false)]
[string] $OutputVariableName
)
-
$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true
. $PSScriptRoot\pipeline-logging-functions.ps1
+if ($KeyVaultName -notmatch '^[A-Za-z][A-Za-z0-9-]{1,22}[A-Za-z0-9]$' -or $KeyVaultName.Contains('--')) {
+ Write-PipelineTelemetryError -Category 'Build' -Message "KeyVaultName '$KeyVaultName' is not a valid Azure Key Vault name."
+ exit 1
+}
+
function ConvertTo-Base64Url([byte[]] $bytes) {
return [Convert]::ToBase64String($bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_')
}
+$previousNativeCommandErrorPreference = $PSNativeCommandUseErrorActionPreference
+try {
+ # Azure CLI can emit non-fatal Python warnings to stderr.
+ $PSNativeCommandUseErrorActionPreference = $false
+ $keyVaultAccessToken = az account get-access-token `
+ --resource https://vault.azure.net `
+ --query accessToken `
+ --output tsv `
+ --only-show-errors
+ $tokenExitCode = $LASTEXITCODE
+}
+catch {
+ Write-PipelineTelemetryError -Category 'Build' -Message "Failed to acquire an Azure Key Vault access token: $_"
+ exit 1
+}
+finally {
+ $PSNativeCommandUseErrorActionPreference = $previousNativeCommandErrorPreference
+}
+if ($tokenExitCode -ne 0 -or [string]::IsNullOrWhiteSpace($keyVaultAccessToken)) {
+ Write-PipelineTelemetryError -Category 'Build' -Message "'az account get-access-token' exited with code $tokenExitCode while acquiring an Azure Key Vault access token."
+ exit 1
+}
+
+function Get-KeyVaultSecret([string] $SecretName) {
+ # Use the data-plane REST API because `az keyvault secret show` can fail
+ # with Errno 22 on hosted Windows agents when reading these projections.
+ $escapedSecretName = [Uri]::EscapeDataString($SecretName)
+ $secretUri = "https://$KeyVaultName.vault.azure.net/secrets/$escapedSecretName`?api-version=7.4"
+ try {
+ $response = Invoke-RestMethod `
+ -Uri $secretUri `
+ -Headers @{ Authorization = "Bearer $keyVaultAccessToken" } `
+ -Method Get
+ }
+ catch {
+ Write-PipelineTelemetryError -Category 'Build' -Message "Failed to read secret '$SecretName' from vault '$KeyVaultName': $_. Verify the secret exists and the service connection has 'Key Vault Secrets User' access to it."
+ exit 1
+ }
+ if ([string]::IsNullOrWhiteSpace($response.value)) {
+ Write-PipelineTelemetryError -Category 'Build' -Message "Secret '$SecretName' in vault '$KeyVaultName' is empty."
+ exit 1
+ }
+ return [string] $response.value
+}
+
+Write-Host "Reading GitHub App credentials from vault '$KeyVaultName'..."
+$appId = Get-KeyVaultSecret $AppIdSecretName
+$privateKey = Get-KeyVaultSecret $AppPrivateKeySecretName
+
# Build JWT header and payload. Use [ordered] hashtables so JSON
# serialization is deterministic.
$jwtHeader = [ordered]@{
@@ -59,46 +110,38 @@ $now = [System.DateTimeOffset]::UtcNow
$jwtPayload = [ordered]@{
iat = $now.AddMinutes(-1).ToUnixTimeSeconds()
exp = $now.AddMinutes(5).ToUnixTimeSeconds()
- iss = $AppClientId
+ iss = $appId
}
$headerEncoded = ConvertTo-Base64Url ([System.Text.Encoding]::UTF8.GetBytes(($jwtHeader | ConvertTo-Json -Compress)))
$payloadEncoded = ConvertTo-Base64Url ([System.Text.Encoding]::UTF8.GetBytes(($jwtPayload | ConvertTo-Json -Compress)))
$signingInput = "$headerEncoded.$payloadEncoded"
-# Key Vault `sign` expects the *digest* (base64), not the raw bytes.
-$sha256 = [System.Security.Cryptography.SHA256]::Create()
-$digestBytes = $sha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($signingInput))
-$digestBase64 = [Convert]::ToBase64String($digestBytes)
+$sha256 = [System.Security.Cryptography.SHA256]::Create()
+try {
+ $digestBytes = $sha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($signingInput))
+}
+finally {
+ $sha256.Dispose()
+}
-Write-Host "Signing JWT with key '$KeyName' in vault '$KeyVaultName'..."
-$previousNativeCommandErrorPreference = $PSNativeCommandUseErrorActionPreference
+Write-Host 'Signing JWT with the GitHub App private key...'
+$rsa = [System.Security.Cryptography.RSA]::Create()
try {
- # Azure CLI can emit non-fatal Python warnings to stderr even when signing succeeds.
- # Use the exit code to determine success for this invocation.
- $PSNativeCommandUseErrorActionPreference = $false
- $signatureBase64 = az keyvault key sign `
- --vault-name $KeyVaultName `
- --name $KeyName `
- --algorithm RS256 `
- --digest $digestBase64 `
- --query signature `
- --output tsv `
- --only-show-errors
- $signExitCode = $LASTEXITCODE
+ $rsa.ImportFromPem($privateKey)
+ $signatureBytes = $rsa.SignHash(
+ $digestBytes,
+ [System.Security.Cryptography.HashAlgorithmName]::SHA256,
+ [System.Security.Cryptography.RSASignaturePadding]::Pkcs1)
+ $signatureUrl = ConvertTo-Base64Url $signatureBytes
}
catch {
- Write-PipelineTelemetryError -Category 'Build' -Message "Failed to sign the JWT via Key Vault (key '$KeyName', vault '$KeyVaultName'): $_. Verify the service connection identity has the 'Key Vault Crypto User' role (Sign action) on the key."
+ Write-PipelineTelemetryError -Category 'Build' -Message "Failed to sign the GitHub App JWT with the supplied private key: $_"
exit 1
}
finally {
- $PSNativeCommandUseErrorActionPreference = $previousNativeCommandErrorPreference
-}
-if ($signExitCode -ne 0 -or [string]::IsNullOrWhiteSpace($signatureBase64)) {
- Write-PipelineTelemetryError -Category 'Build' -Message "'az keyvault key sign' exited with code $signExitCode for key '$KeyName' in vault '$KeyVaultName'. Verify the service connection identity has the 'Key Vault Crypto User' role (Sign action) on the key."
- exit 1
+ $rsa.Dispose()
}
-$signatureUrl = $signatureBase64.Trim().TrimEnd('=').Replace('+', '-').Replace('/', '_')
$jwt = "$signingInput.$signatureUrl"
$headers = @{
@@ -126,7 +169,7 @@ try {
} while ($pageInstallationCount -eq 100)
}
catch {
- Write-PipelineTelemetryError -Category 'Build' -Message "Failed to list GitHub App installations: $_. The signed JWT may be invalid or the App's Client ID ('$AppClientId') may be incorrect."
+ Write-PipelineTelemetryError -Category 'Build' -Message "Failed to list GitHub App installations: $_. The signed JWT may be invalid or the App ID may be incorrect."
exit 1
}
$matchingInstallations = @($installations | Where-Object { $_.account.login -ieq $InstallationOwner })
diff --git a/eng/common/core-templates/job/helix-job-monitor.yml b/eng/common/core-templates/job/helix-job-monitor.yml
index 7417afdf3ea48d..ef8ee08fbd2298 100644
--- a/eng/common/core-templates/job/helix-job-monitor.yml
+++ b/eng/common/core-templates/job/helix-job-monitor.yml
@@ -63,7 +63,7 @@ parameters:
type: boolean
default: false
-# Azure service connection ID authorized for Helix. Required when
+# Workload identity federation service connection name authorized for Helix. Required when
# useEntraAuthentication is true.
- name: azureSubscription
type: string
@@ -94,13 +94,12 @@ parameters:
type: boolean
default: false
-# When true, test results are reported to Azure DevOps using the fully qualified test name
-# (Namespace.Type.Method) as the stable automatedTestName and the visible title is qualified as
-# well (--use-fully-qualified-test-name). Opt-in because it changes AzDO test identity and display;
-# primarily useful for frameworks like MSTest whose display name is only the method name.
+# When true (the default), test results are reported to Azure DevOps using the fully qualified test
+# name (Namespace.Type.Method) as the stable automatedTestName and the visible title is qualified as
+# well (--use-fully-qualified-test-name). Set to false to preserve framework-provided display names.
- name: useFullyQualifiedTestName
type: boolean
- default: false
+ default: true
# Controls per-test output attachments. Defaults to Failed.
- name: testResultAttachmentMode
@@ -136,6 +135,20 @@ jobs:
displayName: Monitor Helix Jobs
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
continueOnError: ${{ parameters.continueOnError }}
+ variables:
+ HELIX_MONITOR_BASE_URI: ${{ parameters.helixBaseUri }}
+ HELIX_MONITOR_USE_ENTRA_AUTHENTICATION: ${{ parameters.useEntraAuthentication }}
+ HELIX_MONITOR_POLLING_INTERVAL_SECONDS: ${{ parameters.pollingIntervalSeconds }}
+ HELIX_MONITOR_FAIL_ON_FAILED_TESTS: ${{ parameters.failWorkItemsWithFailedTests }}
+ HELIX_MONITOR_ALLOW_NO_HELIX_JOBS: ${{ parameters.allowNoHelixJobs }}
+ HELIX_MONITOR_USE_FULLY_QUALIFIED_TEST_NAME: ${{ parameters.useFullyQualifiedTestName }}
+ HELIX_MONITOR_TIMEOUT_IN_MINUTES: ${{ parameters.timeoutInMinutes }}
+ HELIX_MONITOR_TEST_RESULT_UPLOAD_PARALLELISM: ${{ parameters.testResultUploadParallelism }}
+ HELIX_MONITOR_ORGANIZATION: ${{ parameters.organization }}
+ HELIX_MONITOR_REPOSITORY: ${{ parameters.repository }}
+ HELIX_MONITOR_TEST_RESULT_ATTACHMENT_MODE: ${{ parameters.testResultAttachmentMode }}
+ HELIX_MONITOR_TOOL_NUPKG_ARTIFACT_NAME: ${{ parameters.toolNupkgArtifactName }}
+ HELIX_MONITOR_TOOL_COMMAND: ${{ parameters.toolCommand }}
${{ if ne(length(parameters.dependsOn), 0) }}:
dependsOn: ${{ parameters.dependsOn }}
${{ if ne(parameters.condition, '') }}:
@@ -157,22 +170,6 @@ jobs:
- pwsh: throw "azureSubscription must be set when useEntraAuthentication is true."
displayName: Validate Helix Entra authentication
- - ${{ if eq(parameters.useEntraAuthentication, true) }}:
- - task: AzureCLI@2
- displayName: Initialize Helix Entra authentication
- inputs:
- azureSubscription: ${{ parameters.azureSubscription }}
- addSpnToEnvironment: true
- scriptType: pscore
- scriptLocation: inlineScript
- inlineScript: |
- if ([string]::IsNullOrWhiteSpace($env:servicePrincipalId) -or [string]::IsNullOrWhiteSpace($env:tenantId)) {
- throw "The Helix Azure service connection did not provide a service principal or tenant ID."
- }
-
- Write-Host "##vso[task.setvariable variable=HelixEntraClientId]$env:servicePrincipalId"
- Write-Host "##vso[task.setvariable variable=HelixEntraTenantId]$env:tenantId"
-
- ${{ if ne(parameters.toolNupkgArtifactName, '') }}:
- task: DownloadPipelineArtifact@2
displayName: Download Helix Job Monitor artifact
@@ -241,76 +238,26 @@ jobs:
- bash: ./eng/common/dotnet.sh tool restore
displayName: Restore Helix Job Monitor
- - bash: |
- set -euo pipefail
-
- toolArgs=(
- --helix-base-uri '${{ parameters.helixBaseUri }}'
- --use-entra-authentication '${{ parameters.useEntraAuthentication }}'
- --polling-interval-seconds '${{ parameters.pollingIntervalSeconds }}'
- --fail-on-failed-tests '${{ parameters.failWorkItemsWithFailedTests }}'
- --allow-no-helix-jobs '${{ parameters.allowNoHelixJobs }}'
- --use-fully-qualified-test-name '${{ parameters.useFullyQualifiedTestName }}'
- --max-wait-minutes "$((${{ parameters.timeoutInMinutes }} - 5))" # Set the tool's timeout slightly lower than the Azure DevOps job timeout to allow it to exit gracefully.
- --stage-name '$(System.StageName)'
- --stage-attempt '$(System.StageAttempt)'
- --job-attempt '$(System.JobAttempt)'
- --test-result-upload-parallelism '${{ parameters.testResultUploadParallelism }}'
- )
-
- organization='${{ parameters.organization }}'
- repository='${{ parameters.repository }}'
- testResultAttachmentMode='${{ parameters.testResultAttachmentMode }}'
-
- # Fall back to Azure DevOps-provided environment variables when the caller did not
- # supply organization / repository explicitly. BUILD_REPOSITORY_NAME is typically
- # 'owner/repo' for GitHub-backed builds and 'owner-repo' for internal builds.
- if [ -z "$organization" ] || [ -z "$repository" ]; then
- buildRepoName="${BUILD_REPOSITORY_NAME:-}"
- if [ -n "$buildRepoName" ] && [[ "$buildRepoName" == */* ]]; then
- repoOwner="${buildRepoName%%/*}"
- repoName="${buildRepoName#*/}"
- elif [ -n "$buildRepoName" ] && [[ "$buildRepoName" == *-* ]]; then
- repoOwner="${buildRepoName%%-*}"
- repoName="${buildRepoName#*-}"
- fi
-
- if [ -n "${repoOwner:-}" ] && [ -n "${repoName:-}" ]; then
- if [ -z "$organization" ]; then organization="$repoOwner"; fi
- if [ -z "$repository" ]; then repository="$repoName"; fi
- fi
- fi
-
- if [ -n "$organization" ]; then toolArgs+=( --organization "$organization" ); fi
- if [ -n "$repository" ]; then toolArgs+=( --repository "$repository" ); fi
- if [ -n "$testResultAttachmentMode" ]; then
- toolArgs+=( --test-result-attachment-mode "$testResultAttachmentMode" )
- fi
-
- # Build.Reason and Build.SourceBranch are required to derive the Helix source filter
- # the same way the Helix SDK submitter does (PR -> 'pr', internal -> 'official',
- # otherwise -> 'ci'). Without these, manually-queued / scheduled / CI builds would
- # be looked up under the wrong source prefix and find zero jobs.
- toolArgs+=( --build-reason "$(Build.Reason)" )
- toolArgs+=( --source-branch "$(Build.SourceBranch)" )
-
- if [ -n '${{ parameters.toolNupkgArtifactName }}' ]; then
- # Tool was installed from a local nupkg; run the DLL via the repo-local dotnet.
- export DOTNET_ROOT="$(Build.SourcesDirectory)/.dotnet"
- ./eng/common/dotnet.sh exec "$(HelixJobMonitorDll)" "${toolArgs[@]}"
- else
- # Tool was restored from the local .config/dotnet-tools.json manifest; invoke it
- # through the manifest from the repo root.
- pushd "$BUILD_SOURCESDIRECTORY" > /dev/null
- trap 'popd > /dev/null' EXIT
- ./eng/common/dotnet.sh tool run '${{ parameters.toolCommand }}' -- "${toolArgs[@]}"
- fi
- displayName: Monitor Helix Jobs
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- ${{ if eq(parameters.useEntraAuthentication, false) }}:
+ - ${{ if eq(parameters.useEntraAuthentication, true) }}:
+ - task: AzureCLI@2
+ displayName: Monitor Helix Jobs
+ inputs:
+ azureSubscription: ${{ parameters.azureSubscription }}
+ keepAzSessionActive: true
+ scriptType: bash
+ scriptLocation: inlineScript
+ inlineScript: |
+ set -euo pipefail
+
+ # AzureCLI@2 replaces SYSTEM_ACCESSTOKEN with the service connection token.
+ export SYSTEM_ACCESSTOKEN="$HELIX_AZDO_ACCESSTOKEN"
+ bash "$BUILD_SOURCESDIRECTORY/eng/common/run-helix-job-monitor.sh"
+ env:
+ HELIX_AZDO_ACCESSTOKEN: $(System.AccessToken)
+
+ - ${{ if eq(parameters.useEntraAuthentication, false) }}:
+ - bash: bash "$BUILD_SOURCESDIRECTORY/eng/common/run-helix-job-monitor.sh"
+ displayName: Monitor Helix Jobs
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
HELIX_ACCESSTOKEN: ${{ parameters.helixAccessToken }}
- ${{ if eq(parameters.useEntraAuthentication, true) }}:
- AZURESUBSCRIPTION_CLIENT_ID: $(HelixEntraClientId)
- AZURESUBSCRIPTION_TENANT_ID: $(HelixEntraTenantId)
- AZURESUBSCRIPTION_SERVICE_CONNECTION_ID: ${{ parameters.azureSubscription }}
diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml
index 25af2787900719..c859dc2b071bde 100644
--- a/eng/common/core-templates/job/onelocbuild.yml
+++ b/eng/common/core-templates/job/onelocbuild.yml
@@ -10,9 +10,9 @@ parameters:
# GitHub App authentication for the OneLoc check-in PR.
GitHubAppServiceConnection: 'dnceng-oneloc-githubapp'
- GitHubAppClientId: 'Iv23lijBU8x3gc9lDOc9'
GitHubAppKeyVaultName: 'EngKeyVault'
- GitHubAppKeyName: 'oneloc-localization-app-key'
+ GitHubAppIdSecretName: 'oneloc-localization-app-app-id'
+ GitHubAppPrivateKeySecretName: 'oneloc-localization-app-app-private-key'
SourcesDirectory: $(System.DefaultWorkingDirectory)
CreatePr: true
@@ -102,8 +102,8 @@ jobs:
${{ else }}:
azureSubscription: ${{ parameters.GitHubAppServiceConnection }}
keyVaultName: ${{ parameters.GitHubAppKeyVaultName }}
- keyName: ${{ parameters.GitHubAppKeyName }}
- appClientId: ${{ parameters.GitHubAppClientId }}
+ appIdSecretName: ${{ parameters.GitHubAppIdSecretName }}
+ appPrivateKeySecretName: ${{ parameters.GitHubAppPrivateKeySecretName }}
installationOwner: ${{ parameters.GitHubOrg }}
outputVariableName: 'GitHubAppInstallationToken'
condition: ${{ parameters.condition }}
diff --git a/eng/common/core-templates/steps/get-github-app-token.yml b/eng/common/core-templates/steps/get-github-app-token.yml
index 6d42a48d3c3671..3eeb5a4c1bc94b 100644
--- a/eng/common/core-templates/steps/get-github-app-token.yml
+++ b/eng/common/core-templates/steps/get-github-app-token.yml
@@ -1,13 +1,11 @@
# Mints a short-lived GitHub App installation access token by signing a JWT
-# with a private key stored in Azure Key Vault (RSA, RS256). The JWT is
-# exchanged with the GitHub API for a token scoped to a single installation.
+# with an RSA private key (RS256). The JWT is exchanged with the GitHub API
+# for a token scoped to a single installation.
#
# Requirements (per GitHub App you want to authenticate as):
-# - A GitHub App with its private key uploaded into Key Vault as an RSA key
-# (PEM converted to a key, NOT stored as a secret).
-# - The Azure service connection passed via `azureSubscription` must be
-# granted the `Key Vault Crypto User` role (or at minimum `Sign` action)
-# on that key.
+# - A GitHub App ID and PEM private key stored as Azure Key Vault secrets.
+# - The Azure service connection passed via `azureSubscription` must have
+# `Get` access to those two secrets.
# - The App must be installed on the target organization/account
# (`installationOwner`) with the permissions/repositories you need.
#
@@ -17,23 +15,18 @@
# enterprise classic-PAT lifetime policy.
parameters:
-# Azure DevOps service connection (federated) that can call
-# `az keyvault key sign` on the App's signing key.
+# Azure DevOps service connection (federated) that can read the App credentials.
- name: azureSubscription
type: string
-# Name of the Key Vault that holds the GitHub App's RSA signing key.
+# Name of the Key Vault holding Secret Manager's github-app-secret projections.
- name: keyVaultName
type: string
-# Name of the RSA key inside the Key Vault (the App's private key).
-- name: keyName
+- name: appIdSecretName
type: string
-# The GitHub App's Client ID (the value to put in the `iss` JWT claim).
-# Prefer this over the numeric App ID; GitHub accepts either, but Client ID
-# is the documented form going forward.
-- name: appClientId
+- name: appPrivateKeySecretName
type: string
# Login of the organization or user account whose installation we should
@@ -73,7 +66,7 @@ steps:
inlineScript: |
& "$(System.DefaultWorkingDirectory)/eng/common/Get-GitHubAppToken.ps1" `
-KeyVaultName '${{ parameters.keyVaultName }}' `
- -KeyName '${{ parameters.keyName }}' `
- -AppClientId '${{ parameters.appClientId }}' `
+ -AppIdSecretName '${{ parameters.appIdSecretName }}' `
+ -AppPrivateKeySecretName '${{ parameters.appPrivateKeySecretName }}' `
-InstallationOwner '${{ parameters.installationOwner }}' `
-OutputVariableName '${{ parameters.outputVariableName }}'
diff --git a/eng/common/core-templates/steps/send-to-helix.yml b/eng/common/core-templates/steps/send-to-helix.yml
index 62cce4d4ea2a90..dba2f1b0afadcc 100644
--- a/eng/common/core-templates/steps/send-to-helix.yml
+++ b/eng/common/core-templates/steps/send-to-helix.yml
@@ -6,7 +6,7 @@ parameters:
HelixTargetQueues: '' # required -- semicolon-delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues
HelixAccessToken: '' # optional -- legacy access token; not forwarded when HelixUseEntraAuthentication is true
HelixUseEntraAuthentication: false # optional -- use refreshable Entra authentication instead of a PAT or anonymous access
- HelixAzureSubscription: '' # required when HelixUseEntraAuthentication is true -- Azure service connection ID authorized for Helix
+ HelixAzureSubscription: '' # required when HelixUseEntraAuthentication is true -- workload identity federation service connection name authorized for Helix
HelixProjectPath: 'eng/common/helixpublish.proj' # optional -- path to the project file to build relative to BUILD_SOURCESDIRECTORY
HelixProjectArguments: '' # optional -- arguments passed to the build command
HelixConfiguration: '' # optional -- additional property attached to a job
@@ -41,106 +41,176 @@ steps:
- ${{ if eq(parameters.HelixUseEntraAuthentication, true) }}:
- task: AzureCLI@2
- displayName: Initialize Helix Entra authentication
+ displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
inputs:
azureSubscription: ${{ parameters.HelixAzureSubscription }}
- addSpnToEnvironment: true
+ keepAzSessionActive: true
scriptType: pscore
scriptLocation: inlineScript
inlineScript: |
- if ([string]::IsNullOrWhiteSpace($env:servicePrincipalId) -or [string]::IsNullOrWhiteSpace($env:tenantId)) {
- throw "The Helix Azure service connection did not provide a service principal or tenant ID."
- }
+ # AzureCLI@2 replaces SYSTEM_ACCESSTOKEN with the service connection token.
+ $env:SYSTEM_ACCESSTOKEN = $env:HELIX_AZDO_ACCESSTOKEN
- Write-Host "##vso[task.setvariable variable=HelixEntraClientId]$env:servicePrincipalId"
- Write-Host "##vso[task.setvariable variable=HelixEntraTenantId]$env:tenantId"
- condition: ${{ parameters.condition }}
+ $(Build.SourcesDirectory)\eng\common\msbuild.ps1 `
+ $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }} `
+ /restore `
+ /p:TreatWarningsAsErrors=false `
+ /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }} `
+ /p:HelixUseEntraAuthentication=${{ parameters.HelixUseEntraAuthentication }} `
+ ${{ parameters.HelixProjectArguments }} `
+ /t:Test `
+ /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
+ env:
+ BuildConfig: $(_BuildConfig)
+ HelixSource: ${{ parameters.HelixSource }}
+ HelixType: ${{ parameters.HelixType }}
+ HelixBuild: ${{ parameters.HelixBuild }}
+ HelixConfiguration: ${{ parameters.HelixConfiguration }}
+ HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
+ HelixPreCommands: ${{ parameters.HelixPreCommands }}
+ HelixPostCommands: ${{ parameters.HelixPostCommands }}
+ WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
+ WorkItemCommand: ${{ parameters.WorkItemCommand }}
+ WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
+ CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
+ XUnitProjects: ${{ parameters.XUnitProjects }}
+ XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
+ XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
+ XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
+ XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
+ IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
+ DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
+ DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
+ WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
+ HelixBaseUri: ${{ parameters.HelixBaseUri }}
+ Creator: ${{ parameters.Creator }}
+ HELIX_AZDO_ACCESSTOKEN: $(System.AccessToken)
+ condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
+ continueOnError: ${{ parameters.continueOnError }}
+ - task: AzureCLI@2
+ displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
+ inputs:
+ azureSubscription: ${{ parameters.HelixAzureSubscription }}
+ keepAzSessionActive: true
+ scriptType: bash
+ scriptLocation: inlineScript
+ inlineScript: |
+ # AzureCLI@2 replaces SYSTEM_ACCESSTOKEN with the service connection token.
+ export SYSTEM_ACCESSTOKEN="$HELIX_AZDO_ACCESSTOKEN"
+
+ $(Build.SourcesDirectory)/eng/common/msbuild.sh \
+ $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }} \
+ /restore \
+ /p:TreatWarningsAsErrors=false \
+ /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }} \
+ /p:HelixUseEntraAuthentication=${{ parameters.HelixUseEntraAuthentication }} \
+ ${{ parameters.HelixProjectArguments }} \
+ /t:Test \
+ /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
+ env:
+ BuildConfig: $(_BuildConfig)
+ HelixSource: ${{ parameters.HelixSource }}
+ HelixType: ${{ parameters.HelixType }}
+ HelixBuild: ${{ parameters.HelixBuild }}
+ HelixConfiguration: ${{ parameters.HelixConfiguration }}
+ HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
+ HelixPreCommands: ${{ parameters.HelixPreCommands }}
+ HelixPostCommands: ${{ parameters.HelixPostCommands }}
+ WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
+ WorkItemCommand: ${{ parameters.WorkItemCommand }}
+ WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
+ CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
+ XUnitProjects: ${{ parameters.XUnitProjects }}
+ XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
+ XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
+ XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
+ XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
+ IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
+ DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
+ DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
+ WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
+ HelixBaseUri: ${{ parameters.HelixBaseUri }}
+ Creator: ${{ parameters.Creator }}
+ HELIX_AZDO_ACCESSTOKEN: $(System.AccessToken)
+ condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
+ continueOnError: ${{ parameters.continueOnError }}
- - powershell: >
- $(Build.SourcesDirectory)\eng\common\msbuild.ps1
- $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }}
- /restore
- /p:TreatWarningsAsErrors=false
- /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }}
- /p:HelixUseEntraAuthentication=${{ parameters.HelixUseEntraAuthentication }}
- ${{ parameters.HelixProjectArguments }}
- /t:Test
- /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
- displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixConfiguration: ${{ parameters.HelixConfiguration }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- ${{ if eq(parameters.HelixUseEntraAuthentication, false) }}:
+ - ${{ if eq(parameters.HelixUseEntraAuthentication, false) }}:
+ - powershell: >
+ $(Build.SourcesDirectory)\eng\common\msbuild.ps1
+ $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }}
+ /restore
+ /p:TreatWarningsAsErrors=false
+ /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }}
+ /p:HelixUseEntraAuthentication=${{ parameters.HelixUseEntraAuthentication }}
+ ${{ parameters.HelixProjectArguments }}
+ /t:Test
+ /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
+ displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
+ env:
+ BuildConfig: $(_BuildConfig)
+ HelixSource: ${{ parameters.HelixSource }}
+ HelixType: ${{ parameters.HelixType }}
+ HelixBuild: ${{ parameters.HelixBuild }}
+ HelixConfiguration: ${{ parameters.HelixConfiguration }}
+ HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
HelixAccessToken: ${{ parameters.HelixAccessToken }}
- ${{ if eq(parameters.HelixUseEntraAuthentication, true) }}:
- AZURESUBSCRIPTION_CLIENT_ID: $(HelixEntraClientId)
- AZURESUBSCRIPTION_TENANT_ID: $(HelixEntraTenantId)
- AZURESUBSCRIPTION_SERVICE_CONNECTION_ID: ${{ parameters.HelixAzureSubscription }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- WorkItemCommand: ${{ parameters.WorkItemCommand }}
- WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- XUnitProjects: ${{ parameters.XUnitProjects }}
- XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
- XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
- XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
- XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- HelixBaseUri: ${{ parameters.HelixBaseUri }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
- - script: >
- $(Build.SourcesDirectory)/eng/common/msbuild.sh
- $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }}
- /restore
- /p:TreatWarningsAsErrors=false
- /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }}
- /p:HelixUseEntraAuthentication=${{ parameters.HelixUseEntraAuthentication }}
- ${{ parameters.HelixProjectArguments }}
- /t:Test
- /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
- displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixConfiguration: ${{ parameters.HelixConfiguration }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- ${{ if eq(parameters.HelixUseEntraAuthentication, false) }}:
+ HelixPreCommands: ${{ parameters.HelixPreCommands }}
+ HelixPostCommands: ${{ parameters.HelixPostCommands }}
+ WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
+ WorkItemCommand: ${{ parameters.WorkItemCommand }}
+ WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
+ CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
+ XUnitProjects: ${{ parameters.XUnitProjects }}
+ XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
+ XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
+ XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
+ XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
+ IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
+ DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
+ DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
+ WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
+ HelixBaseUri: ${{ parameters.HelixBaseUri }}
+ Creator: ${{ parameters.Creator }}
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
+ continueOnError: ${{ parameters.continueOnError }}
+ - script: >
+ $(Build.SourcesDirectory)/eng/common/msbuild.sh
+ $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }}
+ /restore
+ /p:TreatWarningsAsErrors=false
+ /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }}
+ /p:HelixUseEntraAuthentication=${{ parameters.HelixUseEntraAuthentication }}
+ ${{ parameters.HelixProjectArguments }}
+ /t:Test
+ /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
+ displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
+ env:
+ BuildConfig: $(_BuildConfig)
+ HelixSource: ${{ parameters.HelixSource }}
+ HelixType: ${{ parameters.HelixType }}
+ HelixBuild: ${{ parameters.HelixBuild }}
+ HelixConfiguration: ${{ parameters.HelixConfiguration }}
+ HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
HelixAccessToken: ${{ parameters.HelixAccessToken }}
- ${{ if eq(parameters.HelixUseEntraAuthentication, true) }}:
- AZURESUBSCRIPTION_CLIENT_ID: $(HelixEntraClientId)
- AZURESUBSCRIPTION_TENANT_ID: $(HelixEntraTenantId)
- AZURESUBSCRIPTION_SERVICE_CONNECTION_ID: ${{ parameters.HelixAzureSubscription }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- WorkItemCommand: ${{ parameters.WorkItemCommand }}
- WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- XUnitProjects: ${{ parameters.XUnitProjects }}
- XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
- XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
- XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
- XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- HelixBaseUri: ${{ parameters.HelixBaseUri }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
+ HelixPreCommands: ${{ parameters.HelixPreCommands }}
+ HelixPostCommands: ${{ parameters.HelixPostCommands }}
+ WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
+ WorkItemCommand: ${{ parameters.WorkItemCommand }}
+ WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
+ CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
+ XUnitProjects: ${{ parameters.XUnitProjects }}
+ XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
+ XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
+ XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
+ XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
+ IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
+ DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
+ DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
+ WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
+ HelixBaseUri: ${{ parameters.HelixBaseUri }}
+ Creator: ${{ parameters.Creator }}
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
+ continueOnError: ${{ parameters.continueOnError }}
diff --git a/eng/common/run-helix-job-monitor.sh b/eng/common/run-helix-job-monitor.sh
new file mode 100644
index 00000000000000..dda140bc9a4bcc
--- /dev/null
+++ b/eng/common/run-helix-job-monitor.sh
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+scriptroot="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+. "$scriptroot/pipeline-logging-functions.sh"
+
+toolArgs=(
+ --helix-base-uri "$HELIX_MONITOR_BASE_URI"
+ --use-entra-authentication "$HELIX_MONITOR_USE_ENTRA_AUTHENTICATION"
+ --polling-interval-seconds "$HELIX_MONITOR_POLLING_INTERVAL_SECONDS"
+ --fail-on-failed-tests "$HELIX_MONITOR_FAIL_ON_FAILED_TESTS"
+ --allow-no-helix-jobs "$HELIX_MONITOR_ALLOW_NO_HELIX_JOBS"
+ --use-fully-qualified-test-name "$HELIX_MONITOR_USE_FULLY_QUALIFIED_TEST_NAME"
+ --max-wait-minutes "$((HELIX_MONITOR_TIMEOUT_IN_MINUTES - 5))"
+ --stage-name "$SYSTEM_STAGENAME"
+ --stage-attempt "$SYSTEM_STAGEATTEMPT"
+ --job-attempt "$SYSTEM_JOBATTEMPT"
+ --test-result-upload-parallelism "$HELIX_MONITOR_TEST_RESULT_UPLOAD_PARALLELISM"
+)
+
+organization="${HELIX_MONITOR_ORGANIZATION:-}"
+repository="${HELIX_MONITOR_REPOSITORY:-}"
+
+# Fall back to Azure DevOps-provided environment variables when the caller did not
+# supply organization or repository explicitly.
+if [ -z "$organization" ] || [ -z "$repository" ]; then
+ buildRepoName="${BUILD_REPOSITORY_NAME:-}"
+ if [ -n "$buildRepoName" ] && [[ "$buildRepoName" == */* ]]; then
+ repoOwner="${buildRepoName%%/*}"
+ repoName="${buildRepoName#*/}"
+ elif [ -n "$buildRepoName" ] && [[ "$buildRepoName" == *-* ]]; then
+ repoOwner="${buildRepoName%%-*}"
+ repoName="${buildRepoName#*-}"
+ fi
+
+ if [ -n "${repoOwner:-}" ] && [ -n "${repoName:-}" ]; then
+ if [ -z "$organization" ]; then organization="$repoOwner"; fi
+ if [ -z "$repository" ]; then repository="$repoName"; fi
+ fi
+fi
+
+if [ -n "$organization" ]; then toolArgs+=( --organization "$organization" ); fi
+if [ -n "$repository" ]; then toolArgs+=( --repository "$repository" ); fi
+if [ -n "${HELIX_MONITOR_TEST_RESULT_ATTACHMENT_MODE:-}" ]; then
+ toolArgs+=( --test-result-attachment-mode "$HELIX_MONITOR_TEST_RESULT_ATTACHMENT_MODE" )
+fi
+
+# These values let the monitor derive the same Helix source filter as the SDK submitter.
+toolArgs+=( --build-reason "$BUILD_REASON" )
+toolArgs+=( --source-branch "$BUILD_SOURCEBRANCH" )
+
+cd "$BUILD_SOURCESDIRECTORY"
+exitCode=0
+if [ -n "${HELIX_MONITOR_TOOL_NUPKG_ARTIFACT_NAME:-}" ]; then
+ export DOTNET_ROOT="$BUILD_SOURCESDIRECTORY/.dotnet"
+ ./eng/common/dotnet.sh exec "$HELIXJOBMONITORDLL" "${toolArgs[@]}" || exitCode=$?
+else
+ ./eng/common/dotnet.sh tool run "$HELIX_MONITOR_TOOL_COMMAND" -- "${toolArgs[@]}" || exitCode=$?
+fi
+
+if [ "$exitCode" -ne 0 ]; then
+ Write-PipelineTelemetryError -force -category 'Helix' "Helix job monitor failed (exit code '$exitCode')."
+ exit "$exitCode"
+fi
diff --git a/global.json b/global.json
index 1ec0f68f3a6c5c..f70e9cacbd69ac 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "11.0.100-rc.1.26425.128",
+ "version": "11.0.100-rc.2.26504.105",
"allowPrerelease": true,
"rollForward": "major",
"paths": [
@@ -10,14 +10,14 @@
"errorMessage": "The required .NET SDK wasn't found. Please run ./eng/common/dotnet.sh (Unix) or eng\\common\\dotnet.cmd (Windows) to install it."
},
"tools": {
- "dotnet": "11.0.100-rc.1.26425.128"
+ "dotnet": "11.0.100-rc.2.26504.105"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26465.108",
- "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26465.108",
- "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26465.108",
+ "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26520.139",
+ "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26520.139",
+ "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26520.139",
"Microsoft.Build.NoTargets": "3.7.0",
"Microsoft.Build.Traversal": "3.4.0",
- "Microsoft.NET.Sdk.IL": "11.0.0-rc.2.26465.108"
+ "Microsoft.NET.Sdk.IL": "11.0.0"
}
}
From ea1ab5ce2a8b8c8e1e80371a73a376a31d015e97 Mon Sep 17 00:00:00 2001
From: "dotnet-maestro[bot]"
Date: Thu, 22 Oct 2026 01:18:04 +0000
Subject: [PATCH 3/4] Update dependencies from build 337734 Updated
Dependencies: Microsoft.CodeAnalysis, Microsoft.CodeAnalysis.Analyzers,
Microsoft.CodeAnalysis.BannedApiAnalyzers, Microsoft.CodeAnalysis.CSharp,
Microsoft.Net.Compilers.Toolset (Version 5.12.0-1.26520.139 ->
5.12.0-1.26521.105) Microsoft.CodeAnalysis.NetAnalyzers,
Microsoft.DotNet.ApiCompat.Task (Version 11.0.100 -> 11.0.100)
Microsoft.DotNet.Arcade.Sdk, Microsoft.DotNet.Build.Tasks.Archives,
Microsoft.DotNet.Build.Tasks.Feed, Microsoft.DotNet.Build.Tasks.FileCatalog,
Microsoft.DotNet.Build.Tasks.Installers,
Microsoft.DotNet.Build.Tasks.Packaging,
Microsoft.DotNet.Build.Tasks.TargetFramework,
Microsoft.DotNet.Build.Tasks.Templating, Microsoft.DotNet.CodeAnalysis,
Microsoft.DotNet.GenAPI, Microsoft.DotNet.GenFacades,
Microsoft.DotNet.Helix.JobMonitor, Microsoft.DotNet.Helix.Sdk,
Microsoft.DotNet.PackageTesting, Microsoft.DotNet.RemoteExecutor,
Microsoft.DotNet.SharedFramework.Sdk, Microsoft.DotNet.XliffTasks,
Microsoft.DotNet.XUnitExtensions (Version 11.0.0-beta.26520.139 ->
11.0.0-beta.26521.105) Microsoft.DotNet.Cecil (Version
0.11.5-preview.26520.139 -> 0.11.5-preview.26521.105)
Microsoft.DotNet.XUnitConsoleRunner (Version 2.9.3-beta.26520.139 ->
2.9.3-beta.26521.105) Microsoft.NET.Runtime.Emscripten.Internal,
Microsoft.NET.Sdk.IL, Microsoft.NETCore.App.Ref, Microsoft.NETCore.ILAsm,
runtime.native.System.IO.Ports, System.Reflection.Metadata,
System.Reflection.MetadataLoadContext, System.Text.Json (Version 11.0.0 ->
11.0.0) Microsoft.NET.Workload.Emscripten.Current.Manifest-11.0.100.Transport
(Version 11.0.100-rtm.26520.139 -> 11.0.100-rtm.26521.105) NuGet.Frameworks,
NuGet.Packaging, NuGet.ProjectModel, NuGet.Versioning (Version 8.0.0-rc.52239
-> 8.0.0-rc.52305) System.CommandLine (Version 3.0.0 -> 3.0.0) [[ commit
created by automation ]]
---
.config/dotnet-tools.json | 2 +-
NuGet.config | 2 +-
eng/Version.Details.props | 60 ++++++++--------
eng/Version.Details.xml | 144 +++++++++++++++++++-------------------
global.json | 6 +-
5 files changed, 107 insertions(+), 107 deletions(-)
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 959ea7cc6b061d..aff303248151d9 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -27,7 +27,7 @@
]
},
"microsoft.dotnet.helix.jobmonitor": {
- "version": "11.0.0-beta.26520.139",
+ "version": "11.0.0-beta.26521.105",
"commands": [
"dotnet-helix-job-monitor"
]
diff --git a/NuGet.config b/NuGet.config
index edc8f075911c12..671ab38936c684 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -9,7 +9,7 @@
-
+
- 5.12.0-1.26520.139
- 5.12.0-1.26520.139
- 5.12.0-1.26520.139
- 5.12.0-1.26520.139
+ 5.12.0-1.26521.105
+ 5.12.0-1.26521.105
+ 5.12.0-1.26521.105
+ 5.12.0-1.26521.105
11.0.100
11.0.100
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 0.11.5-preview.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
- 11.0.0-beta.26520.139
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 0.11.5-preview.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
+ 11.0.0-beta.26521.105
3.2.2-beta.26257.113
- 2.9.3-beta.26520.139
- 11.0.0-beta.26520.139
- 5.12.0-1.26520.139
+ 2.9.3-beta.26521.105
+ 11.0.0-beta.26521.105
+ 5.12.0-1.26521.105
11.0.0
11.0.0
- 11.0.100-rtm.26520.139
+ 11.0.100-rtm.26521.105
11.0.0
11.0.0
- 8.0.0-rc.52239
- 8.0.0-rc.52239
- 8.0.0-rc.52239
- 8.0.0-rc.52239
+ 8.0.0-rc.52305
+ 8.0.0-rc.52305
+ 8.0.0-rc.52305
+ 8.0.0-rc.52305
11.0.0
3.0.0
11.0.0
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 6456ecb2d96598..20b51a488ec4a4 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -1,5 +1,5 @@
-
+
https://github.com/dotnet/icu
@@ -39,93 +39,93 @@
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
0eae08ed2f094f44e0151e4815e7cdd1a334fcdf
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/runtime-assets
@@ -265,31 +265,31 @@
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/xharness
@@ -303,9 +303,9 @@
https://github.com/dotnet/xharness
38ed2081279c3f4dee81c933aaa9721b50a44adb
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
@@ -331,33 +331,33 @@
https://github.com/dotnet/runtime-assets
60aef74b20edf24857020e0b7baeab78233c1196
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
@@ -369,21 +369,21 @@
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
https://github.com/dotnet/node
@@ -425,9 +425,9 @@
https://github.com/dotnet/runtime-assets
60aef74b20edf24857020e0b7baeab78233c1196
-
+
https://github.com/dotnet/dotnet
- fba04ffe869680486931c78fd815b3f694087f91
+ 6fa58a2ef810f82b3197d69763cedfb34c88b9fd
diff --git a/global.json b/global.json
index f70e9cacbd69ac..1c9f730454cd82 100644
--- a/global.json
+++ b/global.json
@@ -13,9 +13,9 @@
"dotnet": "11.0.100-rc.2.26504.105"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26520.139",
- "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26520.139",
- "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26520.139",
+ "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26521.105",
+ "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26521.105",
+ "Microsoft.DotNet.SharedFramework.Sdk": "11.0.0-beta.26521.105",
"Microsoft.Build.NoTargets": "3.7.0",
"Microsoft.Build.Traversal": "3.4.0",
"Microsoft.NET.Sdk.IL": "11.0.0"
From 853ed1a7f2f4c6e1ab93e2b74b1e79e6c39a5512 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20K=C3=B6plinger?=
Date: Thu, 22 Oct 2026 12:20:44 +0200
Subject: [PATCH 4/4] Disable optimized publishing for trimming test apps
Track removal after the .NET 11 GA SDK update in #136283.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: af15e109-60d0-4522-affe-2679d4405d75
---
eng/testing/linker/SupportFiles/Directory.Build.props | 2 ++
1 file changed, 2 insertions(+)
diff --git a/eng/testing/linker/SupportFiles/Directory.Build.props b/eng/testing/linker/SupportFiles/Directory.Build.props
index 4e33801ab12837..a2a17054a1133e 100644
--- a/eng/testing/linker/SupportFiles/Directory.Build.props
+++ b/eng/testing/linker/SupportFiles/Directory.Build.props
@@ -2,6 +2,8 @@
true
true
+
+ false
full
false
true