Update pipelines for the 7.1 staging branch - #4689
paulmedynski wants to merge 28 commits into
Conversation
Co-authored-by: SqlClient DevOps <sqlclient@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replace inaccessible wording in an internal comment and exclude the Northwind SqlDataAdapter snippet where Country is a required schema identifier. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add multilingual Unicode and UTF-8 coverage for parameters, readers, streaming, and bulk copy across sync and async paths. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Pipelines | Use per-package APIScan name/version pairs Each of our NuGet packages is now registered with APIScan under its own name/version pair, so stop attributing every scan to a single global Microsoft.Data.SqlClient / 6.10 registration. - Reinstate the per-job ob_sdl_apiscan_softwareName and ob_sdl_apiscan_versionNumber variables in build-buildproj-job, driven by packageFullName and a new apiScanSoftwareVersion parameter. - Remove softwareName/versionNumber from the globalSdl.apiscan blocks so the build job template is the single place the pair is specified. - Replace ApiScanSoftwareVersion with ApiScanVersionSqlClient (7.1, this branch targets the 7.1.0 release) and ApiScanVersionSqlServer (1.0). - Disable APIScan on validate-signed-package-job, which produces no assemblies and previously relied on the global registration. - Update the SDL section of the OneBranch pipeline design instructions. * Derive APIScan versions from package versions * Log APIScan versions during version computation
…llers (#4547) * Scope configurable retry logic assembly resolution SqlConfigurableRetryLogicLoader subscribed a handler to AssemblyLoadContext.Default.Resolving in its constructor and never removed it. Because SqlConfigurableRetryLogicManager builds that loader on the default RetryLogicProvider path, simply reading SqlCommand.RetryLogicProvider or SqlConnection.RetryLogicProvider installed a permanent, process-wide assembly resolution hook. The hook then participated in resolving every assembly the host application failed to find, even though the application had not configured any custom retry logic type. It also probed Environment.CurrentDirectory, which is ambient process state unrelated to where the application's binaries live, so assemblies could be resolved from an unintended location. Applications observed this as load failures, and in #2214 as a stack overflow, originating inside SqlClient for assemblies unrelated to SqlClient. Changes: - Probe AppContext.BaseDirectory instead of Environment.CurrentDirectory. - Subscribe the resolving handler only for the duration of the Type.GetType call in LoadType, and remove it in a finally block. - Skip type resolution entirely when no retryLogicType is configured. retryLogicType is optional while retryMethod is required, so configurations selecting a built-in retry method previously still ran the custom type resolution path. Together these mean the handler is never installed unless the application explicitly configured a custom retry logic type, and is gone again as soon as that type has been resolved. Only .NET is affected; the .NET Framework code path does not use AssemblyLoadContext. Refs #2214, #2134 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Test | Address review feedback on retry logic assembly probing tests Replaces the internals-based assertions in the configurable retry logic regression tests with a behavioural probe, and restores the UTF-8 BOM that was dropped from the functional test file. The unit test previously read AssemblyLoadContext's private _resolving field to check whether a handler was still subscribed. That reflects into runtime internals we do not own, so the value cannot simply be exposed internally as review suggested. The functional test took a different but also problematic approach, mutating Environment.CurrentDirectory, which is process-wide state and unsafe under parallel test execution. Both now plant a file that is not a valid assembly in the loader's probing directory (AppContext.BaseDirectory) under a name no other component could request, then assert that Assembly.Load reports it as not found. A subscribed handler would locate that file and surface BadImageFormatException instead, so the assertion discriminates cleanly while observing only public behaviour and touching no shared process state. Verified by temporarily reintroducing the unconditional subscription: all four unit tests and the functional test fail, and pass again once removed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Test | Cover the successful retry logic type resolution path The existing tests only covered the code paths where the assembly probing handler is never subscribed. The path that legitimately subscribes it, a configured custom retry logic type that actually resolves, was untested, so nothing verified that the handler is removed again afterwards. Add a test that resolves a retry logic factory out of the loader's probing directory and asserts that no probing handler remains subscribed once the loader has been constructed. An invocation counter on the factory confirms the configured type really was resolved and used, rather than the loader silently falling back to the built-in factory. Verified the test is sensitive to both behaviours it covers: pointing the loader's probing directory elsewhere makes it fail, and restoring the unconditional handler subscription makes it fail. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Test | Widen probe file cleanup to non-IO failures File.Delete can fail with UnauthorizedAccessException as well as IOException. Catching only the latter meant a cleanup failure could surface as a test failure that had nothing to do with the behaviour under test. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Keep retry logic assembly probing active during provider construction Addresses review feedback that scoping the assembly resolving handler to type resolution alone could break existing consumers whose configured retryLogicType has private dependencies. The handler is now subscribed before LoadType and removed only after CreateInstance has run the configured type's constructor and invoked its retry method, so dependency loads triggered during construction are still resolved. Adds Switch.Microsoft.Data.SqlClient.UseLegacyRetryLogicAssemblyResolution as an escape hatch that restores the process-lifetime handler. The switch restores lifetime only; the probing directory remains AppContext.BaseDirectory, so it cannot re-enable the binary planting vector. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Treat a whitespace-only retryLogicType as not configured A whitespace value has no type to resolve, so it previously installed the resolving handler, attempted resolution and then fell back to the built-in factory. Skipping the subscription reaches the same provider without changing assembly resolution behavior on the application's behalf. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Remove the UseLegacyRetryLogicAssemblyResolution app context switch The switch restored the process-lifetime assembly resolving handler for the one case that scoping cannot cover: a custom retry logic provider whose private dependency is first touched after the provider has been constructed. Shipping a supported way to permanently reinstate a process-wide handler on AssemblyLoadContext.Default works against the point of the change. The driver should not be altering assembly resolution for the whole application on behalf of configurable retry logic, and an affected provider has a simple fix of its own: reference the dependency normally so it lands in deps.json, or register a resolving handler in the application. The handler is now always subscribed only while a configured provider is being resolved and constructed, and only when a custom retry logic type has been configured. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 * Refactor retry assembly resolution subscription Encapsulate the temporary AssemblyLoadContext resolving handler in an IDisposable subscription so cleanup is tied to a using scope. Remove the handler immediately when custom type resolution falls back to the built-in factory, and add direct unit coverage for disposal. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801 --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8018b20-0e43-4de9-93dd-c8080a81a801
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move CI and PR jobs off Microsoft-hosted agents
All jobs that previously ran on the Microsoft-hosted 'Azure Pipelines'
pool now run on our 1ES pools, with the sole exception of macOS jobs,
since our 1ES pools do not offer macOS images.
- Parameterize the pool name and image for the secrets, pack,
verify-nuget, and code-coverage jobs in both the CI and PR
pipelines, defaulting to the 1ES pool with a Linux image (or a
Windows image, for verify-nuget).
- Point the Abstractions package Linux and Windows test jobs at
ADO-UB24-SQL25 and ADO-MMS25-SQL25.
- Drop the redundant hosted Linux and Windows Azure package test jobs.
The self-hosted integration jobs already cover the same runtimes,
and additionally exercise a local SQL Server.
- Pass explicit pool names from the stress and Kerberos pipelines,
which reuse these templates but do not import the CI build
variables.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move the CI package pipeline to the SQL Server 2025 agent images
The nightly package build pipeline still offered ADO-UB24 and ADO-Win25
as its agentImage choices. Move it onto the same images the rest of CI
now uses: ADO-UB24-SQL25 and ADO-MMS25-SQL25.
The job only runs build.proj Pack, so it does not depend on the SQL
Server instance these images carry. Aligning them means we maintain one
set of agent images rather than two.
Note that both ADO-1ES-Pool and ADO-CI-1ES-Pool must publish these
images before this merges, since the pool is chosen based on whether the
build is internal or public.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move the GitHub sync pipeline off the hosted ubuntu-latest agent
This was the last job outside of macOS still running on a
Microsoft-hosted agent. Move it to ADO-UB24-SQL25 on the 1ES pool,
selecting the pool based on the project the way the stress and package
pipelines do.
The job runs a PowerShell script with pwsh, which the ADO-UB24-SQL25
image already provides -- the stress job relies on the same thing
without installing PowerShell first.
After this change, the only remaining Microsoft-hosted jobs are the
macOS ones, since our 1ES pools do not offer macOS images.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Support both 1ES and hosted pools in parameterized job templates
The pack, secrets, coverage and NuGet verification templates now take
poolName/vmImage parameters, but selected the image with a 1ES imageOverride
demand unconditionally. That breaks if a caller (or a variable group that has
not been migrated yet) still points poolName at the hosted 'Azure Pipelines'
pool, which requires vmImage instead.
Use the same conditional pool block the test-* job templates already use, so
these templates work with either pool type.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move agent configuration to pipeline roots
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Flow the CI pool name down from the pipeline root
Review feedback: the pool name was specified in two different ways, and
deep templates read it straight out of a variable group.
Every CI stage and job template now takes the pool name as a required
parameter, threaded down from 'defaultPoolName' in
dotnet-sqlclient-ci-core.yml. That leaves exactly one reference to
$(ci_var_defaultPoolName) per CI pipeline root, mirroring how the PR
pipeline references $(PoolNameDefault) once at its root.
Both roots now document where their variable comes from and why the two
pipeline families use different variable groups.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Move CI and PR pipelines to SQL Server 2025 agent images
Retire every SQL Server 2022 agent image in favour of the SQL Server 2025
equivalents:
ADO-MMS22-SQL22 -> ADO-MMS25-SQL25
ADO-UB22-SQL22 -> ADO-UB24-SQL25
This covers the CI test configurations, the PR pipeline platform list,
the Azure package integration test jobs (including the SQL root path,
which becomes SQL25RootPath), the Managed Instance jobs, the stress test
jobs, and the Linux enclave configuration.
Two notes on the change:
- CI test stage names derive from the image keys, so stages such as
Win22_Sql22 are now named Win25_Sql25. Any branch policies or
required status checks that reference the old stage names will need
to be updated.
- The Linux SQL configuration previously ran on both ADO-UB20-SQL22
and ADO-UB22-SQL22. We only have a single Ubuntu SQL 2025 image, so
it now runs on ADO-UB24-SQL25 alone.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Clarify why the Linux enclave stage key is left unchanged
The Linux enclave image key doubles as the generated ADO stage name and is
referenced by branch policies and required status checks, so it is kept as-is.
The 'Sql19' suffix also remains accurate because these tests target a remote
Enclave-enabled SQL Server 2019; only the agent image moved to Ubuntu 24.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Install sqlcmd on Linux agents before configuring SQL Server
The SQL Server 2025 agent images ship the engine but not the command line
tools, so the Linux SQL configuration steps failed with:
ERROR: 'sqlcmd' was not found on PATH or in the standard mssql-tools locations.
Add a shared 'Install sqlcmd [Linux]' step that reuses an existing sqlcmd when
the image provides one and otherwise installs mssql-tools18, then publishes the
resolved path via the SqlCmdBin variable. Both the PR and CI Linux
configuration steps now run it, and the CI step no longer hardcodes
/opt/mssql-tools/bin/sqlcmd, which does not exist on these images.
sqlcmd from mssql-tools18 encrypts by default, so the step also publishes
SqlCmdTrustArg ('-C') to trust the local server's self-signed certificate.
Without it every connection to localhost would fail certificate validation.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Pipelines | Restore SQL Server 2022 coverage in the CI test matrix (#4587)
* Restore SQL Server 2022 coverage in the CI test matrix
Adds back windows_sql_22_x64 (ADO-MMS22-SQL22) and linux_ub22_sql_22
(ADO-UB22-SQL22) to the CI-SqlClient test configurations, so moving the
primary configurations to SQL Server 2025 does not drop SQL Server 2022
coverage entirely.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Gate SQL Server 2022 test configurations to CI pipelines only
Groups windows_sql_22_x64 and linux_ub22_sql_22 under a single
runSql22Tests conditional (mirroring the existing legacy SQL block) and
opts the PR pipelines out, so PR validation stays on SQL Server 2019,
2025 and Azure SQL.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Add .NET 10 test coverage to the CI-SqlClient pipeline
Introduce primaryTargetFrameworks and primaryTargetFrameworksUnix, which
apply only to the primary test configurations: local SQL Server 2025 and
Azure SQL, on both Windows and Linux. Those configurations now run
net10.0 in addition to the existing target frameworks.
Restricting .NET 10 to the primary configurations keeps the added agent
cost bounded rather than multiplying it across every legacy SQL Server
image. The other pipelines that extend the CI core pin the new
parameters to their existing target framework lists, so their behaviour
is unchanged.
Note that the driver itself only targets net462, net8.0, and net9.0, so
the net10.0 test assemblies resolve the net9.0 driver build. These jobs
therefore validate the driver on the .NET 10 runtime rather than
validating a .NET 10 build of the driver.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Rename the Linux enclave stage key to match its Ubuntu 24 agent
The key doubles as the generated stage name, and it still said Ubuntu20 after
the agent moved to Ubuntu 24. A comment previously justified leaving it alone
by claiming branch policies and required status checks referenced it, but that
is not the case: the ADO branch policies reference pipeline definition ids, the
GitHub 'Main' ruleset defines no required status check contexts, and no policy
or ruleset mentions the stage name. Stage names surface only in check-run
names, so the rename is safe.
Rename it to Ubuntu24_Enclave_Sql19 and keep a one-line note that the 'Sql19'
suffix names the remote Enclave-enabled SQL Server 2019 under test rather than
the agent image.
* Select agent images from the pool name in every job template
Four job templates each decided differently whether to select an image with
'vmImage' (Microsoft-hosted) or an imageOverride demand (1ES): a hostedPool
boolean, a poolName comparison, and a startsWith(vmImage, 'macos') check. The
stress job additionally picked its own pool name from the ADO project.
Unify all four on the poolName comparison already used by the package test
jobs, so the invariant "the hosted 'Azure Pipelines' pool is used only for
macos-latest" is visible at each call site:
pool:
name: ${{ parameters.poolName }}
${{ if eq(parameters.poolName, 'Azure Pipelines') }}:
vmImage: ${{ parameters.vmImage }}
${{ else }}:
demands:
- imageOverride -equals ${{ parameters.vmImage }}
Drop the hostedPool parameter and its plumbing, give the stress job a poolName
parameter flowed down from its pipeline root, and hardcode 'Azure Pipelines' at
the three macOS call sites instead of routing it through an azurePoolName
parameter that no caller ever set.
Also rename the test configuration keys in the CI core pipeline to an
<os>_<sql> form, and split the combined Windows Azure SQL configuration into
separate Windows Server 2025 and Windows 11 configurations.
* Standardize the pool parameter name and clarify pool terminology
Rename the 'adoPoolName' stage parameter to 'poolName'. The name existed to
distinguish it from a sibling 'azurePoolName' parameter, but that sibling is
gone now that the macOS jobs name the Microsoft-hosted pool directly, and three
of the five build stages that used 'adoPoolName' never had a sibling to
disambiguate from. Every pool parameter in eng/pipelines is now 'poolName'.
Document, on each job template that selects an image, that the pool name is
compared at template-expansion time, so the Microsoft-hosted pool must be named
by the literal 'Azure Pipelines' rather than a $(...) macro.
Replace the ambiguous term 'hosted pool' with 'Microsoft-hosted Azure Pipelines
pool', since every pool is hosted somewhere, and reword the SQL Server setup
step headers from '1ES Hosted Pool' to '1ES pools'. Refresh the stale
ADO-UB20-SQL22 example in the CI Linux setup step to ADO-UB24-SQL25.
---------
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Copilot-Session: 10246002-c950-42a7-adf5-1698f9af4b3d
* Add bidi text preservation coverage Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Address directionality test review Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 46c00f98-d1ca-4b28-a221-6328e7d4f1ef --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 46c00f98-d1ca-4b28-a221-6328e7d4f1ef
* Pipelines | Pre-compute all OneBranch package and file versions Make the compute-versions stage the single source of every version the OneBranch build jobs consume, so nothing is re-derived downstream. - Remove the addRevision mode entirely. Package versions now have a single shape driven by the pipeline build number, and the 16-bit revision wrapping, the four-part package base handling, and the Build.BuildId plumbing are gone. - Move package version stamping out of PowerShell and into Versions.props. BuildSuffix now does what it always documented: it turns a stable base into a prerelease. Any version carrying a prerelease tag, from either source, is stamped with the build number; released versions are left untouched. - Publish SqlClient and SqlServer file versions from the compute-versions stage and pass them into the build jobs, which previously received a raw build number and re-derived the file version through MSBuild. build.proj gains opt-in FileVersion* arguments, so PR/CI and local builds are unchanged. - Fix SBOM metadata, which reported the pipeline run number as the version of a single hardcoded package name. Each build job now supplies the name and computed version of the package it produces, and jobs that publish no packages disable SBOM generation instead. * Add version composition target tests for PR 4652 * Fix version extraction example for PR 4652 * Validate computed file version component count for PR 4652 * Require four-part numeric file versions for PR 4652 * Disable SBOM generation in non-producing jobs for PR 4652
Co-authored-by: SqlClient DevOps <sqlclient@microsoft.com>
* Correct SqlMetaData documentation * Correct SqlDataRecord documentation * First round of review feedback * Correct comments in SqlDataRecord.cs code (and identical snippet in docs.) * Grammar fix in SqlMetaData.xml. * Place summary/remarks/example tags in the correct order. * Use correct syntax for a reference to IEnumerable<SqlDataRecord>. * Second round of review feedback
…ion (#4557) * Fix | Preserve delegated transactions when resetting a pooled connection Fixes #4001 A connection can be tied to a transaction in one of two mutually exclusive ways on this code path: - It is the *root* of a delegated transaction. The transaction has been delegated down to this connection, so IsTransactionRoot is true and EnlistedTransaction is null. - It merely *enlisted* in a transaction owned elsewhere, so EnlistedTransaction is set and IsTransactionRoot is false. Before #3019, ResetConnection() only preserved the transaction for the delegated-root case, which missed the enlisted case (#2970). PR #3019 replaced that check with `EnlistedTransaction is not null` rather than adding to it, which fixed #2970 but silently dropped the delegated-root case. The result is that a connection returned to the pool while it is still the root of a live delegated transaction has its server-side transaction reset out from under System.Transactions. When the TransactionScope later rolls back, SqlDelegatedTransaction.Rollback fails and dooms the connection. With a small pool the same doomed physical connection is handed straight back out, producing "The requested operation cannot be completed because the connection has been broken." Preserve the transaction when either condition holds. This is a strict superset of both the pre-#3019 and post-#3019 behavior, so it cannot regress either issue. Verified against the reporter's repro on both the WaitHandle and V2 (channel) connection pools, and against the full manual TransactionTest suite (9/9 passing). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Docs | Add root cause analysis note for #4001 Records the delegated-root vs enlisted-participant distinction that this bug turns on, why #3019 swapped one case for the other rather than covering both, and why the union condition cannot reintroduce #2970. Also records the result of mutation testing the manual TransactionTest suite: the suite passes against the pre-#3019 condition (which carries #2970) and against the #3019 condition (which carries #4001), so it does not currently guard this line. The 9/9 pass rate is evidence of no collateral damage, not evidence that the fix works. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Docs | Trim RCA note for #4001 Drops the alternative-approach rationale, the residual-risk discussion, and the failed-reproduction-variants section, and renumbers the remainder. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Tests | Add regression tests for delegated transaction reset (#4001) Extract the reset-time transaction preservation predicate into an internal testable helper, ShouldPreserveTransactionOnReset, and pin its full truth table with unit tests. This also restores the Is2008OrNewer guard that the original one-line fix dropped. Preserving a delegated transaction root across a reset is only valid on SQL Server 2008 and newer; SQL Server 2005 is still an accepted TDS version, so the guard is load bearing. The tests were mutation tested against three buggy variants of the predicate -- the #3019 condition (reintroduces #4001), the pre-#3019 condition (reintroduces #2970), and the union without the 2008 guard -- and each one is caught. This follows the existing precedent of ResolveLoginTimeout / SqlConnectionInternalTimeoutTests. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Docs | Correct and expand the RCA note for #4001 Fixes two factual errors flagged in review: - A delegated transaction root does not always have a null EnlistedTransaction. The property is set unconditionally on enlistment; null is specific to the transient half state left behind by DetachCurrentTransactionIfEnded. - Is2008OrNewer is not vestigial. SQL Server 2005 is still an accepted TDS version, so the guard can be false. Also documents the new regression tests, why an end-to-end reproduction was abandoned in favour of a helper level test, and removes an inaccurate claim that the new condition is a strict superset of the pre-#3019 one. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Tests | Make the reset predicate theory genuinely exhaustive The unpooled block enumerated only four of its eight input combinations while the doc comment claimed exhaustive coverage. Add the missing four so all sixteen combinations of the four booleans are pinned, and state the count explicitly. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Docs | Hyphenate server-side in reset predicate docs Compound adjective. Comment-only change, no behavior impact. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Fix | Drop unsupported server-version guard from reset predicate The restored Is2008OrNewer guard reinstated only half of a retired safety mechanism. Pre-#3019, IsNonPoolableTransactionRoot both suppressed the preserve bit and routed the connection into pool stasis; being parked is what made the plain reset harmless. #3019 removed the property, and both pools now route on EnlistedTransaction alone, so a delegated root with a null EnlistedTransaction returns to the general pool. Suppressing the preserve bit without the stasis routing therefore reproduces #4001 on SQL Server 2005 -- which is below the supported floor of 2012 anyway. Predicate is now isPooled && (isTransactionRoot || hasEnlistedTransaction). Tests simplified from 19 to 11; both bug mutants still fail. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 * Tests | Remove duplicate reset predicate facts Keep the regression context beside the corresponding exhaustive theory rows instead of repeating those cases as separate facts. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091 --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cadc8f9e-e4ac-4074-92ef-88e90df96091
* Derive APIScan versions from package versions * Pipelines | Pre-compute all OneBranch package and file versions Make the compute-versions stage the single source of every version the OneBranch build jobs consume, so nothing is re-derived downstream. - Remove the addRevision mode entirely. Package versions now have a single shape driven by the pipeline build number, and the 16-bit revision wrapping, the four-part package base handling, and the Build.BuildId plumbing are gone. - Move package version stamping out of PowerShell and into Versions.props. BuildSuffix now does what it always documented: it turns a stable base into a prerelease. Any version carrying a prerelease tag, from either source, is stamped with the build number; released versions are left untouched. - Publish SqlClient and SqlServer file versions from the compute-versions stage and pass them into the build jobs, which previously received a raw build number and re-derived the file version through MSBuild. build.proj gains opt-in FileVersion* arguments, so PR/CI and local builds are unchanged. - Fix SBOM metadata, which reported the pipeline run number as the version of a single hardcoded package name. Each build job now supplies the name and computed version of the package it produces, and jobs that publish no packages disable SBOM generation instead. * Pipelines | Validate every package the OneBranch build produces Re-enable the package validation stage, which had been commented out pending the version pre-computation that landed in the previous change, and widen it from one package to all six. - Add a package_validation stage that depends on all four build stages. Every package is downloaded into one tree and validated together so PackageValidator can apply its cross-package rules: the SqlClient family must share a single version, and their inter-package dependency ranges must agree. Validating one package at a time would silently skip all of those findings. - Assert the versions the compute-versions stage already published, rather than re-deriving them. The family version is applied as a wildcard expectation, so a mismatch in any one package is caught along with the case where every package is consistently wrong; Microsoft.SqlServer.Server overrides it by id. When SqlServer is not built its expectations are omitted entirely, because the validator rejects an expectation whose value is empty. - Gate on error and missing-symbols always, plus package-unsigned on official runs. missing-symbols is a warning and package-unsigned is info, so neither is covered by the error severity and both must be named explicitly. Non-official runs are deliberately unsigned, so gating them on package-unsigned would always fail. - Make the release stage depend on package validation, so a package that fails validation is never published. - Replace the SqlClient-only validate-signed-package-job, which checked one package, could not detect missing files, indexed extracted content positionally, and depended on a hardcoded sn.exe path. Authenticode and NuGet signature verification now cover every produced package. Step and job logic lives in scripts with Pester coverage rather than inline YAML, matching compute-versions and publish-symbols. * Pipelines | Disable Roslyn SDL analysis in the package validation job 1ES auto-injects the RoslynAnalyzers task into any job containing a DotNetCoreCLI build task, and drives the build itself. The validation job's only compile is PackageValidator, a build-time tool that never ships, and the injected run is launched from the host where the container's dotnet does not exist, so it failed with exit code 17 and failed the job even though package validation passed. * Pipelines | Fail fast on validator errors and normalize FailOn tokens Addresses review feedback on PR #4655. The JSON-report invocation of PackageValidator ignored its exit code, so a validator crash produced a misleading report artifact and let the gated run obscure the real cause. Capture and check the code before writing the success message or reaching the gate. FailOn arrives from the pipeline as a single comma-joined token, which PowerShell -File argument mode does not split into an array. Normalize the parameter by splitting, trimming, and dropping empties, and quote the YAML argument so the value is one token in every invocation mode. * Pipelines | Gate package validation on dependency and strong-name findings Addresses review feedback on PR #4655. The error severity covers only error-severity findings, so the warning and info categories this job exists to catch were slipping through the gate. dependency-inconsistency is a warning, and mismatched family dependency ranges are precisely what validating the whole drop at once is meant to find, so gate it on every run. delay-signed is a warning and unsigned is info. Non-official builds have no access to the real strong-name key and are delay-signed by design, so gate those two on official runs only, alongside package-unsigned. * Pipelines | Gate strong-name findings on every run, not just official Addresses review feedback on PR #4655. The previous split assumed non-official builds cannot strong-name sign, but build-buildproj-step.yml downloads netfxKeypair.snk and passes SigningKeyPath unconditionally, so every OneBranch build signs with the real key. Run 26251.2 confirms it: 59 of 59 implementation assemblies reported Signed on a non-official run, with no delay-signed or unsigned findings. Gating delay-signed and unsigned only on official runs therefore left the one signing type the pipeline always applies unvalidated on PR builds, where a regression that drops the key would go unnoticed. Gate both everywhere. package-unsigned stays official-only. NuGet package signing is an ESRP step condition on shouldSignPackage, so non-official packages genuinely carry no .signature.p7s. * Pipelines | Clarify that the reporting validator run is ungated, not infallible Addresses PR #4655 review feedback: the first PackageValidator invocation is ungated so the JSON report survives a failing run, but it still fails the step when the validator itself errors.
…equire it (#4626) * Name the agent image parameter poolImage everywhere and require it The image parameter was spelled five different ways across the pipeline templates - vmImage, image, agentImage, imageOverride and platformImage - so a reader had to check each template to learn what to pass. Rename all twenty declarations, references and call-site keys to 'poolImage', alongside the 'poolName' parameter it accompanies. Remove the image defaults from the nineteen templates that have callers, and pass the value explicitly at the nine call sites that had been inheriting one. A default meant a template silently picked an agent image that its caller never mentioned, which is easy to miss when auditing which images a pool must provide. Every call site now names its image. The queue-time parameter on the CI package pipeline keeps its default, since it has no caller to supply one, and the default lets a manual run pick a Windows agent when that is what we want to validate. This does not change which image any job runs on. All 38 call sites resolve to the same image as before, whether they previously passed a value or inherited a default. Note that ADO's own 'vmImage' pool keyword and the 'imageOverride' demand capability keep their names; only our parameters are renamed. * Fixed botched rebase conflict resolution. * Pipelines | Finish the vmImage -> poolImage rename in kerberos and MI templates Complete the rename started in PR #4626 so template expansion matches the renamed declarations: - sqlclient-ci-kerberos-job.yml: rename the vmImage parameter to poolImage and update the ImageOverride demand. - sqlclient-ci-kerberos-stages.yml: rename all four call-site keys. - sqlclient-ci-managed-instance-stages.yml: rename all four call-site keys to match the already-renamed poolImage parameter. Addresses review feedback on PR #4626.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…le group (#4627) * Read the general-purpose pool name from one shared variable group The pool name was configured three different ways: the CI pipelines read 'ci_var_defaultPoolName' from 'ADO Build properties', the PR pipeline read 'PoolNameDefault' from 'sqlclient-testconfig-v1', and the package pipeline hardcoded ADO-1ES-Pool or ADO-CI-1ES-Pool based on which project it ran in. Three sources for one value, and the package pipeline's copy had to be edited by hand whenever the pool changed. Add a 'sqlclient_pipeline_config' variable group to both the ADO.Net and Public projects, holding 'general_purpose_pool_name' set to that project's pool, and read it at every pipeline root. The name says general-purpose deliberately: we also use special-purpose pools for Always Encrypted, ARM64, Kerberos and Managed Instance jobs, which are still named directly and could get their own variables later. This also removes the project-name check that chose the package pipeline's pool, so 'isInternalBuild' now serves only the signing key argument. No existing variable group is modified. 'ci_var_defaultPoolName' and 'PoolNameDefault' keep their current values; they are simply no longer read. * Rename the variable group to sqlclient-pipeline-config-v1 Match the naming convention used by the other groups in these projects, such as sqlclient-testconfig-v1 and symbols-variables-v3: dashes rather than underscores, and a version suffix. The group was renamed in place in both the ADO.Net and Public projects, so its contents and its pipeline authorization are unchanged. * Keep the pool variable group at pipeline root scope Addresses review feedback on PR #4627. ci-build-nugets-job.yml imported ci-build-variables.yml at job scope, which meant the sqlclient-pipeline-config-v1 group was loaded below the pipeline root. The import was redundant: that job is only reachable from dotnet-sqlclient-ci-core.yml, which already imports the same template at its root, so localFeedPath and packagePath were already in scope. It was also the only job template in the repo importing a shared variables file. Remove it so ci-build-variables.yml is imported at pipeline root only. Also reword the defaultPoolName parameter comment to "most CI jobs", since the Always Encrypted, ARM64, and macOS jobs use special-purpose pools.
* Add localization validation to OneBranch pipelines Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Run localization validation in SqlClient build Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Allow approved localization value matches Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1 * Harden localization validation Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1 * Handle localization handback delay Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1 * Honor warning-only allowlist validation Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1 * Always enforce localization validation Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1 * Clarify localization validation docs Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1 --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b28f059a-cfb7-4fa1-95b7-0947e3c965a1
* Release notes for v6.1.7 * Release notes for v7.0.3
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Address Copilot review feedback from #4650 (carried to #4689): pipeline header comments, schedule/registration notes, and the ADO/OneBranch instruction files still named the non-staging release/7.1 and internal/release/7.1 branches even though every branch filter now targets the -staging branches. Also align the perf documentation with the new baselineSourceRef default: sqlclient-perf-pr-pipeline.yml's header and eng/pipelines/perf/README.md now state release/7.1-staging instead of main. Comments and documentation only; no pipeline behavior changes.
There was a problem hiding this comment.
🟡 Changes recommended
One or more issues must be addressed before approval.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
This PR retargets Azure DevOps pipelines and schedules to the 7.1 staging branches, but also includes extensive unrelated SDK, product, test, fixture, documentation, and release-note changes.
Changes:
- Updates staging branch filters, schedules, disabled triggers, and GitHub Sync naming.
- Aligns SDK configuration and package versions.
- Expands test cleanup, authentication, metadata, localization, and pipeline infrastructure changes.
File summaries
| File | Description |
|---|---|
| tools/PackageValidator/global.json | Updated as part of this pull request. |
| tools/PackageCompatibility/global.json | Updated as part of this pull request. |
| TESTGUIDE.md | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/UnitTests/SimulatedServerTests/ConnectionTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/UnitTests/SimulatedServerTests/ConnectionFailoverTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/UnitTests/Fixtures/AlwaysEncrypted/NativeColumnEncryptionKeyCertificateBaselineFixture.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/UnitTests/ConnectionPool/WaitHandleDbConnectionPoolTransactionTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/UnitTests/ConnectionPool/WaitHandleDbConnectionPoolShutdownTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/UnitTests/ConnectionPool/ChannelDbConnectionPoolTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/config.default.jsonc | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/TracingTests/MetricsTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/TracingTests/DiagnosticTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/WeakRefTestYukonSpecific/WeakRefTestYukonSpecific.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/TransactionTest/TransactionTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/TransactionTest/DistributedTransactionTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCredentialTest/SqlCredentialTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/TvpColumnBoundariesTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/StreamInputParameterTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/SqlVariantParameterTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/ParametersTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ParameterTest/DateTimeVariantTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/MARSSessionPoolingTest/MarsSessionPoolingTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonBulkCopyTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataStreamTest/DataStreamTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/DataReaderTest/DataReaderTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectivityTests/ConnectivityTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/TransactionPoolTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/ConnectionPoolTest/ConnectionPoolTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AsyncTest/AsyncTimeoutTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/AdapterTest/AdapterTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/SpecialCharacterNames.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/OrderHintTransaction.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/MissingTargetTable.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/Helpers.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/ErrorOnRowsMarkedAsDeleted.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/DataConversionErrorMessageTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/ColumnCollation.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/BulkCopy/Bug903514.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SqlSetupStrategyCspProvider.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategyCertStoreProvider.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/SQLSetupStrategyAzureKeyVault.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/Table.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/ColumnMasterKey.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/Setup/ColumnEncryptionKey.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/TestFixtures/ConversionTestFixture.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/ManualTests/AlwaysEncrypted/ApiShould.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlConfigurableRetryLogicTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/FunctionalTests/LocalizationTest.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/UserDefinedType.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/StoredProcedure.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ServerLogin.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/NameIsVerbatim.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ExistingObject.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/DatabaseUser.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ColumnMasterKey.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/DatabaseObjects/ColumnEncryptionKey.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/CspCertificateFixture.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/ColumnMasterKeyCertificateFixture.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/tests/Common/Fixtures/AzureKeyVaultKeyFixtureBase.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.zh-Hant.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.zh-Hans.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.tr.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.ru.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.pt-BR.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.pl.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.ko.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.ja.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.it.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.fr.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.es.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.de.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Resources/Strings.cs.resx | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.DataTypes.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlCommand.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient.Extensions/Azure/test/Config.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient.Extensions/Azure/test/ActiveDirectoryInteractiveTests.cs | Updated as part of this pull request. |
| src/Microsoft.Data.SqlClient.Extensions/Azure/test/AADConnectionTest.cs | Updated as part of this pull request. |
| release-notes/Internal/Logging/7.0/README.md | Updated as part of this pull request. |
| release-notes/Internal/Logging/7.0/7.0.3.md | Updated as part of this pull request. |
| release-notes/Extensions/Azure/7.0/README.md | Updated as part of this pull request. |
| release-notes/Extensions/Azure/7.0/7.0.3.md | Updated as part of this pull request. |
| release-notes/Extensions/Abstractions/7.0/README.md | Updated as part of this pull request. |
| release-notes/Extensions/Abstractions/7.0/7.0.3.md | Updated as part of this pull request. |
| release-notes/add-ons/AzureKeyVaultProvider/7.0/README.md | Updated as part of this pull request. |
| release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.3.md | Updated as part of this pull request. |
| release-notes/7.0/README.md | Updated as part of this pull request. |
| release-notes/6.1/README.md | Updated as part of this pull request. |
| README.md | Updated as part of this pull request. |
| global.json | Updated as part of this pull request. |
| eng/pipelines/stages/verify-nuget-packages-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/stages/generate-secrets-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/stages/compute-versions-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/stages/build-sqlserver-package-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/stages/build-sqlclient-package-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/stages/build-logging-package-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/stages/build-abstractions-package-ci-stage.yml | Updated as part of this pull request. |
| eng/pipelines/sqlclient-pr-project-ref-pipeline.yml | Updated as part of this pull request. |
| eng/pipelines/sqlclient-pr-package-ref-pipeline.yml | Updated as part of this pull request. |
| eng/pipelines/scripts/tests/README.md | Updated as part of this pull request. |
| eng/pipelines/pr/variables/pr-variables.yml | Updated as part of this pull request. |
| eng/pipelines/pr/steps/configure-sqlserver-windows-step.yml | Updated as part of this pull request. |
| eng/pipelines/pr/steps/configure-sqlserver-linux-step.yml | Updated as part of this pull request. |
| eng/pipelines/pr/stages/pack-stage.yml | Updated as part of this pull request. |
| eng/pipelines/pr/stages/generate-secrets-stage.yml | Updated as part of this pull request. |
| eng/pipelines/pr/stages/collect-coverage-stage.yml | Updated as part of this pull request. |
| eng/pipelines/pr/jobs/test-sqlclientmanual-job.yml | Updated as part of this pull request. |
| eng/pipelines/pr/jobs/test-buildproj-job.yml | Updated as part of this pull request. |
| eng/pipelines/perf/sqlclient-perf-pr-pipeline.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/variables/package-variables.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/variables/onebranch-variables.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/steps/validate-localization-step.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/steps/roslyn-analyzers-buildproj-step.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/steps/pack-buildproj-step.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/steps/build-buildproj-step.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/stages/release-stages.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/sqlclient-non-official.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/scripts/tests/README.md | Updated as part of this pull request. |
| eng/pipelines/onebranch/jobs/publish-symbols-job.yml | Updated as part of this pull request. |
| eng/pipelines/onebranch/jobs/publish-nuget-package-job.yml | Updated as part of this pull request. |
| eng/pipelines/libraries/ci-build-variables.yml | Updated as part of this pull request. |
| eng/pipelines/jobs/test-azure-package-ci-job.yml | Updated as part of this pull request. |
| eng/pipelines/jobs/test-abstractions-package-ci-job.yml | Updated as part of this pull request. |
| eng/pipelines/jobs/pack-sqlserver-package-ci-job.yml | Updated as part of this pull request. |
| eng/pipelines/jobs/pack-logging-package-ci-job.yml | Updated as part of this pull request. |
| eng/pipelines/jobs/pack-azure-package-ci-job.yml | Updated as part of this pull request. |
| eng/pipelines/jobs/pack-abstractions-package-ci-job.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/steps/publish-test-results-step.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/steps/configure-sql-server-win-step.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/steps/configure-sql-server-linux-step.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/stages/ci-run-tests-stage.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/jobs/ci-run-tests-job.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/jobs/ci-code-coverage-job.yml | Updated as part of this pull request. |
| eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml | Updated as part of this pull request. |
| eng/pipelines/ci/stress/sqlclient-ci-stress-stage.yml | Updated as part of this pull request. |
| eng/pipelines/ci/stress/sqlclient-ci-stress-pipeline.yml | Updated as part of this pull request. |
| eng/pipelines/ci/managed-instance/sqlclient-ci-managed-instance-stages.yml | Updated as part of this pull request. |
| eng/pipelines/ci/managed-instance/sqlclient-ci-managed-instance-pipeline.yml | Updated as part of this pull request. |
| eng/pipelines/ci/managed-instance/sqlclient-ci-managed-instance-job.yml | Updated as part of this pull request. |
| eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-stages.yml | Updated as part of this pull request. |
| eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-pipeline.yml | Updated as part of this pull request. |
| eng/pipelines/ci/kerberos/sqlclient-ci-kerberos-job.yml | Updated as part of this pull request. |
| doc/snippets/Microsoft.Data.SqlClient/SqlParameter.xml | Updated as part of this pull request. |
| doc/samples/SqlMetaData.cs | Updated as part of this pull request. |
| CONTRIBUTING.md | Updated as part of this pull request. |
| .github/workflows/verify-aw-lock.yml | Updated as part of this pull request. |
| .github/workflows/issue-triage.md | Updated as part of this pull request. |
| .github/prompts/triage-pipeline-failures.prompt.md | Updated as part of this pull request. |
| .github/instructions/ado-pipelines.instructions.md | Updated as part of this pull request. |
| .github/aw/actions-lock.json | Updated as part of this pull request. |
| .gitattributes | Updated as part of this pull request. |
| .config/PolicheckExclusions.xml | Updated as part of this pull request. |
Review details
Suppressed comments (7)
CHANGELOG.md:18
- This pipeline-only PR directly adds stable release entries to
CHANGELOG.md. Repository guidance says the changelog is generated by the release workflow and should not be edited directly; please move this release content to the appropriate release workflow/PR or split it from the staging-trigger change.
## [Stable Release 7.0.3] - 2026-09-10
### Changed
- Updated the `Microsoft.Data.SqlClient.SNI` and `Microsoft.Data.SqlClient.SNI.runtime` dependencies to 6.0.3 (was 6.0.2).
([#4599](https://github.com/dotnet/SqlClient/pull/4599))
### Fixed
- Fixed a `SqlBulkCopy` regression in environments where the application login cannot read `sys.all_columns`. Bulk copy now falls back to the earlier column-discovery behavior when that permission is unavailable. Support for hidden columns and SQL Graph column aliases still requires access to the metadata view.
eng/pipelines/dotnet-sqlclient-ci-package-reference-pipeline.yml:76
- This schedule now targets
release/7.1-staging, while its preceding comment still saysGitHub release/7.1 daily. Update the comment to name the staging branch.
eng/pipelines/dotnet-sqlclient-ci-package-reference-pipeline.yml:84 - This schedule now targets
internal/release/7.1-staging, while its preceding comment still saysADO internal/release/7.1 daily. Update the comment to name the staging branch.
global.json:5 - This changes the repository-wide required SDK from 10.0.300 to 10.0.401, and the same pin is repeated in the tool subtrees, but the PR description only calls out staging-branch trigger updates. This alters build prerequisites for every contributor and pipeline; document the SDK rationale and agent availability, or split the SDK update into a separately described change.
src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft/Data/SqlClient/SqlMetaDataFactoryDataTypesTest.cs:20 - This new test helper has no XML summary. The repository testing guidance requires summaries for helper methods used by tests, so document what resource it opens and why it is needed.
src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft/Data/SqlClient/SqlMetaDataFactoryDataTypesTest.cs:28 - This new test helper has no XML documentation. Add a summary, parameter description, and return description explaining that it constructs a factory with the requested JSON capability.
src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft/Data/SqlClient/SqlMetaDataFactoryDataTypesTest.cs:42 - This new test helper has no XML documentation. Add a summary, parameter description, and return description explaining that it checks whether the factory's DataTypes schema contains
json.
- Files reviewed: 260/261 changed files
- Comments generated: 9
- Review effort level: Lite (auto)
Note
Copilot is running an experiment and ran this review at Lite.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| // Adopted only once the CREATE above has succeeded, since that statement is what brings the | ||
| // history table into existence. If it throws, the base constructor disposes this instance, | ||
| // and the null check in DropObject keeps that path safe. | ||
| HistoryTable = Table.AdoptExisting(connection, historyName); |
| if (jsonTypeSupported) | ||
| { | ||
| AddLongStringOrBinaryType(SqlDbTypeExtensions.Json, literalPrefix: "'", literalSuffix: "'"); | ||
| } |
| include: | ||
| - main | ||
| - internal/main | ||
| - release/7.1-staging |
| #- release/7.1-staging | ||
|
|
||
| # ADO main and release branches. | ||
| - internal/main | ||
| - internal/release/* | ||
| # ADO release branch. | ||
| - internal/release/7.1-staging |
| # GitHub main daily. | ||
| - cron: '0 1 * * *' | ||
| displayName: Daily Run (Release Config) | ||
| # GitHub release/7.1 daily. |
| default: release/7.1-staging | ||
|
|
||
| # The ADO target branch to create the PR against. | ||
| - name: targetBranch | ||
| displayName: ADO Target Branch | ||
| type: string | ||
| default: internal/main | ||
| default: internal/release/7.1-staging |
| - feat/* | ||
| - main | ||
| - release/* | ||
| - release/7.1-staging |
| - release/* | ||
| # | ||
| # GOTCHA: Currently disabled due to limited resources. | ||
| # release/7.1-staging |
| - feat/* | ||
| - main | ||
| - release/* | ||
| - release/7.1-staging |
e5ddc4b to
9902296
Compare
There was a problem hiding this comment.
🔵 Needs a closer look
The package-reference PR trigger is not reliably disabled, cleanup can still leak resources, and the diff materially exceeds the pipeline-only scope described.
Review details
Suppressed comments (5)
Previously missed (4) — in code that hasn't changed since the last review.
eng/pipelines/sqlclient-pr-package-ref-pipeline.yml:39
- This does not reliably disable PR validation: Azure Pipelines treats an empty branch include filter as no effective restriction, so the pipeline can still trigger for PRs to any branch. Use the documented
pr: noneform (and keep the intended branch as a nearby comment for re-enablement).
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/JsonTest/JsonBulkCopyTest.cs:48 - If dropping the source table throws, control jumps to the outer catch and the destination table is never attempted, so this new cleanup path can still leak one of the two GUID-named tables. Catch failures per table (for example, iterate the names and guard each
DropTablecall independently).
src/Microsoft.Data.SqlClient/src/Resources/Strings.ja.resx:2086 - Remove the stray ASCII space after the Japanese comma so the property list is formatted consistently.
src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/TransactionTest/TransactionTest.cs:187 - The newly introduced test helper is missing the required behavior-focused XML documentation. The repository testing guide requires
<summary>plus applicable<param>documentation for test helpers (.github/instructions/testing.instructions.md:181-194).
src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.DataTypes.cs:64
- The PR description states that there are no product behavior changes, but this changes the public
GetSchema(DataTypes)result by conditionally removing thejsonrow. Either split this product change from the pipeline-only PR or update the title, description, release/testing scope, and review accordingly.
- Files reviewed: 259/260 changed files
- Comments generated: 0 new
- Review effort level: Balanced (auto)
Note
Copilot is running an experiment and ran this review at Balanced.
There was a problem hiding this comment.
🟡 Changes recommended
Fixture cleanup can mask constructor failures, JSON cleanup remains partial, and the stated pipeline-only scope conflicts with product behavior and branch documentation changes.
Get a fresh assessment by requesting another Copilot review.
Review details
Suppressed comments (3)
src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlMetaDataFactory.DataTypes.cs:64
- The PR description says there are no product behavior changes, but this changes the public
GetSchema("DataTypes")result by omittingjsonunless the negotiated capability is set (and the added unit tests explicitly codify that behavior). Either move this product change to its own PR or update this PR's scope, description, and validation plan so reviewers can assess it.
eng/pipelines/sqlclient-pr-project-ref-pipeline.yml:14 - This comment names
release/7.1, but the trigger immediately below targetsrelease/7.1-staging. Keeping the branch name exact is important when this file is used to understand PR validation coverage.
eng/pipelines/sqlclient-pr-package-ref-pipeline.yml:14 - The disabled entry is
release/7.1-staging, notrelease/7.1; the comment currently implies validation is disabled for a different branch.
- Files reviewed: 259/260 changed files
- Comments generated: 4
- Review effort level: Balanced (auto)
Note
Copilot is running an experiment and ran this review at Balanced.
| } | ||
| catch | ||
| { | ||
| Dispose(); |
| DataTestUtility.DropTable(connection, _sourceTableName); | ||
| DataTestUtility.DropTable(connection, _destinationTableName); |
|
|
||
| PR pipelines: | ||
| - Trigger on PRs to `dev/*`, `feat/*`, `main`; exclude `eng/pipelines/onebranch/*` paths | ||
| - Trigger on PRs targeting `release/7.1`; path filters vary by pipeline |
| CI pipelines: | ||
| - Trigger on push to `main` (GitHub) and `internal/main` (ADO) with `batch: true` | ||
| - Scheduled weekday builds (see individual pipeline files for cron times) | ||
| - Trigger on push to `release/7.1` (GitHub) and `internal/release/7.1` (ADO) with `batch: true` |
|
Moved to #4690 |
Description
Update Azure DevOps pipeline branch specifications for the 7.1 staging branch:
release/7.1-stagingandinternal/release/7.1-staging.mainand existing release branches./as-in its generated sync branch name.There are no public API or product behavior changes.
Testing
I will be manually running the affected pipelines in the Public and ADO.Net projects, and confirming their calculated triggers. I will list successful runs here as they complete.