Skip to content

test(packaging): SqlClient のメジャー版を EF Core の宣言に追随させる - #179

Merged
izumacha merged 1 commit into
mainfrom
claude/dreamy-brown-65238s
Aug 24, 2026
Merged

izumacha merged 1 commit into
mainfrom
claude/dreamy-brown-65238s

Conversation

@izumacha

Copy link
Copy Markdown
Owner

Context

コードレビューで開いていた Dependabot PR #178(Microsoft.Data.SqlClient 5.1.7 → 7.0.2)を見送り、代わりに同種の変更を機械的に止める検出網を入れる。

何が問題だったか

Microsoft.Data.SqlClient は Microsoft.EntityFrameworkCore.SqlServer が内部で使う ADO.NET ドライバの実体で、プロバイダが動作保証するのは自身が宣言したメジャー版に対してだけ(現在の宣言は 5.1.6)。#178 はこれを 2 メジャー先の 7.0.2 へ単独で上げるものだった。

ところがこのドライバは名前に EntityFrameworkCore / EFCore を含まないため、dependabot.yml の nuget-ef-core グループ(EF Core 本体とプロバイダ実装を major も含めて 1 本の PR に束ねる設定)に入らない。結果、まさにそのグループが防いでいる版ズレが、ドライバの層でだけすり抜けていた。

壊れ方も同じ — このリポジトリのテストは InMemory / SQLite しか触らないので、ドライバだけを別メジャーへ上げてもビルドも全テストも緑のまま通り、SQL Server 配備でだけ実行時に壊れる。CLAUDE.md が EF Core 系について「一部だけ上げてもビルドもテストも通るため、PostgreSQL 配備でだけ実行時に壊れる」と書いているのとまったく同じ無言の破壊で、違うのは壊れる層だけ。

副次的な問題として #178 は実際に CI も赤だった(tests/ 側の packages.lock.json が更新されず dotnet restore --locked-mode が NU1004)。また解決される System.Memory が 4.5.4 → 4.5.3 と下がり、csproj のコメント(「EF Core 側の 5.1.6 要求とは互換で」)も事実と食い違う状態になっていた。

変更内容

  • .github/dependabot.yml — nuget エコシステムに ignore を追加し、Microsoft.Data.SqlClient の major だけを保留。同じメジャー内の minor / patch は csproj が意図している「セキュリティ更新を後退させない床値」を上げる更新なので止めない(update-types を省くと全更新の無視になり、その経路まで塞がる)。

  • EfCorePackageAlignmentTests — 検査を 2 つ追加。

    • SqlClientPin_StaysWithinEfCoreDeclaredMajor — 解決版と EF Core 宣言版のメジャー一致、および床値の後退(同メジャー内で下げる変更はメジャー検査を素通りするため別途固定)
    • DependabotConfig_HoldsSqlClientMajorUpdates — 保留の消失と効きすぎ(update-types の欠落 / versions の追加 / 重複エントリ。Dependabot は同じ依存の複数エントリをすべて適用する)

    期待値はテストに書かず、packages.lock.json の dependencies から EF Core の宣言を読む。 書き写すと EF Core を上げたとき 2 か所を直す必要が生まれ、直し忘れた側が静かに古い前提を主張し続けるため(§6 の唯一の真実の源)。おかげで EF Core を上げれば検査が自動で追随する。

  • ReadNuGetGroups から ReadNuGetEcosystemEntry を切り出し — 以前はエコシステムのエントリを捨てて groups: だけを返していたため、同じエントリ直下の ignore: へ辿るには同じ YAML をもう一度解析する必要があった(§6 DRY)。挙動は変えていない。

  • csproj / CLAUDE.md — メジャーを合わせる理由と、この検出網の担当範囲を明記。

ドライバのメジャーを上げたいときは、それを宣言する版の Microsoft.EntityFrameworkCore.SqlServer へ同じ変更セットで上げる(ignore は残したままでよい)。

検証

検出網が実際に効くことをミューテーションで確認済み。

破壊 結果
解決版を 7.0.2 に(= PR #178 相当) ✅ 落ちる
床値を 5.1.5 へ後退(宣言は 5.1.6) ✅ 落ちる
ignore ブロックの削除 ✅ 落ちる
update-types の欠落(全更新の無視) ✅ 落ちる
ignore に重複エントリ ✅ 落ちる

Generated by Claude Code

Microsoft.Data.SqlClient は Microsoft.EntityFrameworkCore.SqlServer の実体で、
プロバイダが動作保証するのは自身が宣言したメジャー版のドライバに対してだけ。
ところが名前に EntityFrameworkCore / EFCore を含まないため nuget-ef-core グループ
には入らず、メジャー更新が単独 PR として現れる (PR #178 が 5.1.7 → 7.0.2 で出ていた)。

壊れ方は EF Core 本体とプロバイダの版ズレとまったく同じで、違うのは壊れる層が
ドライバだという点だけ。テストは InMemory / SQLite しか触らないため、ここがずれても
ビルドも全テストも緑のまま通り、SQL Server 配備でだけ実行時に壊れる。

- dependabot.yml: nuget エコシステムに ignore を追加し major だけを保留する
  (同じメジャー内の minor / patch は csproj の「床値」を上げる更新なので止めない)
- EfCorePackageAlignmentTests: 解決版と EF Core 宣言版のメジャー一致 / 床値の後退 /
  保留の消失 / 保留の効きすぎ の 4 つを検査する。期待値はテストに書かず
  packages.lock.json の dependencies から読むので EF Core の更新に自動追随する
- ReadNuGetGroups から ReadNuGetEcosystemEntry を切り出す。以前はエントリを捨てて
  groups: だけを返していたため、ignore: へ辿るには同じ YAML の再解析が要った (§6)
- csproj / CLAUDE.md: メジャーを合わせる理由と検出網の担当範囲を明記

検証: dotnet restore --locked-mode と dotnet test (460 件) が green。
検出網が効くことを 5 通りの破壊で確認済み (解決版を 7.0.2 に / 床値を 5.1.5 へ後退 /
ignore の削除 / update-types の欠落 / 重複エントリ)。
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
incident-insight Error Error Aug 24, 2026 12:29am
incident-insight-jjt5 Error Error Aug 24, 2026 12:29am

@izumacha
izumacha merged commit 343c8fd into main Aug 24, 2026
3 of 5 checks passed
@izumacha
izumacha deleted the claude/dreamy-brown-65238s branch August 24, 2026 00:40

This branch had an error being deployed

2 failed deployments
Preview – incident-insight-jjt5 — 3b724b12 Deployed Aug 24, 2026 by vercel[bot]
Preview – incident-insight — 3b724b12 Deployed Aug 24, 2026 by vercel[bot]
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.

2 participants