Skip to content

CI Testing Upgrade - #5430

Merged
Rinary1 merged 35 commits into
ss14Starlight:starlight-devfrom
Mackamuir:big-test-p1
Aug 10, 2026
Merged

CI Testing Upgrade#5430
Rinary1 merged 35 commits into
ss14Starlight:starlight-devfrom
Mackamuir:big-test-p1

Conversation

@Mackamuir

@Mackamuir Mackamuir commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Short description

Makes CI Epic.
Goals:

  • Make CI output more readable, and steer new devs away from terms like "Shard 5 Failed". It's pretty bad that devs that are new actually have no idea what the tests are even doing. But do all this while keeping the more advanced info available.
  • Reduce job time for CI. Github allows us to have 20 runners going at any time, If you have ever seen "Queued" On your CI jobs, it's because you are waiting for one of OUR runners to become available. Currently the build-test-debug workflow takes around 20~ minutes to finish clock time, this PR either has to match that or reduce it.
  • Keep on scope creeping this every day it isn't reviewed.

Changes

Testing Framework Migration

Upgrades the testing framework from using VSTest to MTP. The reasoning behind this is that MTP is just flat newer, has better modules, and integrations.

Content.Tests and Content.IntegrationTests are now built as executables, and CI runs those precompiled binaries directly instead of calling dotnet test, it improves performance a fair bit. The build artifact now only contains the test binaries instead of the entire checkout.

Changed hang detection over to MTP's HangDump extension.

Reworked test sharding to use MTP's JSON test discovery.

Removed all the rider run configuration (Sorry), But now since you can easily identify testfails we shouldn't really need it.

Test Retries

The migration to MTP also allows us to natively retry specific failed tests. Each failed test can be retried twice after the original attempt, instead of using the retry action to rerun the entire test suite/shard and adding another 15 minutes. Retry results are uploaded alongside the original CTRF reports so we don't lose the failure output, and if they are real testfails we get real failure messages instead of the ambiguous stuff we got before. Retries are disabled during timing harvests so they don't mess with the results.

Timing-Based Sharding

New timing-based sharding pipeline, to automagically create weights for all of the tests. The manually dispatched Harvest Test Timings workflow runs every integration test without retries, merges the CTRF reports, and will create the baseline. It then strips it and creates a test-timings.ctrf.json artifact, which still needs to be downloaded and committed.

New tests without timing data use the median test duration as a fallback.

Reduced the amount of CI shards from 8 > X at the cost of they take around 14~ minutes to finish, if we bump it up to like 6 runners they each finish in about X minutes per shard.

Did some tests, here is a table of timings:

# of shards Time (minutes)
4 19-25
6 20
8 16

Reporting

Changed the reporter to this CTRF Reporter, I like it better, again less verbose but more readable. Content and Integration tests get separate summaries and downloadable report artifacts.

The reporter also leaves one combined comment on the PR and overwrites it when new results come in, I got sick of not being able to see test results on my phone. This is handled by a separate workflow so fork PRs don't get write permissions.

Reduce the amount of output in Build-Test-Debug, way more readable now, I think the trade off is worth it. Normal run has minimal logs, debug contains a lot more. The old info was interesting but not really useful as we never used it to compare, but it is still saved in the CTRF outputs.

Workflow Restructuring

Moved Yaml Linting into Build-Test-Debug as a job that reuses the already compiled binaries. This frees up another runner that previously had to restore and build the entire project independently. The old workflow is disabled via comment.

Editorconfig linting migrated to actually use editorconfig, diffing the PR to get changed files, this will give false positives if the PR is out of date with head.

Added ReviewDog reviews to catch compiler warnings that are applicable to the PR

Performance & Memory

Reduced integration-test parallelism from 2 > 1 to stop the test processes peaking at genuinely stupid amounts of memory, this also caused no extra action time. Harvest and runner-debug runs also print memory usage while the tests are running, which should hopefully help.

Example Harvest workflow:
https://github.com/Mackamuir/space-station-14/actions/runs/31050550671

Why we need to add this

Read and weep
Tests actually show native errors
If a test fails it will only retry said test.

Media (Video/Screenshots)

