Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
52b4ffd
Update dependencies from https://github.com/dotnet/dotnet build 20260…
dotnet-maestro[bot] Aug 21, 2026
e3e5edc
Re-generate global.json for PR #26454: [release/11.0.1xx-rc.1] Update…
Aug 21, 2026
be26eb6
Update dependencies from https://github.com/dotnet/dotnet build 20260…
dotnet-maestro[bot] Aug 22, 2026
4e754d5
Re-generate global.json for PR #26454: [release/11.0.1xx-rc.1] Update…
Aug 22, 2026
e03633d
Update dependencies from https://github.com/dotnet/dotnet build 20260…
dotnet-maestro[bot] Aug 23, 2026
9309825
Re-generate global.json for PR #26454: [release/11.0.1xx-rc.1] Update…
Aug 23, 2026
9ab2b25
Add a 9.0.20 feed.
rolfbjarne Aug 25, 2026
59486f9
Add a 10.0.12 feed.
rolfbjarne Aug 25, 2026
b2476eb
Make every project use our NuGet.config.
rolfbjarne Aug 25, 2026
b956034
Fix the path to MonoTargetsTasks.dll.
rolfbjarne Aug 25, 2026
918e83b
Update sizes.
rolfbjarne Aug 25, 2026
3adbcec
Add a 8.0.31 feed.
rolfbjarne Aug 25, 2026
cec4c19
[msbuild/tests] Stop setting TargetsCurrent=true. Fixes #24418.
rolfbjarne Aug 25, 2026
25d0ccd
[tests] Disable LLVM AOT for the 'dont link' tests.
rolfbjarne Aug 25, 2026
74bfa78
[tests] Add a link to the issue tracking the LLVM AOT workaround.
rolfbjarne Aug 25, 2026
43cd3fb
[ci] Make the Windows tests use our NuGet.config.
rolfbjarne Aug 25, 2026
c9902ed
[tests] Disable a few DotNetWatch tests that have regressed.
rolfbjarne Aug 26, 2026
565dc42
Disable the right test.
rolfbjarne Aug 26, 2026
7948050
Update dependencies from https://github.com/dotnet/dotnet build 20260…
dotnet-maestro[bot] Aug 27, 2026
7c3c9ee
Re-generate global.json for PR #26454: [release/11.0.1xx-rc.1] Update…
Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Make.config
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,13 @@ export SuppressNETCoreSdkPreviewMessage=true
# Pass the correct path explicitly.
export NuGetPackageRoot=$(abspath $(TOP)/packages)/

# The Xamarin.MacDev submodule has its own NuGet.config, which clears all
# package sources and only adds a few of them. This means that any package
# sources we add to our own NuGet.config (such as darc feeds for unreleased
# .NET packages) aren't available when building the submodule.
# Make every project in this repository use our NuGet.config.
export RestoreConfigFile=$(abspath $(TOP)/NuGet.config)

# Minimum OSX versions for building XI/XM
MIN_OSX_BUILD_VERSION=15.3

Expand Down
11 changes: 6 additions & 5 deletions NuGet.config
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@
<!-- Begin: Package sources from dotnet-dotnet -->
<!-- End: Package sources from dotnet-dotnet -->
<!-- Begin: Package sources from dotnet-macios -->
<add key="darc-pub-dotnet-macios-ac895e1" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-macios-ac895e19/nuget/v3/index.json" />
<add key="darc-pub-dotnet-macios-ac895e1-2" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-macios-ac895e19-2/nuget/v3/index.json" />
<add key="darc-pub-dotnet-macios-ac895e1-1" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-macios-ac895e19-1/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-macios -->
<!-- Begin: Package sources from dotnet-emsdk -->
<!-- End: Package sources from dotnet-emsdk -->
Expand All @@ -33,8 +30,12 @@
<add key="macios-dependencies" value="https://pkgs.dev.azure.com/xamarin/public/_packaging/macios-dependencies/nuget/v3/index.json" />
<add key="xamarin-impl" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/xamarin-impl/nuget/v3/index.json" />
<add key="local-tests-feed" value="tests/.nuget/packages" />
<!-- Add a 9.0.14 feed -->
<add key="darc-pub-dotnet-runtime-4a27bd0a" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-4a27bd0a/nuget/v3/index.json" />
<!-- Add a 9.0.20 feed -->
<add key="darc-pub-dotnet-runtime-380833e6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-380833e6/nuget/v3/index.json" />
<!-- Add a 10.0.12 feed -->
<add key="darc-pub-dotnet-dotnet-07280ccb" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-dotnet-07280ccb/nuget/v3/index.json" />
<!-- Add a 8.0.31 feed -->
<add key="darc-pub-dotnet-runtime-53884e7d" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-53884e7d/nuget/v3/index.json" />
</packageSources>
<disabledPackageSources>
<clear />
Expand Down
22 changes: 11 additions & 11 deletions eng/Version.Details.props
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ This file should be imported by eng/Versions.props
<Project>
<PropertyGroup>
<!-- dotnet-dotnet dependencies -->
<MicrosoftDotNetArcadeSdkPackageVersion>11.0.0-beta.26365.101</MicrosoftDotNetArcadeSdkPackageVersion>
<MicrosoftDotNetBuildTasksFeedPackageVersion>11.0.0-beta.26365.101</MicrosoftDotNetBuildTasksFeedPackageVersion>
<MicrosoftDotNetCecilPackageVersion>0.11.5-preview.26365.101</MicrosoftDotNetCecilPackageVersion>
<MicrosoftDotNetSharedFrameworkSdkPackageVersion>11.0.0-beta.26365.101</MicrosoftDotNetSharedFrameworkSdkPackageVersion>
<MicrosoftNETILLinkPackageVersion>11.0.0-preview.7.26365.101</MicrosoftNETILLinkPackageVersion>
<MicrosoftNETILLinkTasksPackageVersion>11.0.0-preview.7.26365.101</MicrosoftNETILLinkTasksPackageVersion>
<MicrosoftNETRuntimeMonoTargetsSdkPackageVersion>11.0.0-preview.7.26365.101</MicrosoftNETRuntimeMonoTargetsSdkPackageVersion>
<MicrosoftNETSdkPackageVersion>11.0.100-preview.7.26365.101</MicrosoftNETSdkPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>11.0.0-preview.7.26365.101</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftTemplateEngineAuthoringTasksPackageVersion>11.0.100-preview.7.26365.101</MicrosoftTemplateEngineAuthoringTasksPackageVersion>
<MicrosoftDotNetArcadeSdkPackageVersion>11.0.0-beta.26426.105</MicrosoftDotNetArcadeSdkPackageVersion>
<MicrosoftDotNetBuildTasksFeedPackageVersion>11.0.0-beta.26426.105</MicrosoftDotNetBuildTasksFeedPackageVersion>
<MicrosoftDotNetCecilPackageVersion>0.11.5-preview.26426.105</MicrosoftDotNetCecilPackageVersion>
<MicrosoftDotNetSharedFrameworkSdkPackageVersion>11.0.0-beta.26426.105</MicrosoftDotNetSharedFrameworkSdkPackageVersion>
<MicrosoftNETILLinkPackageVersion>11.0.0-rc.1.26426.105</MicrosoftNETILLinkPackageVersion>
<MicrosoftNETILLinkTasksPackageVersion>11.0.0-rc.1.26426.105</MicrosoftNETILLinkTasksPackageVersion>
<MicrosoftNETRuntimeMonoTargetsSdkPackageVersion>11.0.0-rc.1.26426.105</MicrosoftNETRuntimeMonoTargetsSdkPackageVersion>
<MicrosoftNETSdkPackageVersion>11.0.100-rc.1.26426.105</MicrosoftNETSdkPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>11.0.0-rc.1.26426.105</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftTemplateEngineAuthoringTasksPackageVersion>11.0.100-rc.1.26426.105</MicrosoftTemplateEngineAuthoringTasksPackageVersion>
<!-- dotnet-macios dependencies -->
<MicrosoftiOSSdknet100_260PackageVersion>26.0.11017</MicrosoftiOSSdknet100_260PackageVersion>
<MicrosoftiOSSdknet100_265PackageVersion>26.5.10315</MicrosoftiOSSdknet100_265PackageVersion>
Expand All @@ -30,7 +30,7 @@ This file should be imported by eng/Versions.props
<MicrosofttvOSSdknet100_265PackageVersion>26.5.10315</MicrosofttvOSSdknet100_265PackageVersion>
<MicrosofttvOSSdknet100_270PackageVersion>27.0.10241-xcode27.0</MicrosofttvOSSdknet100_270PackageVersion>
<!-- dotnet-xharness dependencies -->
<MicrosoftDotNetXHarnessiOSSharedPackageVersion>11.0.0-prerelease.26370.1</MicrosoftDotNetXHarnessiOSSharedPackageVersion>
<MicrosoftDotNetXHarnessiOSSharedPackageVersion>11.0.0-prerelease.26217.1</MicrosoftDotNetXHarnessiOSSharedPackageVersion>
</PropertyGroup>
<!--Property group for alternate package version names-->
<PropertyGroup>
Expand Down
40 changes: 20 additions & 20 deletions eng/Version.Details.xml
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
<Dependencies>
<ProductDependencies>
<Dependency Name="Microsoft.NET.Sdk" Version="11.0.100-preview.7.26365.101">
<Dependency Name="Microsoft.NET.Sdk" Version="11.0.100-rc.1.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.ILLink" Version="11.0.0-preview.7.26365.101">
<Dependency Name="Microsoft.NET.ILLink" Version="11.0.0-rc.1.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.ILLink.Tasks" Version="11.0.0-preview.7.26365.101">
<Dependency Name="Microsoft.NET.ILLink.Tasks" Version="11.0.0-rc.1.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.NET.Runtime.MonoTargets.Sdk" Version="11.0.0-preview.7.26365.101">
<Dependency Name="Microsoft.NET.Runtime.MonoTargets.Sdk" Version="11.0.0-rc.1.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<!-- Set TRACKING_DOTNET_RUNTIME_SEPARATELY to something in Make.config if changing the version outside of dependency flow -->
<Dependency Name="Microsoft.NETCore.App.Ref" Version="11.0.0-preview.7.26365.101">
<Dependency Name="Microsoft.NETCore.App.Ref" Version="11.0.0-rc.1.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.Cecil" Version="0.11.5-preview.26365.101">
<Dependency Name="Microsoft.DotNet.Cecil" Version="0.11.5-preview.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<!-- This is a subscription of the .NET 10/Xcode 26.0 versions of our packages -->
<Dependency Name="Microsoft.MacCatalyst.Sdk.net10.0_26.0" Version="26.0.11017">
Expand Down Expand Up @@ -78,25 +78,25 @@
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
<Dependency Name="Microsoft.DotNet.Build.Tasks.Feed" Version="11.0.0-beta.26365.101">
<Dependency Name="Microsoft.DotNet.Build.Tasks.Feed" Version="11.0.0-beta.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.SharedFramework.Sdk" Version="11.0.0-beta.26365.101">
<Dependency Name="Microsoft.DotNet.SharedFramework.Sdk" Version="11.0.0-beta.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.TemplateEngine.Authoring.Tasks" Version="11.0.100-preview.7.26365.101">
<Dependency Name="Microsoft.TemplateEngine.Authoring.Tasks" Version="11.0.100-rc.1.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.XHarness.iOS.Shared" Version="11.0.0-prerelease.26217.1">
<Uri>https://github.com/dotnet/xharness</Uri>
<Sha>866707736d49c2323628744716cda2475b3af9ee</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="11.0.0-beta.26365.101">
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="11.0.0-beta.26426.105">
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>cb8306a63c5cf24e9381108a3a9eb58907fd0f60</Sha>
<Sha>89234f1cec03c854aff3e426e8d5489a3b68eb64</Sha>
<SourceBuild RepoName="arcade" ManagedOnly="true" />
</Dependency>
</ToolsetDependencies>
Expand Down
164 changes: 164 additions & 0 deletions eng/common/Get-GitHubAppToken.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
# 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.
#
# 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.
# - The App must be installed on the target organization/account
# (`InstallationOwner`) with the permissions/repositories it needs.
#
# Installation tokens (ghs_*) are exempt from the enterprise classic-PAT
# lifetime policy, which is why this replaces the long-lived PAT.

