From 0ec3ed17f61b5a1583dfbbc988b66702fe9b8b18 Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 22 Jun 2026 15:00:37 -0700 Subject: [PATCH 1/5] Use default npmrc userprofile --- eng/common/pipelines/ci.yml | 3 ++ .../steps/create-authenticated-npmrc.yml | 41 +++++++++++++++++++ .../templates/stages/emitter-stages.yml | 6 +-- .../pipelines/templates/steps/build-step.yml | 2 + .../steps/create-authenticated-npmrc.yml | 23 ----------- .../pipelines/templates/steps/test-step.yml | 2 + .../pipelines/jobs/cli/build-tsp-cli.yml | 2 + eng/tsp-core/pipelines/templates/install.yml | 1 + .../eng/pipeline/publish.yml | 3 ++ 9 files changed, 56 insertions(+), 27 deletions(-) create mode 100644 eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml delete mode 100644 eng/emitters/pipelines/templates/steps/create-authenticated-npmrc.yml diff --git a/eng/common/pipelines/ci.yml b/eng/common/pipelines/ci.yml index 008fec91a32..0e1261fcb96 100644 --- a/eng/common/pipelines/ci.yml +++ b/eng/common/pipelines/ci.yml @@ -29,6 +29,9 @@ extends: displayName: Install Node.js inputs: versionSpec: 22.x + + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field displayName: Install pnpm diff --git a/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml b/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml new file mode 100644 index 00000000000..3fa699b387d --- /dev/null +++ b/eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml @@ -0,0 +1,41 @@ +parameters: + - name: npmrcPath + type: string + # When empty, defaults to the agent user's .npmrc ($HOME/.npmrc on + # Linux/macOS, %USERPROFILE%\.npmrc on Windows) so every subsequent + # npm / pnpm / npx call in the job inherits the registry + auth. + default: "" + - name: registryUrl + type: string + default: "https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-js/npm/registry/" + - name: CustomCondition + type: string + default: succeeded() + - name: ServiceConnection + type: string + default: "" + +steps: + - pwsh: | + $npmrcPath = '${{ parameters.npmrcPath }}' + if (-not $npmrcPath) { $npmrcPath = Join-Path $HOME '.npmrc' } + + Write-Host "Creating .npmrc file $npmrcPath for registry ${{ parameters.registryUrl }}" + $parentFolder = Split-Path -Path $npmrcPath -Parent + + if ($parentFolder -and -not (Test-Path $parentFolder)) { + Write-Host "Creating folder $parentFolder" + New-Item -Path $parentFolder -ItemType Directory | Out-Null + } + + "registry=${{ parameters.registryUrl }}" | Out-File $npmrcPath + Write-Host "##vso[task.setvariable variable=resolvedNpmrcPath]$npmrcPath" + displayName: "Create .npmrc" + condition: ${{ parameters.CustomCondition }} + + - task: npmAuthenticate@0 + displayName: Authenticate .npmrc + condition: ${{ parameters.CustomCondition }} + inputs: + workingFile: $(resolvedNpmrcPath) + azureDevOpsServiceConnection: ${{ parameters.ServiceConnection }} diff --git a/eng/emitters/pipelines/templates/stages/emitter-stages.yml b/eng/emitters/pipelines/templates/stages/emitter-stages.yml index 7d73d17a2cc..2adecca67ba 100644 --- a/eng/emitters/pipelines/templates/stages/emitter-stages.yml +++ b/eng/emitters/pipelines/templates/stages/emitter-stages.yml @@ -326,10 +326,7 @@ stages: displayName: Download build artifacts # Always publish to internal feed - - template: /eng/emitters/pipelines/templates/steps/create-authenticated-npmrc.yml - parameters: - npmrcPath: $(buildArtifactsPath)/packages/.npmrc - registryUrl: https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-js/npm/registry/ + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml # publish to devops feed - pwsh: | @@ -389,6 +386,7 @@ stages: inputs: versionSpec: "22.x" checkLatest: true + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml - script: npm ci displayName: Install emitter dependencies for playground bundle workingDirectory: $(Build.SourcesDirectory)/${{ parameters.PackagePath }} diff --git a/eng/emitters/pipelines/templates/steps/build-step.yml b/eng/emitters/pipelines/templates/steps/build-step.yml index abac27e71c6..d723de94d4b 100644 --- a/eng/emitters/pipelines/templates/steps/build-step.yml +++ b/eng/emitters/pipelines/templates/steps/build-step.yml @@ -59,6 +59,8 @@ steps: - checkout: self + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - task: NodeTool@0 displayName: Install Node.js retryCountOnTaskFailure: 3 diff --git a/eng/emitters/pipelines/templates/steps/create-authenticated-npmrc.yml b/eng/emitters/pipelines/templates/steps/create-authenticated-npmrc.yml deleted file mode 100644 index d315a7d6234..00000000000 --- a/eng/emitters/pipelines/templates/steps/create-authenticated-npmrc.yml +++ /dev/null @@ -1,23 +0,0 @@ -parameters: - - name: npmrcPath - type: string - - name: registryUrl - type: string - -steps: - - pwsh: | - Write-Host "Creating .npmrc file ${{ parameters.npmrcPath }} for registry ${{ parameters.registryUrl }}" - $parentFolder = Split-Path -Path '${{ parameters.npmrcPath }}' -Parent - - if (!(Test-Path $parentFolder)) { - Write-Host "Creating folder $parentFolder" - New-Item -Path $parentFolder -ItemType Directory | Out-Null - } - - $content = "registry=${{ parameters.registryUrl }}`n`n" + "always-auth=true" - $content | Out-File '${{ parameters.npmrcPath }}' - displayName: "Create .npmrc" - - task: npmAuthenticate@0 - displayName: Authenticate .npmrc - inputs: - workingFile: ${{ parameters.npmrcPath }} diff --git a/eng/emitters/pipelines/templates/steps/test-step.yml b/eng/emitters/pipelines/templates/steps/test-step.yml index fa5b0980c22..04275f2875f 100644 --- a/eng/emitters/pipelines/templates/steps/test-step.yml +++ b/eng/emitters/pipelines/templates/steps/test-step.yml @@ -51,6 +51,8 @@ parameters: steps: - checkout: self + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - download: current artifact: ${{ parameters.BuildArtifactName }} displayName: Download build artifacts diff --git a/eng/tsp-core/pipelines/jobs/cli/build-tsp-cli.yml b/eng/tsp-core/pipelines/jobs/cli/build-tsp-cli.yml index 657b421a9e6..a81710eba69 100644 --- a/eng/tsp-core/pipelines/jobs/cli/build-tsp-cli.yml +++ b/eng/tsp-core/pipelines/jobs/cli/build-tsp-cli.yml @@ -42,6 +42,8 @@ jobs: # - script: npm install -g bun # displayName: Install bun + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - script: npm install -g pnpm displayName: Install pnpm diff --git a/eng/tsp-core/pipelines/templates/install.yml b/eng/tsp-core/pipelines/templates/install.yml index 2daaa085ec1..41e36f9e5ba 100644 --- a/eng/tsp-core/pipelines/templates/install.yml +++ b/eng/tsp-core/pipelines/templates/install.yml @@ -24,6 +24,7 @@ steps: inputs: version: 8.0.x + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field displayName: Install pnpm - script: pnpm config set store-dir ${{ parameters.pnpmStorePath }} diff --git a/packages/http-client-csharp/eng/pipeline/publish.yml b/packages/http-client-csharp/eng/pipeline/publish.yml index c0ba9c6f201..e37e84583fb 100644 --- a/packages/http-client-csharp/eng/pipeline/publish.yml +++ b/packages/http-client-csharp/eng/pipeline/publish.yml @@ -125,6 +125,9 @@ extends: npm_config_cache: $(Agent.TempDirectory)/npm-cache steps: - checkout: self + + - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - pwsh: | # Determine the TypeSpec PR URL $repoUrl = '$(Build.Repository.Uri)'.TrimEnd('/') From a3b2a32b17f655f452a3c1a57fc8bdfaa326ea18 Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 22 Jun 2026 19:14:20 -0700 Subject: [PATCH 2/5] Disable Corepack --- eng/common/pipelines/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/eng/common/pipelines/ci.yml b/eng/common/pipelines/ci.yml index 0e1261fcb96..a71be58423e 100644 --- a/eng/common/pipelines/ci.yml +++ b/eng/common/pipelines/ci.yml @@ -35,6 +35,9 @@ extends: - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field displayName: Install pnpm + - script: corepack disable + displayName: Disable Corepack + - script: pnpm install displayName: Install JavaScript Dependencies From 44eef55c837a32273e95dfbb392947efc9b0c0fd Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 22 Jun 2026 19:23:52 -0700 Subject: [PATCH 3/5] Remove Disable Corepack, use npx for pnpm --- eng/common/pipelines/ci.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/eng/common/pipelines/ci.yml b/eng/common/pipelines/ci.yml index a71be58423e..c438832bb54 100644 --- a/eng/common/pipelines/ci.yml +++ b/eng/common/pipelines/ci.yml @@ -32,19 +32,17 @@ extends: - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml - - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field - displayName: Install pnpm - - - script: corepack disable - displayName: Disable Corepack - - - script: pnpm install + - script: | + corepack disable + npx pnpm install displayName: Install JavaScript Dependencies - script: node $(Build.SourcesDirectory)/eng/common/scripts/resolve-target-branch.js displayName: Resolve target branch - - script: pnpm tsx ./eng/common/scripts/dispatch-area-triggers.ts --target-branch $(TARGET_BRANCH) + - script: | + corepack disable + npx pnpm tsx ./eng/common/scripts/dispatch-area-triggers.ts --target-branch $(TARGET_BRANCH) displayName: "Analyze PR changes" name: InitStep From defffc587f9bbbc77f8c5f6daa7de36fe2939a2d Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 22 Jun 2026 20:22:11 -0700 Subject: [PATCH 4/5] Remove packageManager from the pipeline --- eng/common/pipelines/ci.yml | 18 +++++++++++++----- .../pipelines/templates/steps/test-step.yml | 2 +- eng/tsp-core/pipelines/templates/install.yml | 8 ++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/eng/common/pipelines/ci.yml b/eng/common/pipelines/ci.yml index c438832bb54..72aff7bfcaf 100644 --- a/eng/common/pipelines/ci.yml +++ b/eng/common/pipelines/ci.yml @@ -32,17 +32,25 @@ extends: - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field + displayName: Install pnpm + - script: | - corepack disable - npx pnpm install + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); + delete pkg.packageManager; + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); + " + displayName: Remove packageManager for pipeline + + - script: pnpm install displayName: Install JavaScript Dependencies - script: node $(Build.SourcesDirectory)/eng/common/scripts/resolve-target-branch.js displayName: Resolve target branch - - script: | - corepack disable - npx pnpm tsx ./eng/common/scripts/dispatch-area-triggers.ts --target-branch $(TARGET_BRANCH) + - script: pnpm tsx ./eng/common/scripts/dispatch-area-triggers.ts --target-branch $(TARGET_BRANCH) displayName: "Analyze PR changes" name: InitStep diff --git a/eng/emitters/pipelines/templates/steps/test-step.yml b/eng/emitters/pipelines/templates/steps/test-step.yml index 04275f2875f..59a2beb5689 100644 --- a/eng/emitters/pipelines/templates/steps/test-step.yml +++ b/eng/emitters/pipelines/templates/steps/test-step.yml @@ -52,7 +52,7 @@ steps: - checkout: self - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml - + - download: current artifact: ${{ parameters.BuildArtifactName }} displayName: Download build artifacts diff --git a/eng/tsp-core/pipelines/templates/install.yml b/eng/tsp-core/pipelines/templates/install.yml index 41e36f9e5ba..e1f8fdc6424 100644 --- a/eng/tsp-core/pipelines/templates/install.yml +++ b/eng/tsp-core/pipelines/templates/install.yml @@ -25,6 +25,14 @@ steps: version: 8.0.x - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml + - script: | + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); + delete pkg.packageManager; + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); + " + displayName: Remove packageManager for pipeline - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field displayName: Install pnpm - script: pnpm config set store-dir ${{ parameters.pnpmStorePath }} From 6d4d71a1f20ca9fad520faf463c18ea2a80244c8 Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Wed, 24 Jun 2026 09:27:56 -0700 Subject: [PATCH 5/5] Don't delete package manager --- eng/common/pipelines/ci.yml | 11 +---------- eng/tsp-core/pipelines/templates/install.yml | 12 +++--------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/eng/common/pipelines/ci.yml b/eng/common/pipelines/ci.yml index 72aff7bfcaf..a3d5cf414b8 100644 --- a/eng/common/pipelines/ci.yml +++ b/eng/common/pipelines/ci.yml @@ -32,18 +32,9 @@ extends: - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml - - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field + - script: npm install -g pnpm@10.30.2 # Pnpm manage-package-manager-versions will respect packageManager field displayName: Install pnpm - - script: | - node -e " - const fs = require('fs'); - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - delete pkg.packageManager; - fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); - " - displayName: Remove packageManager for pipeline - - script: pnpm install displayName: Install JavaScript Dependencies diff --git a/eng/tsp-core/pipelines/templates/install.yml b/eng/tsp-core/pipelines/templates/install.yml index e1f8fdc6424..8de49aaecc3 100644 --- a/eng/tsp-core/pipelines/templates/install.yml +++ b/eng/tsp-core/pipelines/templates/install.yml @@ -25,16 +25,10 @@ steps: version: 8.0.x - template: /eng/common/pipelines/templates/steps/create-authenticated-npmrc.yml - - script: | - node -e " - const fs = require('fs'); - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - delete pkg.packageManager; - fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); - " - displayName: Remove packageManager for pipeline - - script: npm install -g pnpm # Pnpm manage-package-manager-versions will respect packageManager field + + - script: npm install -g pnpm@10.30.2 # Pnpm manage-package-manager-versions will respect packageManager field displayName: Install pnpm + - script: pnpm config set store-dir ${{ parameters.pnpmStorePath }} displayName: Setup pnpm cache dir