diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 8874d72a74..b0d7d89532 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -68,6 +68,10 @@ jobs: run: | npm ci + - name: Stamp build as pull request version + run: | + node scripts/stamp-prerelease-version.mjs "${{ github.run_id }}" --label pr + - name: MSSQL - Install dependencies and build uses: ./.github/actions/build-mssql @@ -86,7 +90,7 @@ jobs: # that increase size - name: Package extensions run: | - npm run package + npm run package -- --preview - name: MSSQL - Upload VSIX files uses: actions/upload-artifact@v6 diff --git a/build/PullRequest.yml b/build/PullRequest.yml index 5f9a06cccd..87b207fc8f 100644 --- a/build/PullRequest.yml +++ b/build/PullRequest.yml @@ -12,6 +12,11 @@ steps: displayName: Install root dependencies workingDirectory: "$(Build.SourcesDirectory)" + - pwsh: | + node scripts/stamp-prerelease-version.mjs "$(Build.BuildNumber)" --label pr + displayName: Stamp build as pull request version + workingDirectory: "$(Build.SourcesDirectory)" + - template: ./templates/build-mssql.yml@self parameters: packageOffline: false # don't build offline packages for PR builds to speed runs up diff --git a/build/templates/build-data-workspace.yml b/build/templates/build-data-workspace.yml index 8f152ca93c..27839dfe52 100644 --- a/build/templates/build-data-workspace.yml +++ b/build/templates/build-data-workspace.yml @@ -33,7 +33,7 @@ steps: condition: succeededOrFailed() - pwsh: | - npm run package -- --target data-workspace + npm run package -- --target data-workspace --preview displayName: DataWorkspace - Package extension workingDirectory: "$(Build.SourcesDirectory)" diff --git a/build/templates/build-database-management-keymap.yml b/build/templates/build-database-management-keymap.yml index 3a7f2895f7..d1b35487c8 100644 --- a/build/templates/build-database-management-keymap.yml +++ b/build/templates/build-database-management-keymap.yml @@ -5,7 +5,7 @@ steps: version: 24.x - pwsh: | - npm run package -- --target database-management-keymap + npm run package -- --target database-management-keymap --preview displayName: Keymap - Package extension workingDirectory: "$(Build.SourcesDirectory)" diff --git a/build/templates/build-mssql.yml b/build/templates/build-mssql.yml index 289a4e9adc..e4ab0adff9 100644 --- a/build/templates/build-mssql.yml +++ b/build/templates/build-mssql.yml @@ -38,12 +38,12 @@ steps: condition: succeededOrFailed() - pwsh: | - npm run package -- --target mssql --online + npm run package -- --target mssql --online --preview displayName: MSSQL - Package extension (online) workingDirectory: "$(Build.SourcesDirectory)" - pwsh: | - npm run package -- --target mssql --offline + npm run package -- --target mssql --offline --preview displayName: MSSQL - Package extension (offline) workingDirectory: "$(Build.SourcesDirectory)" condition: eq( ${{ parameters.packageOffline }}, 'true') diff --git a/build/templates/build-sql-database-projects.yml b/build/templates/build-sql-database-projects.yml index a1a84afece..074e72d6d7 100644 --- a/build/templates/build-sql-database-projects.yml +++ b/build/templates/build-sql-database-projects.yml @@ -34,7 +34,7 @@ steps: continueOnError: true - pwsh: | - npm run package -- --target sql-database-projects + npm run package -- --target sql-database-projects --preview displayName: SqlProj - Package extension workingDirectory: "$(Build.SourcesDirectory)" diff --git a/extensions/mssql/scripts/package-extension.js b/extensions/mssql/scripts/package-extension.js index 305136cb6b..1e65aac95c 100644 --- a/extensions/mssql/scripts/package-extension.js +++ b/extensions/mssql/scripts/package-extension.js @@ -13,6 +13,7 @@ const args = process.argv.slice(2); let isOnline = args.includes("--online"); const isOffline = args.includes("--offline"); const skipServiceInstall = args.includes("--skip-service-install"); +const isPreRelease = args.includes("--pre-release"); const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm"; // Platform configurations for offline packaging @@ -100,12 +101,16 @@ async function cleanServiceInstallFolder() { /** * Package extension using vsce */ -function packageExtension(packageName = null) { +function packageExtension(packageName = null, preRelease = false) { logger.step("Packaging extension with vsce..."); try { const vsceArgs = ["exec", "--", "vsce", "package", "--no-dependencies"]; + if (preRelease) { + vsceArgs.push("--pre-release"); + } + if (packageName) { vsceArgs.push("-o", packageName); } @@ -124,7 +129,7 @@ function packageExtension(packageName = null) { * Package extension for online distribution */ async function packageOnline(options = {}) { - const { skipServiceInstall = false } = options; + const { skipServiceInstall = false, preRelease = false } = options; logger.header("Package extension (Online Mode)"); logger.info("Creating extension package with portable SQL Tools Service"); @@ -139,7 +144,7 @@ async function packageOnline(options = {}) { await installSqlToolsService(platform.Runtime.Portable); } // Package the extension - packageExtension(); + packageExtension(null, preRelease); logger.success("Online packaging completed successfully!"); } catch (error) { logger.error(`Online packaging failed: ${error.message}`); @@ -150,7 +155,7 @@ async function packageOnline(options = {}) { /** * Package extension for a specific platform (offline) */ -async function packageOfflinePlatform(platformConfig, packageName) { +async function packageOfflinePlatform(platformConfig, packageName, preRelease = false) { const { rid, runtime } = platformConfig; logger.step(`Packaging for ${rid}...`); @@ -166,7 +171,7 @@ async function packageOfflinePlatform(platformConfig, packageName) { await installSqlToolsService(runtimeValue); // Package with platform-specific name const platformPackageName = `${packageName}-${rid}.vsix`; - packageExtension(platformPackageName); + packageExtension(platformPackageName, preRelease); logger.success(`${rid} package created`); } catch (error) { logger.error(`Failed to package ${rid}: ${error.message}`); @@ -177,7 +182,8 @@ async function packageOfflinePlatform(platformConfig, packageName) { /** * Package extension for offline distribution (all platforms) */ -async function packageOffline() { +async function packageOffline(options = {}) { + const { preRelease = false } = options; logger.header("Package extension (Offline Mode)"); try { @@ -200,7 +206,7 @@ async function packageOffline() { ); try { - await packageOfflinePlatform(platformConfig, packageName); + await packageOfflinePlatform(platformConfig, packageName, preRelease); } catch (error) { logger.warning(`Skipping ${platformConfig.rid}: ${error.message}`); } @@ -230,6 +236,7 @@ Modes: --online Package with portable SQL Tools Service (requires dotnet runtime at runtime). Default if not specified. --offline Package with native self-contained SQL Tools Service for each platform (no dotnet needed). --skip-service-install Online mode only. Reuse existing SQL Tools Service files and skip clean/install. + --pre-release Mark the package as a pre-release extension. --help Show this help message Examples: @@ -272,9 +279,9 @@ async function main() { try { if (isOnline) { - await packageOnline({ skipServiceInstall }); + await packageOnline({ skipServiceInstall, preRelease: isPreRelease }); } else if (isOffline) { - await packageOffline(); + await packageOffline({ preRelease: isPreRelease }); } logger.success("Packaging script completed successfully!"); diff --git a/scripts/stamp-prerelease-version.mjs b/scripts/stamp-prerelease-version.mjs new file mode 100644 index 0000000000..19062aae63 --- /dev/null +++ b/scripts/stamp-prerelease-version.mjs @@ -0,0 +1,93 @@ +// Stamps a pre-release version onto every extension's package.json. +// New version format: -