[CmdletBinding()]
param(
# Name of the Key Vault that holds the GitHub App's RSA signing key.
[Parameter(Mandatory = $true)]
[string] $KeyVaultName,

# Name of the RSA key inside the Key Vault (the App's private key).
[Parameter(Mandatory = $true)]
[string] $KeyName,

# The GitHub App's Client ID (the value to put in the `iss` JWT claim).
[Parameter(Mandatory = $true)]
[string] $AppClientId,

# Login of the organization or user account whose installation we should
# mint the token for (e.g. `dotnet`, `microsoft`).
[Parameter(Mandatory = $true)]
[string] $InstallationOwner,

# Optional Azure DevOps pipeline variable name to set with the installation
# token (marked as a secret). When not specified, the token is written to
# stdout instead.
[Parameter(Mandatory = $false)]
[string] $OutputVariableName
)

$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true

. $PSScriptRoot\pipeline-logging-functions.ps1

function ConvertTo-Base64Url([byte[]] $bytes) {
return [Convert]::ToBase64String($bytes).TrimEnd('=').Replace('+', '-').Replace('/', '_')
}

# Build JWT header and payload. Use [ordered] hashtables so JSON
# serialization is deterministic.
$jwtHeader = [ordered]@{
alg = 'RS256'
typ = 'JWT'
}
$now = [System.DateTimeOffset]::UtcNow
$jwtPayload = [ordered]@{
iat = $now.AddMinutes(-1).ToUnixTimeSeconds()
exp = $now.AddMinutes(5).ToUnixTimeSeconds()
iss = $AppClientId
}

