|
| 1 | +--- |
| 2 | +id: TASK-10 |
| 3 | +title: Ensure dependabot updates NuGet packages across all projects in a single PR |
| 4 | +status: To Do |
| 5 | +assignee: |
| 6 | + - piotrzajac |
| 7 | + - claude |
| 8 | +created_date: '2026-04-12 16:33' |
| 9 | +updated_date: '2026-04-12 17:33' |
| 10 | +labels: |
| 11 | + - fix |
| 12 | + - ci-cd |
| 13 | +dependencies: [] |
| 14 | +priority: medium |
| 15 | +--- |
| 16 | + |
| 17 | +## Description |
| 18 | + |
| 19 | +<!-- SECTION:DESCRIPTION:BEGIN --> |
| 20 | +Dependabot was only updating ungrouped packages (e.g. Microsoft.NET.Test.Sdk, Castle.Core) in a single project per run instead of all projects simultaneously. This triggered a recurring pattern: Dependabot bumps one project, then a manual "Align versions in all projects" commit is needed. |
| 21 | + |
| 22 | +Root cause: `directories: ["**/*"]` creates one PR per matched directory per ungrouped package. Packages already covered by a group (xUnit, AutoFixture, Analyzers) correctly produced one cross-directory PR. Ungrouped shared packages were not consolidated: |
| 23 | + |
| 24 | +| Package | Projects | Effect | |
| 25 | +| --- | --- | --- | |
| 26 | +| JetBrains.Annotations | 8 | 8 separate PRs | |
| 27 | +| Microsoft.NETFramework.ReferenceAssemblies | 8 | 8 separate PRs | |
| 28 | +| Castle.Core | 7 | 7 separate PRs | |
| 29 | +| Microsoft.NET.Test.Sdk | 4 | 4 separate PRs | |
| 30 | +| coverlet.msbuild | 4 | 4 separate PRs | |
| 31 | +| Microsoft.SourceLink.GitHub | 4 | 4 separate PRs | |
| 32 | + |
| 33 | +With Dependabot's default open-pull-requests-limit of 5, only some directories would receive a PR for a given package before the limit was reached — explaining why only AutoFakeItEasy.Tests was updated for Microsoft.NET.Test.Sdk 18.4.0. |
| 34 | + |
| 35 | +Evidence from git log and closed PR history: |
| 36 | + |
| 37 | +- ecee204 Bump Microsoft.NET.Test.Sdk from 18.3.0 to 18.4.0 (only AutoFakeItEasy.Tests) |
| 38 | +- 23b7f3b fix(dependabot): Align versions in all projects (manual follow-up) |
| 39 | +- Castle.Core 5.2.1 generated 6 separate per-directory PRs |
| 40 | + |
| 41 | +Fix: Keep `directories: ["**/*"]` (discovery is working correctly) and add three new dependency groups under the nuget ecosystem entry: |
| 42 | + |
| 43 | +- Testing: Microsoft.NET.Test.Sdk, coverlet.msbuild |
| 44 | +- Common: Castle.Core, JetBrains.Annotations, Microsoft.SourceLink.GitHub, Microsoft.NETFramework.ReferenceAssemblies |
| 45 | +- Other: `*` catch-all — consolidates any package not matched by a named group into a single PR, guarding against future ungrouped shared packages |
| 46 | +<!-- SECTION:DESCRIPTION:END --> |
| 47 | + |
| 48 | +## Acceptance Criteria |
| 49 | +<!-- AC:BEGIN --> |
| 50 | +- [ ] #1 xUnit, AutoFixture, Analyzers, Testing, Common, and Other groups each produce a single cross-directory PR |
| 51 | +- [ ] #2 No more manual 'Align versions in all projects' follow-up commits are needed |
| 52 | +- [ ] #3 `directories: ["**/*"]` is preserved (discovery was already working correctly) |
| 53 | +<!-- AC:END --> |
| 54 | + |
| 55 | +## Implementation Plan |
| 56 | + |
| 57 | +<!-- SECTION:PLAN:BEGIN --> |
| 58 | +In .github/dependabot.yml, add three groups under the nuget ecosystem entry (order matters — Other must be last so named groups take priority): |
| 59 | + |
| 60 | + Testing: |
| 61 | + patterns: |
| 62 | + - "Microsoft.NET.Test.Sdk" |
| 63 | + - "coverlet.msbuild" |
| 64 | + Common: |
| 65 | + patterns: |
| 66 | + - "Castle.Core" |
| 67 | + - "JetBrains.Annotations" |
| 68 | + - "Microsoft.SourceLink.GitHub" |
| 69 | + - "Microsoft.NETFramework.ReferenceAssemblies" |
| 70 | + Other: |
| 71 | + patterns: |
| 72 | + - "*" |
| 73 | + |
| 74 | +The change is already applied to the working tree (not yet committed). Review and commit when ready. |
| 75 | +<!-- SECTION:PLAN:END --> |
0 commit comments