Checks

  • I do not require assistance to complete the PR.
  • Before posting/requesting review of a PR, I have verified that the changes work.
  • I have added screenshots/videos of the changes, or this PR does not change in-game mechanics.
  • I affirm that my changes are licensed under the MIT License and grant permission for use in this repository under its conditions.

@Mackamuir
Mackamuir requested a review from a team July 31, 2026 14:04
@github-actions github-actions Bot added S: Untriaged Status: Indicates an item has not been triaged and doesn't have appropriate labels. size/L S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. labels Jul 31, 2026
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Purpose

Upgrade CI test execution from VSTest to Microsoft Testing Platform (MTP). Tests now run from precompiled executables with retries, hang detection, JSON discovery, CTRF reporting, and timing-based sharding.

User and developer impact

  • CI provides CTRF reports and pull request test summaries.
  • Integration tests run with lower parallelism to reduce resource contention.
  • Six shards use measured durations and median-duration estimates for new tests.
  • Developers can manually harvest test timing data.
  • Local JetBrains shard run configurations were removed.

Notable changes

  • Added MTP, NUnit runner, retry, hang-dump, and CTRF configuration.
  • Reworked build-test-debug.yml around six dynamic shards.
  • Added timing-harvesting and pull request comment workflows.
  • Moved YAML linting into Build-Test-Debug and disabled automatic triggers for the standalone linter.
  • Reworked Tools/_Starlight/partition_tests.py for JSON discovery, timing aggregation, filter generation, validation, and harvesting.
  • Updated EF Core packages to 10.0.6.
  • Added a 1,136-test CTRF timing baseline.
  • Replaced the CRLF checker with EditorConfig Checker.

Risk areas

  • CI depends on MTP extensions and executable-based test discovery.
  • Shard filters and timing data can affect test distribution and CI duration.
  • Baseline validation can reject incomplete or invalid timing reports.
  • Integration-test parallelism and memory monitoring changes can affect test duration.
  • Workflow artifact, permission, trigger, and cleanup changes require validation on pull requests and manual runs.
  • The pull request comment workflow depends on completed workflow artifacts and an associated open pull request.
  • The EF Core package updates add dependency-change risk unrelated to the test-runner migration.

Validation evidence

  • The timing baseline records 1,123 passed tests and 13 skipped tests.
  • The baseline records no failures or flaky tests.
  • The workflows include CTRF aggregation, artifact uploads, retries, diagnostics, and pull request summaries.
  • The linter now reports repository-relative paths and distinct exit codes.
  • The available context does not provide completed CI results for the new workflows.

Guideline gaps

  • No explanatory documentation describes the MTP migration, shard-generation flow, timing harvest process, or median-duration fallback.
  • The PR body does not state the rationale for changing the shard count from eight to six.
  • The available context does not show Starlight ownership comments for the new or changed tooling.
  • The available context does not include changelog updates or confirm the required changelog format.
  • The PR body does not provide completed validation results for the new workflows.

Walkthrough

The pull request configures executable NUnit testing with Microsoft Testing Platform extensions, replaces fixed test sharding with timing-based six-shard generation, updates CI execution and reporting, and adds workflows for pull-request reports and harvested timing baselines.

Changes

CI test execution