$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)

Write-Host "Signing JWT with key '$KeyName' in vault '$KeyVaultName'..."
$previousNativeCommandErrorPreference = $PSNativeCommandUseErrorActionPreference
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
}
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."
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
}
$signatureUrl = $signatureBase64.Trim().TrimEnd('=').Replace('+', '-').Replace('/', '_')
$jwt = "$signingInput.$signatureUrl"

$headers = @{
Authorization = "Bearer $jwt"
'X-GitHub-Api-Version' = '2022-11-28'
Accept = 'application/vnd.github+json'
'User-Agent' = 'dotnet-arcade-onelocbuild'
}

Write-Host "Looking up installation for '$InstallationOwner'..."
try {
$installations = @()
$page = 1
do {
# Assign the response before wrapping it in @(). PowerShell otherwise
# preserves a top-level JSON array as one nested pipeline object.
$pageResponse = Invoke-RestMethod `
-Uri "https://api.github.com/app/installations?per_page=100&page=$page" `
-Headers $headers `
-Method Get
$pageInstallations = @($pageResponse)
$installations += $pageInstallations
$page++
} while ($pageInstallations.Count -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."
exit 1
}
$matchingInstallations = @($installations | Where-Object { $_.account.login -ieq $InstallationOwner })
if ($matchingInstallations.Count -eq 0) {
$found = ($installations | ForEach-Object { $_.account.login }) -join ', '
Write-PipelineTelemetryError -Category 'Build' -Message "No installation found for '$InstallationOwner'. App is installed on: $found"
exit 1
}
if ($matchingInstallations.Count -ne 1) {
$matchingIds = ($matchingInstallations | ForEach-Object { $_.id }) -join ', '
Write-PipelineTelemetryError -Category 'Build' -Message "Found multiple installations for '$InstallationOwner': $matchingIds"
exit 1
}
$installation = $matchingInstallations[0]
Write-Host "Using installation $($installation.id) for '$($installation.account.login)'."

try {
$tokenResponse = Invoke-RestMethod `
-Uri "https://api.github.com/app/installations/$($installation.id)/access_tokens" `
-Headers $headers `
-Method Post `
-ContentType 'application/json'
}
catch {
Write-PipelineTelemetryError -Category 'Build' -Message "Failed to mint an installation access token for '$InstallationOwner' (installation $($installation.id)): $_"
exit 1
}

Write-Host "Got installation token for '$InstallationOwner' (expires $($tokenResponse.expires_at))."
if ($OutputVariableName) {
Write-Host "Setting pipeline variable '$OutputVariableName'."
Write-Host "##vso[task.setvariable variable=$OutputVariableName;issecret=true]$($tokenResponse.token)"
}
else {
Write-Host $tokenResponse.token -ForegroundColor Green
}
Loading
Loading