From c47df393f653840acc8a98e97d238e0176d17a36 Mon Sep 17 00:00:00 2001 From: Benjin Dubishar Date: Wed, 20 May 2026 13:09:57 -0700 Subject: [PATCH 1/4] first swing --- extensions/mssql/scripts/package-extension.js | 25 ++++++++++++------- scripts/workspaces.mjs | 22 +++++++++++++--- 2 files changed, 35 insertions(+), 12 deletions(-) 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/workspaces.mjs b/scripts/workspaces.mjs index b808904b5d..77bb8fa0a2 100644 --- a/scripts/workspaces.mjs +++ b/scripts/workspaces.mjs @@ -22,6 +22,7 @@ function parseArgs(argv) { action, forwardedArgs: [], prod: false, + preview: false, requireTarget: false, targetValue: undefined, }; @@ -45,6 +46,11 @@ function parseArgs(argv) { continue; } + if (arg === "--preview") { + options.preview = true; + continue; + } + if (arg === "--require-target") { options.requireTarget = true; continue; @@ -64,7 +70,7 @@ function printUsage() { npm run test [-- --target [,]] [-- ] npm run smoketest [-- --target [,]] [-- ] npm run lint [-- --target [,]] - npm run package [-- --target [,]] [-- ] + npm run package [-- --target [,]] [--preview] [-- ] npm run list:targets `); } @@ -209,7 +215,7 @@ function listTargets() { } function main() { - const { action, forwardedArgs, prod, requireTarget, targetValue } = parseArgs( + const { action, forwardedArgs, prod, preview, requireTarget, targetValue } = parseArgs( process.argv.slice(2), ); @@ -235,10 +241,20 @@ function main() { ); } + if (preview && action !== "package") { + throw new Error(`The --preview flag is only supported for the "package" action.`); + } + const targets = resolveTargets(action, targetValue); ensureProdBuildSupport(targets, prod); - const actionArgs = prod ? [...forwardedArgs, "--prod"] : forwardedArgs; + let actionArgs = forwardedArgs; + if (prod) { + actionArgs = [...actionArgs, "--prod"]; + } + if (preview) { + actionArgs = [...actionArgs, "--pre-release"]; + } if (action === "watch") { const watchableTargets = pruneRedundantWatchTargets(targets); From eaad477ca14b66ca5f3d1d454000a8d8e5548096 Mon Sep 17 00:00:00 2001 From: "Benjin Dubishar (from Dev Box)" Date: Fri, 22 May 2026 10:42:14 -0700 Subject: [PATCH 2/4] Supporting both --preview and --pre-release flags --- scripts/workspaces.mjs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/scripts/workspaces.mjs b/scripts/workspaces.mjs index 77bb8fa0a2..78bbac4ccf 100644 --- a/scripts/workspaces.mjs +++ b/scripts/workspaces.mjs @@ -22,7 +22,7 @@ function parseArgs(argv) { action, forwardedArgs: [], prod: false, - preview: false, + prerelease: false, requireTarget: false, targetValue: undefined, }; @@ -46,8 +46,8 @@ function parseArgs(argv) { continue; } - if (arg === "--preview") { - options.preview = true; + if (arg === "--preview" || arg === "--pre-release") { + options.prerelease = true; continue; } @@ -70,7 +70,7 @@ function printUsage() { npm run test [-- --target [,]] [-- ] npm run smoketest [-- --target [,]] [-- ] npm run lint [-- --target [,]] - npm run package [-- --target [,]] [--preview] [-- ] + npm run package [-- --target [,]] [--preview|--pre-release] [-- ] npm run list:targets `); } @@ -215,7 +215,7 @@ function listTargets() { } function main() { - const { action, forwardedArgs, prod, preview, requireTarget, targetValue } = parseArgs( + const { action, forwardedArgs, prod, prerelease, requireTarget, targetValue } = parseArgs( process.argv.slice(2), ); @@ -241,8 +241,10 @@ function main() { ); } - if (preview && action !== "package") { - throw new Error(`The --preview flag is only supported for the "package" action.`); + if (prerelease && action !== "package") { + throw new Error( + `The --preview/--pre-release flag is only supported for the "package" action.`, + ); } const targets = resolveTargets(action, targetValue); @@ -252,7 +254,8 @@ function main() { if (prod) { actionArgs = [...actionArgs, "--prod"]; } - if (preview) { + + if (prerelease) { actionArgs = [...actionArgs, "--pre-release"]; } From a20932687c2daa8eb92306caf488d83a8b0d0447 Mon Sep 17 00:00:00 2001 From: "Benjin Dubishar (from Dev Box)" Date: Fri, 22 May 2026 12:38:17 -0700 Subject: [PATCH 3/4] Stamping PR runs as -pr.version+hash --- .github/workflows/build-and-test.yml | 6 +- build/PullRequest.yml | 5 + build/templates/build-data-workspace.yml | 2 +- .../build-database-management-keymap.yml | 2 +- build/templates/build-mssql.yml | 4 +- .../templates/build-sql-database-projects.yml | 2 +- scripts/stamp-prerelease-version.mjs | 93 +++++++++++++++++++ 7 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 scripts/stamp-prerelease-version.mjs 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..19ce9a9abe 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.BuildId)" --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/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: -