Layer / File(s) Summary
Test runner and package configuration
.github/ci.runsettings, global.json, Directory.Build.*, Directory.Packages.props, Content.Tests/*, Content.IntegrationTests/*, .editorconfig, .gitignore
NUnit and Microsoft Testing Platform execution are enabled. Test projects build as executables with CTRF, retry, and hang-dump support. Package versions and test settings are updated.
Timing-based test sharding
Tools/_Starlight/partition_tests.py, Tools/_Starlight/prepare_test_shards.py, Tools/_Starlight/test-timings.ctrf.json
JSON discovery, explicit-test exclusion, measured timings, six-shard filter generation, manifest output, CTRF validation, and timing harvesting replace the previous text-list and runsettings flow.
Build, test, and lint pipeline
.github/workflows/build-test-debug.yml, .github/workflows/yaml-linter.yml, .github/workflows/check-crlf.yml, Content.YAMLLinter/Program.cs, Content.IntegrationTests/Tests/Round/JobTest.cs
The workflow builds test binaries, runs dynamic shards directly, collects CTRF results, supports harvest diagnostics, adds YAML linting, checks changed-file formatting, aggregates reports, and manages artifacts.
Report publication and timing harvest
.github/workflows/build-test-debug-pr-comment.yml, .github/workflows/harvest-test-timings.yml
Separate workflows publish pull-request test comments and merge shard CTRF reports into timing baselines.

Estimated code review effort: 5 (Critical) | ~120 minutes

Suggested reviewers: redmushie

Sequence Diagram(s)

sequenceDiagram
  participant BuildJob
  participant ShardPreparation
  participant ContentTests
  participant IntegrationTests
  participant ReportWorkflows
  BuildJob->>ShardPreparation: Build binaries and generate six shard filters
  ShardPreparation->>ContentTests: Provide test binaries and filters
  ShardPreparation->>IntegrationTests: Provide test binaries and shard filters
  ContentTests->>ReportWorkflows: Upload CTRF results
  IntegrationTests->>ReportWorkflows: Upload shard CTRF results
  ReportWorkflows->>ReportWorkflows: Publish comments or promote timing baseline
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 52.38% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly and concisely describes the pull request's main change: upgrading CI testing.
Description check ✅ Passed The description directly explains the CI testing, reporting, sharding, workflow, and performance changes in the changeset.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (5)
.github/workflows/build-test-debug.yml (4)

222-234: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the unused "Download shard test results" step.

Good consolidation moving reporting into one job. However, the /tmp/shard-nunit output from Lines 222-227 doesn't appear to be consumed anywhere — the "Generate CTRF test report" step (Line 240) only globs /tmp/ctrf-results/**/*.json, which is already populated by the broader test-nunit-* download at Lines 229-234. Removing the first download step saves artifact-download time on every CI run without losing anything.

🧹 Proposed removal of the unused step
-      - name: Download shard test results
-        continue-on-error: true
-        uses: actions/download-artifact@v8
-        with:
-          pattern: test-nunit-shard-*
-          path: /tmp/shard-nunit
-
       - name: Download CTRF test results
         continue-on-error: true
         uses: actions/download-artifact@v8
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build-test-debug.yml around lines 222 - 234, Remove the
"Download shard test results" step that downloads artifacts matching the pattern
test-nunit-shard-* to /tmp/shard-nunit, as this directory is not consumed by any
subsequent steps in the workflow. The "Generate CTRF test report" step only uses
/tmp/ctrf-results populated by the second download step, making the first
download redundant and safe to delete entirely.

25-26: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Set persist-credentials: false on checkout steps that don't need to push. All five actions/checkout@v7 steps in this file use default credential persistence; none of these jobs push commits or tags, so the shared root cause is the same missing hardening flag repeated five times.

  • .github/workflows/build-test-debug.yml#L25-L26: add persist-credentials: false to the build job's checkout.
  • .github/workflows/build-test-debug.yml#L69-L70: add persist-credentials: false to the content-tests job's checkout.
  • .github/workflows/build-test-debug.yml#L124-L125: add persist-credentials: false to the integration-tests job's checkout.
  • .github/workflows/build-test-debug.yml#L182-L183: add persist-credentials: false to the yaml-linter job's checkout.
  • .github/workflows/build-test-debug.yml#L219-L220: add persist-credentials: false to the ci-success job's checkout.
🔒 Proposed fix (repeat for each site)
       - name: Checkout
         uses: actions/checkout@v7
+        with:
+          persist-credentials: false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build-test-debug.yml around lines 25 - 26, Add
persist-credentials: false to all five actions/checkout@v7 steps in the file to
disable credential persistence for jobs that do not perform git push operations.
In .github/workflows/build-test-debug.yml at lines 25-26 (build job), lines
69-70 (content-tests job), lines 124-125 (integration-tests job), lines 182-183
(yaml-linter job), and lines 219-220 (ci-success job), add the
persist-credentials: false option to each checkout action invocation to complete
the security hardening across all non-push workflow jobs.

Source: Linters/SAST tools


188-193: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Extend NuGet restore caching to the test jobs, and confirm the cache is ever populated.

This cache-restore step is a nice addition for the linter job. Two things worth checking:

  1. content-tests (Line 84) and each of the 6 integration-tests shards (Line 140) run dotnet restore without this cache, so the PR's own goal of not increasing total runtime despite fewer shards is only partly realized — 7 of 8 test/lint jobs still pay full restore cost.
  2. No actions/cache/save@v4 step (or save-always input) is visible anywhere in this file. Without a save step, actions/cache/restore@v4 here will always miss and never gets warmed.

