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/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 16fd147f5db..fe8e120cea8 100644 --- a/packages/http-client-python/eng/scripts/Build-Packages.ps1 +++ b/packages/http-client-python/eng/scripts/Build-Packages.ps1 @@ -1,30 +1,4 @@ #Requires -Version 7.0 -<# -.SYNOPSIS - Builds and packages the TypeSpec Python emitter for publishing. - -.DESCRIPTION - This script is called by the CI pipeline to create publishable packages. - It runs: - 1. npm run build - Compile TypeScript emitter and build Python wheel - 2. npm run lint - Run linting (Linux only) - 3. npm pack - Create npm tarball for publishing - -.PARAMETER BuildNumber - The build number for versioning. - -.PARAMETER Output - Output directory for built packages. Defaults to ./ci-build. - -.PARAMETER Prerelease - Flag indicating if this is a prerelease build. - -.PARAMETER PublishType - Type of publish: "internal" for dev feed, otherwise public. - -.EXAMPLE - ./Build-Packages.ps1 -Output ./dist -#> param( [string] $BuildNumber, @@ -35,13 +9,14 @@ param( $ErrorActionPreference = 'Stop' Set-StrictMode -Version 3.0 - -# Setup paths and helpers $packageRoot = (Resolve-Path "$PSScriptRoot/../..").Path.Replace('\', '/') . "$packageRoot/../../eng/emitters/scripts/CommandInvocation-Helpers.ps1" Set-ConsoleEncoding -# Helper function to write package info for downstream publishing +Write-Host "Building packages for BuildNumber: '$BuildNumber', Output: '$Output', Prerelease: '$Prerelease', PublishType: '$PublishType'" + +$outputPath = $Output ? $Output : "$packageRoot/ci-build" + function Write-PackageInfo { param( [string] $packageName, @@ -55,66 +30,75 @@ function Write-PackageInfo { } @{ - Name = $packageName - Version = $version + Name = $packageName + Version = $version DirectoryPath = $directoryPath - SdkType = "client" - IsNewSdk = $true + SdkType = "client" + IsNewSdk = $true ReleaseStatus = "Unreleased" } | ConvertTo-Json | Set-Content -Path "$packageInfoPath/$packageName.json" } -Write-Host "Building packages for BuildNumber: '$BuildNumber', Output: '$Output', Prerelease: '$Prerelease', PublishType: '$PublishType'" +function Set-VersionVariable { + param( + [string] $variableName, + [string] $version + ) -# Setup output directory -$outputPath = $Output ? $Output : "$packageRoot/ci-build" + Write-Host "Setting output variable '$variableName' to $version" + Write-Host "##vso[task.setvariable variable=$variableName;isOutput=true]$version" +} + +# create the output folders $outputPath = New-Item -ItemType Directory -Force -Path $outputPath | Select-Object -ExpandProperty FullName New-Item -ItemType Directory -Force -Path "$outputPath/packages" | Out-Null -# Get package version +Write-Host "Getting existing versions" $emitterVersion = node -p -e "require('$packageRoot/package.json').version" -Write-Host "Package version: $emitterVersion" +if ($BuildNumber) { + # set package versions + $versionTag = $Prerelease ? "-alpha" : "-beta" + + $emitterVersion = "$emitterVersion$versionTag.$BuildNumber" + Set-VersionVariable -variableName "emitterVersion" -version $emitterVersion +} + +# build and pack the emitter Push-Location "$packageRoot" try { - # Step 1: Build the emitter and generator - Write-Host "`n=== Building emitter and generator ===" -ForegroundColor Cyan + Write-Host "Working in $PWD" + Invoke-LoggedCommand "npm run build" -GroupOutput - # Step 2: Run linting (Linux only, as CI runs on Linux) - if ($IsLinux) { - Write-Host "`n=== Running lint checks ===" -ForegroundColor Cyan - Invoke-LoggedCommand "npm run lint" -GroupOutput - } + if ($BuildNumber) { + Write-Host "Updating package.json to version: $emitterVersion`n" - # Step 3: Create npm package - Write-Host "`n=== Creating npm package ===" -ForegroundColor Cyan - Invoke-LoggedCommand "npm pack" - Copy-Item "typespec-http-client-python-$emitterVersion.tgz" -Destination "$outputPath/packages" + $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 4: Verify package can be installed - Write-Host "`n=== Verifying package installation ===" -ForegroundColor Cyan - Invoke-LoggedCommand "npm install typespec-http-client-python-$emitterVersion.tgz" -GroupOutput + # pack the emitter + $file = Invoke-LoggedCommand "npm pack -q" + Copy-Item $file -Destination "$outputPath/packages" - # Write package info for publishing pipeline - Write-PackageInfo -packageName "typespec-http-client-python" ` - -directoryPath "packages/http-client-python/emitter/src" ` - -version $emitterVersion + Write-PackageInfo -packageName "typespec-http-client-python" -directoryPath "packages/http-client-python/emitter/src" -version $emitterVersion } finally { Pop-Location } -# Generate override URLs for internal publishing -$overrides = @{} if ($PublishType -eq "internal") { $feedUrl = "https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-js/npm/registry" - $overrides["@typespec/http-client-python"] = "$feedUrl/@typespec/http-client-python/-/http-client-python-$emitterVersion.tgz" + + $overrides = @{ + "@typespec/http-client-python" = "$feedUrl/@typespec/http-client-python/-/http-client-python-$emitterVersion.tgz" + } +} else { + $overrides = @{} } + $overrides | ConvertTo-Json | Set-Content "$outputPath/overrides.json" -# Write package version matrix @{ "emitter" = $emitterVersion } | ConvertTo-Json | Set-Content "$outputPath/package-versions.json" - -Write-Host "`n=== Build complete ===" -ForegroundColor Green -Write-Host "Output: $outputPath"