From 5e3c2631bcec1c0d490e214536f7d0b95e110316 Mon Sep 17 00:00:00 2001 From: Stella Huang Date: Thu, 23 Jul 2026 12:10:09 -0700 Subject: [PATCH 1/3] Fix stale Pylance resolution in cached builds Refresh registry metadata when resolving latest Pylance versions, while preserving cached package downloads. Quote and scope dynamic cache key segments so explicit dotted versions work and stable/preview cache fallbacks do not cross channels. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 42f01b56-f94e-4760-8e1d-d0893ff82b26 --- Build/PreBuild.ps1 | 4 ++-- Build/templates/restore_packages.yml | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Build/PreBuild.ps1 b/Build/PreBuild.ps1 index 13cfc5ec05..2173fe102c 100644 --- a/Build/PreBuild.ps1 +++ b/Build/PreBuild.ps1 @@ -137,8 +137,8 @@ try { "Pylance version = $pylanceVersion" "Pylance release type = $pylanceReleaseType" - # Get all the versions in the feed in descending order - $versions = npm view @pylance/pylance versions --json | ConvertFrom-Json + # CI prefers cached data for installs, but "latest" must refresh registry metadata. + $versions = npm view @pylance/pylance versions --json --prefer-offline=false --prefer-online=true | ConvertFrom-Json [array]::Reverse($versions) # Find the highest version with an appropriate patch number. diff --git a/Build/templates/restore_packages.yml b/Build/templates/restore_packages.yml index 8b8d7154d2..b1c7633346 100644 --- a/Build/templates/restore_packages.yml +++ b/Build/templates/restore_packages.yml @@ -78,9 +78,9 @@ steps: - task: Cache@2 displayName: 'Cache node_modules' inputs: - key: 'node_modules | "$(Agent.OS)" | package.json | ${{ parameters.pylanceVersion }} | ${{ parameters.pylanceReleaseType }}' + key: 'node_modules | "$(Agent.OS)" | "${{ parameters.pylanceVersion }}" | "${{ parameters.pylanceReleaseType }}" | package.json' restoreKeys: | - node_modules | "$(Agent.OS)" | package.json + node_modules | "$(Agent.OS)" | "${{ parameters.pylanceVersion }}" | "${{ parameters.pylanceReleaseType }}" node_modules | "$(Agent.OS)" path: '$(Build.SourcesDirectory)\\node_modules' @@ -88,9 +88,9 @@ steps: - task: Cache@2 displayName: 'Cache npm' inputs: - key: 'npm | "$(Agent.OS)" | package.json | ${{ parameters.pylanceVersion }} | ${{ parameters.pylanceReleaseType }}' + key: 'npm | "$(Agent.OS)" | "${{ parameters.pylanceVersion }}" | "${{ parameters.pylanceReleaseType }}" | package.json' restoreKeys: | - npm | "$(Agent.OS)" | package.json + npm | "$(Agent.OS)" | "${{ parameters.pylanceVersion }}" | "${{ parameters.pylanceReleaseType }}" npm | "$(Agent.OS)" path: '$(Pipeline.Workspace)\\npm-cache' @@ -98,7 +98,7 @@ steps: - task: Cache@2 displayName: 'Cache PyPI wheels' inputs: - key: 'pypi-wheels | "$(Agent.OS)" | ${{ parameters.debugpyVersion }}' + key: 'pypi-wheels | "$(Agent.OS)" | "${{ parameters.debugpyVersion }}"' restoreKeys: | pypi-wheels | "$(Agent.OS)" path: '$(Pipeline.Workspace)\\pypi-wheel-cache' From 4194531972e60dbac57bbc1b65f9ba1dfa197501 Mon Sep 17 00:00:00 2001 From: Stella Huang Date: Thu, 23 Jul 2026 12:30:44 -0700 Subject: [PATCH 2/3] Use Node 24 to restore Pylance Pylance 2026.3.1 and current previews require Node 24. Select a compatible Node runtime before the shared package restore so npm does not emit an unsupported-engine error under the agent default Node 12. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 42f01b56-f94e-4760-8e1d-d0893ff82b26 --- Build/templates/restore_packages.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Build/templates/restore_packages.yml b/Build/templates/restore_packages.yml index b1c7633346..c18330fdf6 100644 --- a/Build/templates/restore_packages.yml +++ b/Build/templates/restore_packages.yml @@ -17,6 +17,12 @@ parameters: steps: + # Pylance releases require Node.js 24 or newer. + - task: NodeTool@0 + displayName: 'Use Node.js 24' + inputs: + versionSpec: '24.x' + # Point NuGet HTTP cache to a pipeline-controlled location so we can cache it between runs. # packages.config restores don't use the global-packages folder, but they do use the HTTP cache # to avoid re-downloading packages from the feed. From 0b0b54bd8f29db1dd9b2a7f4eed47afdb2d91f99 Mon Sep 17 00:00:00 2001 From: Stella Huang Date: Thu, 23 Jul 2026 12:46:20 -0700 Subject: [PATCH 3/3] Remove obsolete npm always-auth setting npm 11 no longer recognizes always-auth and writes a warning to stderr for every command. npmAuthenticate continues to provide registry-scoped credentials, so remove the unsupported project setting to keep the restore task error-free under Node 24. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 42f01b56-f94e-4760-8e1d-d0893ff82b26 --- .npmrc | 1 - 1 file changed, 1 deletion(-) diff --git a/.npmrc b/.npmrc index 774bd30124..b2359ce61c 100644 --- a/.npmrc +++ b/.npmrc @@ -2,5 +2,4 @@ # registry=https://pkgs.dev.azure.com/devdiv/_packaging/Pylance/npm/registry/ registry=https://pkgs.dev.azure.com/azure-public/vside/_packaging/msft_consumption/npm/registry/ -always-auth=true package-lock=false \ No newline at end of file