Consider applying the same restore-cache pattern to content-tests and integration-tests, and adding a matching actions/cache/save@v4 step (or save-always: true on the restore step) so the cache is actually populated.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build-test-debug.yml around lines 188 - 193, The NuGet
cache restore pattern shown for the linter job needs to be applied to the
content-tests job (around line 84) and each of the integration-tests shards
(around line 140) so all test runs benefit from cached packages. Additionally,
add an actions/cache/save@v4 step (or set save-always: true on the restore step)
after the dotnet restore runs to populate the cache, otherwise the restore-cache
step will always miss and never warm the cache. Copy the Restore NuGet cache
step configuration to both test job types, and ensure a matching save step
exists in at least one job that runs successfully to seed the cache for
subsequent runs.

46-49: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Update the local shard helper for the new six-shard count.

Nice shard-count update in CI. Tools/_Starlight/prepare_test_shards.py still calls partition_tests.py generate 8, so local shard filters will differ from CI. Change line 63 to generate 6 so local failure reproduction matches CI layout.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build-test-debug.yml around lines 46 - 49, Update the
shard count used by prepare_test_shards.py to pass 6 to partition_tests.py
generate, matching the six-shard configuration in the Discover Integration Tests
workflow and keeping local shard filters consistent with CI.
.github/workflows/yaml-linter.yml (1)

8-14: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider deleting this workflow instead of disabling all its triggers.

Good call retiring the standalone linter workflow now that build-test-debug.yml runs an equivalent yaml-linter job. Since every trigger is commented out and there's no workflow_call, the build job here (Lines 17-42) can never execute again. Keeping a fully dormant workflow file around is a bit of a trap for future maintainers — it reads as live CI configuration. Deleting the file (or repurposing it as a workflow_call-triggered reusable workflow, if that's the actual intent) would be clearer than a permanently-disabled trigger block.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/yaml-linter.yml around lines 8 - 14, The yaml-linter
workflow file has all its triggers (the on: section) commented out, making the
build job unreachable and the entire workflow dormant. Since the yaml-linter
functionality is now handled by an equivalent job in build-test-debug.yml,
either delete the entire yaml-linter.yml file to remove dormant configuration
that could confuse future maintainers, or if the workflow is intended for reuse
elsewhere, repurpose it by adding a workflow_call trigger instead of the
commented-out push, pull_request, and workflow_dispatch triggers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/build-test-debug.yml:
- Line 217: Change the runs-on label for the ci-success job from ubuntu-slim to
ubuntu-latest. This enables the use of a configurable timeout-minutes setting
instead of relying on the immutable 15-minute timeout imposed by the ubuntu-slim
runner.
- Around line 17-18: Move the workflow-level pull-requests write permission into
the ci-success job that invokes ctrf-io/github-test-reporter@v1, and remove it
from the global permissions block. Keep other jobs, including build,
content-tests, integration-tests, and yaml-linter, without that permission.

In `@Tools/_Starlight/partition_tests.py`:
- Around line 383-411: Define the missing load_timings() helper and
cmd_harvest() command implementation in Tools/_Starlight/partition_tests.py
before their existing call sites, ensuring cmd_generate() can load timing data
and the harvest command dispatch resolves without NameError. Preserve the
current timing-weighted shard behavior and align cmd_harvest() with the parser’s
harvest arguments and existing command conventions.

---

