Skip to content

chore(deps): bump the safe dependency lot, with the Hangfire family in lockstep - #266

Merged
thiagoluga merged 3 commits into
masterfrom
chore/dependency-bumps-safe
Aug 5, 2026
Merged

chore(deps): bump the safe dependency lot, with the Hangfire family in lockstep#266
thiagoluga merged 3 commits into
masterfrom
chore/dependency-bumps-safe

Conversation

@thiagoluga

Copy link
Copy Markdown
Owner

All eleven Dependabot PRs (#241#251) were closed unmerged, so the bumps are redone here as one verified change rather than eleven unverified ones.

This is the lot where the new version is a patch or minor within the same major. The major jumps are deliberately excluded and assessed separately (see the bottom of this description).

Package From To
Hangfire.Core / .SqlServer / .AspNetCore 1.8.14 1.8.24
AWSSDK.S3 4.0.100.2 4.0.101.7
DocumentFormat.OpenXml 3.1.1 3.5.1
ClosedXML 0.105.0 0.105.1
Oracle.ManagedDataAccess.Core 23.26.200 23.26.300
Polly.Core 8.6.6 8.7.0
Shouldly 4.2.1 4.3.0
bunit 2.6.2 2.9.0
BenchmarkDotNet 0.14.0 0.15.8
Microsoft.Playwright 1.56.0 1.61.0
Microsoft.AspNetCore.TestHost 8.0.11 8.0.29

The Hangfire family, and why #246/#247 were unfixable as filed

Hangfire.NetCore arrives transitively and pins Hangfire.Core to an exact version, so bumping any single member fails restore with NU1608. #246 (AspNetCore) and #247 (Core) were red for that reason and could never have gone green on their own, whatever CI did — the family only moves as a unit.

dependabot.yml now groups Hangfire*. That grouping is a correctness requirement, not noise reduction, and the config says so — otherwise the same two red PRs reappear next week.

Two judgement calls

  • TestHost goes to 8.0.29, not the available 10.0.10. The test projects target net8.0; staying in the 8.x servicing line is the bump that belongs in a "safe" lot. Dependabot proposed the same.
  • The two GitHub Actions PRs (chore(ci): bump github/codeql-action from 4 to 4.37.3 #241 codeql-action, chore(ci): bump actions/setup-java from 5 to 5.6.0 #242 setup-java) are intentionally not reproduced. Both workflows already reference floating major tags (@v4, @v5), which receive patch and minor updates automatically. Pinning them to 4.37.3/5.6.0 would trade that for a Dependabot PR every week and no benefit.

One real break, caught by the build

DocumentFormat.OpenXml 3.1.1 → 3.5.1 made WorkbookPart.Workbook nullable, and TreatWarningsAsErrors turned that into CS8602 in XlsxRowReader. It is now checked rather than assumed — the existing "contains no worksheets" error already describes that case correctly, so the guard needed no new error path.

This is the argument for verifying bumps rather than merging them on green-badge faith: a one-package Dependabot PR for OpenXml would have failed CI with a compile error and sat there.

Verification

dotnet build --no-incremental (cache can hide a real compile error), then:

Core             303    AspNetCore       159    UI (bUnit 2.9)   245
WebUi E2E         24 passed / 0 skipped, NEOREPORTS_REQUIRE_BROWSER=1, Playwright 1.61
Jobs              34    Sources.Xlsx      32    Formats.Xlsx       7
Formats.Csv        5    Destinations.S3    3    Destinations.Local 14

0 failures. The E2E run matters here specifically because Playwright moved two minors and needs a matching browser build — I installed it via the package's own playwright.ps1 and ran with the skip-guard on, so a browser that failed to launch would fail the suite rather than silently skip it.

Deliberately not in this PR

Package From To Why not
Npgsql 9.0.5 10.0.3 major
Microsoft.Data.Sqlite 9.0.18 10.0.10 major; EF Core 10 may be net10.0-only, which the net8.0 targets cannot take
Microsoft.Data.SqlClient 5.2.2 7.0.2 two majors
Aspire.Hosting.* 9.5.2 13.4.6 four majors — a framework migration, not a dependency bump

The first three get their own assessment next; Aspire 9 → 13 is the maintainer's call.

…n lockstep

All eleven Dependabot PRs (#241-#251) were closed unmerged, so the bumps are redone here
as one verified change. This is the lot where the new version is a patch or minor within
the same major; the major jumps (Npgsql 9->10, Microsoft.Data.Sqlite 9->10,
Microsoft.Data.SqlClient 5->7, TestHost 8->10, Aspire 9.5->13.4) are deliberately left
out and assessed separately.

Hangfire.Core, Hangfire.SqlServer and Hangfire.AspNetCore move together to 1.8.24.
Hangfire.NetCore arrives transitively and pins Hangfire.Core to an exact version, so
bumping any one member alone fails restore with NU1608 — which is why #246 and #247 were
red and could never have gone green on their own. dependabot.yml now groups Hangfire* so
the family only ever travels as a unit.

Microsoft.AspNetCore.TestHost goes to 8.0.29 rather than the available 10.0.10: the test
projects target net8.0, so staying in the 8.x servicing line is the bump that belongs
here.

DocumentFormat.OpenXml 3.1.1 -> 3.5.1 made WorkbookPart.Workbook nullable, which
TreatWarningsAsErrors turned into a build failure in XlsxRowReader. It is now checked
rather than assumed; the existing "contains no worksheets" error covers that case.

Verified after a --no-incremental rebuild: Core 303, AspNetCore 159, UI (bUnit 2.9) 245,
WebUi E2E (Playwright 1.61) 24 passed / 0 skipped with NEOREPORTS_REQUIRE_BROWSER=1,
Jobs 34, Sources.Xlsx 32, Formats.Xlsx 7, Formats.Csv 5, Destinations.S3 3,
Destinations.Local 14 — 0 failures.
Sonar's new-code maintainability gate is a debt ratio, and this PR changes exactly three
lines of C#, so a single 'use explicit type instead of var' on one of them was enough to
take the rating to 3. Sheet[]? is also the clearer read next to the null-conditional
chain that produces it.
…starts

`ReadRows` contains `yield`, so none of its body — including
`ArgumentNullException.ThrowIfNull(stream)` — executed until the caller's first
MoveNext. A null stream therefore surfaced from inside the enumeration, with a stack that
no longer pointed at the call that passed it. Splitting the eager wrapper from the
iterator makes the check fire where the mistake was made.

This is what SonarCloud's new-code maintainability gate flagged on the dependency-bump
PR. The line is pre-existing (63deea1, 2026-07-17) and Sonar counts it as new because
the master baseline has been broken since the 50k-LOC free-tier cap hit on 2026-07-12 —
but the finding itself is real, and the file already had to change here for the OpenXml
nullability guard, so it is fixed rather than worked around.

No test: XlsxRowReader is internal with no InternalsVisibleTo, and the public surface
takes a file path or S3 config rather than a Stream, so the null path is not reachable
from outside. The existing 32 tests pass unchanged, which is what confirms the split did
not alter enumeration semantics.
@sonarqubecloud

sonarqubecloud Bot commented Aug 5, 2026

Copy link
Copy Markdown

@sonarqubecloud

sonarqubecloud Bot commented Aug 5, 2026

Copy link
Copy Markdown

@thiagoluga
thiagoluga merged commit 4e5e34c into master Aug 5, 2026
5 checks passed
@thiagoluga
thiagoluga deleted the chore/dependency-bumps-safe branch August 5, 2026 14:30
thiagoluga added a commit that referenced this pull request Aug 5, 2026
…al containers (#267)

The remainder of the closed Dependabot set, held back from #266 because each crosses a
major boundary and the risk is the same one: a provider that has moved to net10.0 would
quietly stop supporting the net8.0 targets this repo multi-targets.

  Npgsql                     9.0.5    -> 10.0.3
  Microsoft.Data.Sqlite      9.0.18   -> 10.0.10
  Microsoft.Data.SqlClient   5.2.2    -> 7.0.2

That risk did not materialize: a --no-incremental rebuild is clean on both net8.0 and
net9.0, with no NU warnings. No source change was needed.

Verified where it counts — against real database containers, not mocks:

  Postgres (Npgsql)          78 passed / 0 skipped
  SQL Server (SqlClient)     23 passed / 0 skipped, NEOREPORTS_REQUIRE_DOCKER=1
  Sqlite                     18 passed / 0 skipped
  Redshift (Npgsql driver)    6 passed

Plus no regressions elsewhere: Core 303, AspNetCore 159, UI 245, Jobs 34,
Sources.Common 22, Http 60, OData 51, Elasticsearch 55, MongoDb 9 — 0 failures.

MySql and Oracle were not re-run locally (their containers exceeded the local time
budget), and neither is affected: they use MySqlConnector and Oracle.ManagedDataAccess,
which this change does not touch. CI runs them.

Aspire.Hosting.* (9.5.2 -> 13.4.6) is still deliberately excluded: four majors is a
framework migration, not a dependency bump, and it belongs to the maintainer.
thiagoluga added a commit that referenced this pull request Aug 5, 2026
…running one (#272)

The last item from the closed Dependabot set (#241-#251), held out of #266 and #267 because
9.5.2 -> 13.4.6 crosses four majors and reads like a framework migration.

It is not one. All six AppHosts compile clean on net8.0 with no source changes, no NU
warnings and no deprecation warnings: every API the samples use — AddPostgres,
WithDataVolume, AddDatabase, AddProject<>, WithReference, WaitFor,
WithExternalHttpEndpoints — survived intact.

A clean build proves nothing about an orchestrator, so sample 10 was actually run, both
ways the docs offer: `dotnet run --project .../AppHost` and the new `aspire run` CLI. Both
bring the Postgres container up (~10-25s) and connect it to the session network. The
documented workflow is unchanged; the CLI is an addition, not a replacement.

Two real findings from running it:

- The default PostgreSQL image moved from 17.6 to 18.3 with the Aspire version. Sample 10's
  header comment asserted "postgres:17", which was now false; it no longer names a tag it
  does not control. The READMEs' `docker run ... postgres:17` lines are untouched — those
  describe running Postgres yourself as an alternative to Aspire, and remain accurate.
- `aspire run` writes an `aspire.config.json` pinned to whichever AppHost ran last. With six
  in this repo, committing it would tie everyone to one sample, so it is gitignored.

Full solution rebuilt with --no-incremental; Core 303, Jobs 39, AspNetCore 159, UI 245.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant