From 8edde27615578036b360f2abb0175258e7e248c1 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 27 May 2026 13:30:55 -0400 Subject: [PATCH 1/7] fix: stamp prerelease version in Python emitter build script The Build-Packages.ps1 script accepted a -Prerelease flag but never used it to stamp the package version. Every CI build on main produced a package with the same version from package.json, causing npm publish to fail with a 409 conflict when publishing to the DevOps feed. Added prerelease version stamping (matching the pattern used by the C# emitter) that appends -alpha.{BuildNumber} or -beta.{BuildNumber} to the version and updates package.json before npm pack. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../eng/scripts/Build-Packages.ps1 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/http-client-python/eng/scripts/Build-Packages.ps1 b/packages/http-client-python/eng/scripts/Build-Packages.ps1 index 16fd147f5db..f178988d698 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -75,6 +75,13 @@ New-Item -ItemType Directory -Force -Path "$outputPath/packages" | Out-Null $emitterVersion = node -p -e "require('$packageRoot/package.json').version" Write-Host "Package version: $emitterVersion" +# Stamp prerelease version if BuildNumber is provided +if ($BuildNumber) { + $versionTag = $Prerelease ? "-alpha" : "-beta" + $emitterVersion = "$emitterVersion$versionTag.$BuildNumber" + Write-Host "Stamped version: $emitterVersion" +} + Push-Location "$packageRoot" try { # Step 1: Build the emitter and generator @@ -87,7 +94,14 @@ try { Invoke-LoggedCommand "npm run lint" -GroupOutput } - # Step 3: Create npm package + # Step 3: Update package.json version and create npm package + if ($BuildNumber) { + Write-Host "`n=== Updating package.json to version: $emitterVersion ===" -ForegroundColor Cyan + $packageJson = Get-Content -Raw "package.json" | ConvertFrom-Json -AsHashtable + $packageJson.version = $emitterVersion + $packageJson | ConvertTo-Json -Depth 100 | Out-File -Path "package.json" -Encoding utf8 -NoNewline -Force + } + Write-Host "`n=== Creating npm package ===" -ForegroundColor Cyan Invoke-LoggedCommand "npm pack" Copy-Item "typespec-http-client-python-$emitterVersion.tgz" -Destination "$outputPath/packages" From 9e5527ff77fef0ee3d98a72cd47ba6293fbbcf7b Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 27 May 2026 13:31:22 -0400 Subject: [PATCH 2/7] Add changeset for Python prerelease version fix Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...ease-version-stamping-2026-5-27-13-30-0.md | 7 +++++++ .../eng/scripts/Build-Packages.ps1 | 19 ++++++------------- 2 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 .chronus/changes/fix-python-prerelease-version-stamping-2026-5-27-13-30-0.md diff --git a/.chronus/changes/fix-python-prerelease-version-stamping-2026-5-27-13-30-0.md b/.chronus/changes/fix-python-prerelease-version-stamping-2026-5-27-13-30-0.md new file mode 100644 index 00000000000..5cb580941de --- /dev/null +++ b/.chronus/changes/fix-python-prerelease-version-stamping-2026-5-27-13-30-0.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-python" +--- + +Fix CI publish failures by stamping prerelease version in Build-Packages.ps1. The `-Prerelease` flag was accepted but unused, causing every CI build to produce the same version and fail with a 409 conflict on the DevOps feed. diff --git a/packages/http-client-python/eng/scripts/Build-Packages.ps1 b/packages/http-client-python/eng/scripts/Build-Packages.ps1 index f178988d698..f3cb926ffa0 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -75,13 +75,6 @@ New-Item -ItemType Directory -Force -Path "$outputPath/packages" | Out-Null $emitterVersion = node -p -e "require('$packageRoot/package.json').version" Write-Host "Package version: $emitterVersion" -# Stamp prerelease version if BuildNumber is provided -if ($BuildNumber) { - $versionTag = $Prerelease ? "-alpha" : "-beta" - $emitterVersion = "$emitterVersion$versionTag.$BuildNumber" - Write-Host "Stamped version: $emitterVersion" -} - Push-Location "$packageRoot" try { # Step 1: Build the emitter and generator @@ -94,12 +87,12 @@ try { Invoke-LoggedCommand "npm run lint" -GroupOutput } - # Step 3: Update package.json version and create npm package - if ($BuildNumber) { - Write-Host "`n=== Updating package.json to version: $emitterVersion ===" -ForegroundColor Cyan - $packageJson = Get-Content -Raw "package.json" | ConvertFrom-Json -AsHashtable - $packageJson.version = $emitterVersion - $packageJson | ConvertTo-Json -Depth 100 | Out-File -Path "package.json" -Encoding utf8 -NoNewline -Force + # Step 3: Stamp prerelease version if this is a prerelease build + if ($Prerelease) { + Write-Host "`n=== Stamping prerelease version ===" -ForegroundColor Cyan + Invoke-LoggedCommand "pnpm chronus version --prerelease --only `"@typespec/http-client-python`"" + $emitterVersion = node -p -e "require('./package.json').version" + Write-Host "Stamped version: $emitterVersion" } Write-Host "`n=== Creating npm package ===" -ForegroundColor Cyan From a800b2798e600cf86b855e11d9a93d125882d9e5 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 27 May 2026 14:49:42 -0400 Subject: [PATCH 3/7] fix: use npx instead of pnpm for chronus in CI pnpm is not available in the CI build environment which only has npm/node. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/http-client-python/eng/scripts/Build-Packages.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/eng/scripts/Build-Packages.ps1 b/packages/http-client-python/eng/scripts/Build-Packages.ps1 index f3cb926ffa0..eddc8c8c4b1 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -90,7 +90,7 @@ try { # Step 3: Stamp prerelease version if this is a prerelease build if ($Prerelease) { Write-Host "`n=== Stamping prerelease version ===" -ForegroundColor Cyan - Invoke-LoggedCommand "pnpm chronus version --prerelease --only `"@typespec/http-client-python`"" + Invoke-LoggedCommand "npx chronus version --prerelease --only `"@typespec/http-client-python`"" $emitterVersion = node -p -e "require('./package.json').version" Write-Host "Stamped version: $emitterVersion" } From 64788f843b6bc658ebbe33a227eaa53a873b9c5f Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 27 May 2026 14:50:31 -0400 Subject: [PATCH 4/7] fix: install pnpm in CI and revert to pnpm for chronus Add pnpm install step to the build-step template so chronus is available in the CI environment. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/emitters/pipelines/templates/steps/build-step.yml | 3 +++ packages/http-client-python/eng/scripts/Build-Packages.ps1 | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/eng/emitters/pipelines/templates/steps/build-step.yml b/eng/emitters/pipelines/templates/steps/build-step.yml index 2352b172f38..4dc72eb5cfa 100644 --- a/eng/emitters/pipelines/templates/steps/build-step.yml +++ b/eng/emitters/pipelines/templates/steps/build-step.yml @@ -85,6 +85,9 @@ steps: arguments: -UseTypeSpecNext:$${{ parameters.UseTypeSpecNext }} workingDirectory: $(selfRepositoryPath) + - script: npm install -g pnpm + displayName: Install pnpm + - task: PowerShell@2 displayName: "Run build script" name: ci_build diff --git a/packages/http-client-python/eng/scripts/Build-Packages.ps1 b/packages/http-client-python/eng/scripts/Build-Packages.ps1 index eddc8c8c4b1..f3cb926ffa0 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -90,7 +90,7 @@ try { # Step 3: Stamp prerelease version if this is a prerelease build if ($Prerelease) { Write-Host "`n=== Stamping prerelease version ===" -ForegroundColor Cyan - Invoke-LoggedCommand "npx chronus version --prerelease --only `"@typespec/http-client-python`"" + Invoke-LoggedCommand "pnpm chronus version --prerelease --only `"@typespec/http-client-python`"" $emitterVersion = node -p -e "require('./package.json').version" Write-Host "Stamped version: $emitterVersion" } From 9b8cc2d2dc9ed7e54633470343ffdb19d0df5e67 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 27 May 2026 15:20:03 -0400 Subject: [PATCH 5/7] fix: also install @chronus/chronus globally in CI chronus is not in http-client-python's node_modules, so pnpm can't find it. Install it globally alongside pnpm. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/emitters/pipelines/templates/steps/build-step.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/emitters/pipelines/templates/steps/build-step.yml b/eng/emitters/pipelines/templates/steps/build-step.yml index 4dc72eb5cfa..1bae41e60b1 100644 --- a/eng/emitters/pipelines/templates/steps/build-step.yml +++ b/eng/emitters/pipelines/templates/steps/build-step.yml @@ -85,8 +85,8 @@ steps: arguments: -UseTypeSpecNext:$${{ parameters.UseTypeSpecNext }} workingDirectory: $(selfRepositoryPath) - - script: npm install -g pnpm - displayName: Install pnpm + - script: npm install -g pnpm @chronus/chronus + displayName: Install pnpm and chronus - task: PowerShell@2 displayName: "Run build script" From 42e3b65a390180194b85890e36c1ad8c27236417 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 28 May 2026 13:59:40 -0400 Subject: [PATCH 6/7] fix: use BuildNumber for unique prerelease versions, drop global chronus install Address PR review comments: - Remove global @chronus/chronus install from build-step.yml (pnpm chronus is already available) - Replace chronus-based version stamping with direct package.json update using -alpha.$BuildNumber suffix, matching the C# emitter pattern - This ensures each CI build produces a unique version, preventing 409 conflicts on the DevOps feed Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../pipelines/templates/steps/build-step.yml | 4 ++-- .../eng/scripts/Build-Packages.ps1 | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/eng/emitters/pipelines/templates/steps/build-step.yml b/eng/emitters/pipelines/templates/steps/build-step.yml index 1bae41e60b1..4dc72eb5cfa 100644 --- a/eng/emitters/pipelines/templates/steps/build-step.yml +++ b/eng/emitters/pipelines/templates/steps/build-step.yml @@ -85,8 +85,8 @@ steps: arguments: -UseTypeSpecNext:$${{ parameters.UseTypeSpecNext }} workingDirectory: $(selfRepositoryPath) - - script: npm install -g pnpm @chronus/chronus - displayName: Install pnpm and chronus + - script: npm install -g pnpm + displayName: Install pnpm - task: PowerShell@2 displayName: "Run build script" diff --git a/packages/http-client-python/eng/scripts/Build-Packages.ps1 b/packages/http-client-python/eng/scripts/Build-Packages.ps1 index f3cb926ffa0..5e1c39c80b2 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -88,11 +88,14 @@ try { } # Step 3: Stamp prerelease version if this is a prerelease build - if ($Prerelease) { - Write-Host "`n=== Stamping prerelease version ===" -ForegroundColor Cyan - Invoke-LoggedCommand "pnpm chronus version --prerelease --only `"@typespec/http-client-python`"" - $emitterVersion = node -p -e "require('./package.json').version" - Write-Host "Stamped version: $emitterVersion" + if ($BuildNumber) { + $versionTag = $Prerelease ? "-alpha" : "-beta" + $emitterVersion = "$emitterVersion$versionTag.$BuildNumber" + Write-Host "`n=== Stamping prerelease version: $emitterVersion ===" -ForegroundColor Cyan + + $packageJson = Get-Content -Raw "package.json" | ConvertFrom-Json -AsHashtable + $packageJson.version = $emitterVersion + $packageJson | ConvertTo-Json -Depth 100 | Out-File -Path "package.json" -Encoding utf8 -NoNewline -Force } Write-Host "`n=== Creating npm package ===" -ForegroundColor Cyan From eb10f4410426c2ac4fd6e7faff03bcd7fdc55130 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 28 May 2026 14:13:51 -0400 Subject: [PATCH 7/7] fix: use chronus dev versioning, only stamp when changes exist Keep chronus-based prerelease (dev) versioning instead of alpha/BuildNumber. Only run 'chronus version --prerelease' when there are pending change files for @typespec/http-client-python, avoiding 409 conflicts when no changes are queued. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../eng/scripts/Build-Packages.ps1 | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/http-client-python/eng/scripts/Build-Packages.ps1 b/packages/http-client-python/eng/scripts/Build-Packages.ps1 index 5e1c39c80b2..6fa4bc2469a 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -88,14 +88,19 @@ try { } # Step 3: Stamp prerelease version if this is a prerelease build - if ($BuildNumber) { - $versionTag = $Prerelease ? "-alpha" : "-beta" - $emitterVersion = "$emitterVersion$versionTag.$BuildNumber" - Write-Host "`n=== Stamping prerelease version: $emitterVersion ===" -ForegroundColor Cyan - - $packageJson = Get-Content -Raw "package.json" | ConvertFrom-Json -AsHashtable - $packageJson.version = $emitterVersion - $packageJson | ConvertTo-Json -Depth 100 | Out-File -Path "package.json" -Encoding utf8 -NoNewline -Force + if ($Prerelease) { + # Only stamp if there are pending chronus change files for this package + $changeFiles = Get-ChildItem -Path "$packageRoot/../../.chronus/changes" -Filter "*.md" -ErrorAction SilentlyContinue | + Where-Object { (Get-Content $_.FullName -Raw) -match "http-client-python" } + + if ($changeFiles) { + Write-Host "`n=== Stamping prerelease version ===" -ForegroundColor Cyan + Invoke-LoggedCommand "pnpm chronus version --prerelease --only @typespec/http-client-python" + $emitterVersion = node -p -e "require('./package.json').version" + Write-Host "Stamped version: $emitterVersion" + } else { + Write-Host "`n=== No pending changes for @typespec/http-client-python, skipping prerelease version stamp ===" -ForegroundColor Yellow + } } Write-Host "`n=== Creating npm package ===" -ForegroundColor Cyan