Nitpick comments:
In @.github/workflows/build-test-debug.yml:
- Around line 222-234: Remove the "Download shard test results" step that
downloads artifacts matching the pattern test-nunit-shard-* to /tmp/shard-nunit,
as this directory is not consumed by any subsequent steps in the workflow. The
"Generate CTRF test report" step only uses /tmp/ctrf-results populated by the
second download step, making the first download redundant and safe to delete
entirely.
- Around line 25-26: Add persist-credentials: false to all five
actions/checkout@v7 steps in the file to disable credential persistence for jobs
that do not perform git push operations. In
.github/workflows/build-test-debug.yml at lines 25-26 (build job), lines 69-70
(content-tests job), lines 124-125 (integration-tests job), lines 182-183
(yaml-linter job), and lines 219-220 (ci-success job), add the
persist-credentials: false option to each checkout action invocation to complete
the security hardening across all non-push workflow jobs.
- Around line 188-193: The NuGet cache restore pattern shown for the linter job
needs to be applied to the content-tests job (around line 84) and each of the
integration-tests shards (around line 140) so all test runs benefit from cached
packages. Additionally, add an actions/cache/save@v4 step (or set save-always:
true on the restore step) after the dotnet restore runs to populate the cache,
otherwise the restore-cache step will always miss and never warm the cache. Copy
the Restore NuGet cache step configuration to both test job types, and ensure a
matching save step exists in at least one job that runs successfully to seed the
cache for subsequent runs.
- Around line 46-49: Update the shard count used by prepare_test_shards.py to
pass 6 to partition_tests.py generate, matching the six-shard configuration in
the Discover Integration Tests workflow and keeping local shard filters
consistent with CI.

In @.github/workflows/yaml-linter.yml:
- Around line 8-14: The yaml-linter workflow file has all its triggers (the on:
section) commented out, making the build job unreachable and the entire workflow
dormant. Since the yaml-linter functionality is now handled by an equivalent job
in build-test-debug.yml, either delete the entire yaml-linter.yml file to remove
dormant configuration that could confuse future maintainers, or if the workflow
is intended for reuse elsewhere, repurpose it by adding a workflow_call trigger
instead of the commented-out push, pull_request, and workflow_dispatch triggers.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: b12fbf49-7cc0-49f2-bda0-c869011835e1

📥 Commits

Reviewing files that changed from the base of the PR and between 08903dd and ae06f71.

📒 Files selected for processing (13)
  • .config/dotnet-tools.json
  • .github/ci.runsettings
  • .github/workflows/build-test-debug.yml
  • .github/workflows/yaml-linter.yml
  • Content.IntegrationTests/Content.IntegrationTests.csproj
  • Content.Tests/Content.Tests.csproj
  • Directory.Build.props
  • Directory.Build.targets
  • Directory.Packages.props
  • Resources/Prototypes/_Starlight/Entities/Structures/Piping/Plumbing/plumbing_machines.yml
  • Tools/_Starlight/partition_tests.py
  • Tools/_Starlight/test-timings.json
  • global.json

Comment thread .github/workflows/build-test-debug.yml Outdated
Comment thread .github/workflows/build-test-debug.yml
Comment thread Tools/_Starlight/partition_tests.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Tools/_Starlight/partition_tests.py`:
- Around line 327-335: Validate the result of json.load in the timing-loading
flow before iterating: require data to be a dict, and return None for null,
list, scalar, or other non-object values. Keep the existing timings coercion and
filtering logic unchanged for valid dictionaries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: b88c6326-ef62-4144-94ec-78c0e3643644

📥 Commits

Reviewing files that changed from the base of the PR and between ae06f71 and 30d34e6.

📒 Files selected for processing (1)
  • Tools/_Starlight/partition_tests.py

Comment thread Tools/_Starlight/partition_tests.py Outdated
@Mackamuir Mackamuir changed the title CI Testing Upgrade - Part 1 CI Testing Upgrade Aug 1, 2026
@Mackamuir

Mackamuir commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

PR Comments wont work until this is on the main branch

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/build-test-debug.yml (1)

116-169: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Keep generated shard count equal to executed shard count.

The reduced CI fan-out is good. Tools/_Starlight/prepare_test_shards.py, Line 63, still generates eight partitions. This workflow executes six shard jobs. Tests assigned to generated shards 6 and 7 will not run.

Pass the same shard count to prepare_test_shards.py and the integration-job matrix.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/build-test-debug.yml around lines 116 - 169, Update the
shard-generation step that invokes prepare_test_shards.py to use the same
six-shard count as the integration-test matrix in the workflow. Ensure the
generated shard files cover exactly shards 0 through 5 so every assigned test is
executed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/test-report-comment.yml:
- Around line 16-18: Update the report-comment workflow’s PR lookup/output flow
around the trusted PR resolution and before writing number to GITHUB_OUTPUT:
fetch the PR head SHA, compare it with HEAD_SHA, and skip the comment/report
update when they differ. Keep the existing behavior for matching SHAs, and
adjust the concurrency handling only as needed to prevent stale runs from
overwriting the latest PR report.

In `@Tools/_Starlight/partition_tests.py`:
- Around line 515-520: Update the TRX parsing used by cmd_harvest to import
ElementTree from defusedxml.ElementTree instead of xml.etree.ElementTree, while
preserving the existing ET.parse and ET.ParseError handling in the trx_files
loop.

---

Outside diff comments:
In @.github/workflows/build-test-debug.yml:
- Around line 116-169: Update the shard-generation step that invokes
prepare_test_shards.py to use the same six-shard count as the integration-test
matrix in the workflow. Ensure the generated shard files cover exactly shards 0
through 5 so every assigned test is executed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 00199084-d2cd-438e-bf31-e90231d37770

📥 Commits

Reviewing files that changed from the base of the PR and between 427eb11 and 0656d64.

📒 Files selected for processing (3)
  • .github/workflows/build-test-debug.yml
  • .github/workflows/test-report-comment.yml
  • Tools/_Starlight/partition_tests.py

Comment thread .github/workflows/build-test-debug-pr-comment.yml
Comment thread Tools/_Starlight/partition_tests.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Directory.Packages.props`:
- Line 37: Update the file ending after the closing </Project> element to
include a final newline, ensuring Tools/check_crlf.py and the EditorConfig
checks pass.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: b00da235-0a54-4ddd-ac8b-4b91ca821203

📥 Commits

Reviewing files that changed from the base of the PR and between 0656d64 and 9f4a103.

📒 Files selected for processing (1)
  • Directory.Packages.props

Comment thread Directory.Packages.props Outdated
@Mackamuir
Mackamuir marked this pull request as draft August 1, 2026 06:34
@Mackamuir

Copy link
Copy Markdown
Contributor Author

ok opening again I need tests to run believe it or not

@Mackamuir
Mackamuir marked this pull request as ready for review August 1, 2026 06:46
@Mackamuir Mackamuir added S: Draft Status: This is a draft and might need to be retriaged upon opening. and removed S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. labels Aug 1, 2026
@Mackamuir

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Mackamuir

Copy link
Copy Markdown
Contributor Author

@coderabbitai resume

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Reviews resumed.

@Mackamuir

Copy link
Copy Markdown
Contributor Author

https://github.com/coderabbitai review

@Mackamuir Mackamuir added S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. and removed S: Draft Status: This is a draft and might need to be retriaged upon opening. labels Aug 5, 2026
Move both test projects off the VSTest host and onto Microsoft.Testing
Platform, so tests build into self-hosting executables that can be
invoked directly.

- global.json selects the Microsoft.Testing.Platform runner.
- Directory.Build.props turns on EnableNUnitRunner repo-wide.
- Directory.Build.targets re-enables the NUnit runner for test projects
  that RobustToolbox's own Directory.Build.props shadowed, and pins the
  adapter reference it needs.
- Content.Tests and Content.IntegrationTests become Exe, pick up the
  NUnit3TestAdapter 6.2.0 MTP-capable adapter, and add the HangDump,
  Retry and CtrfReport extensions.
- .github/ci.runsettings carries the NUnit MTP settings CI runs with.
- LevelOfParallelism drops to 1; integration tests were peaking well
  past available memory at 2.
- Starlight package versions are grouped together in
  Directory.Packages.props to keep upstream merges clean.
@Mackamuir

Copy link
Copy Markdown
Contributor Author

Big ass PR, ready to review, let me know if this needs to be split up

@Mackamuir

Copy link
Copy Markdown
Contributor Author

Also if a test hangs it won't retry, unfortunately, but no fixes available from what I could find

@starlightgithub starlightgithub Bot added S: Approved Status: Reviewed and approved by at least one maintainer or dev; a PR may require another approval. and removed S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. labels Aug 10, 2026
@Rinary1
Rinary1 enabled auto-merge August 10, 2026 16:56
@Rinary1
Rinary1 added this pull request to the merge queue Aug 10, 2026
Merged via the queue into ss14Starlight:starlight-dev with commit d194a9d Aug 10, 2026
19 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Aug 11, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changes: C# S: Approved Status: Reviewed and approved by at least one maintainer or dev; a PR may require another approval. S: Untriaged Status: Indicates an item has not been triaged and doesn't have appropriate labels. size/XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants