Add reset button for maxed-out failed builds on versions page#548
Add reset button for maxed-out failed builds on versions page#548frostebite merged 2 commits intomainfrom
Conversation
…uilds - Add troubleshooting entry for the AWS ECS containerOverrides 8192-byte limit with explanation and secret-pulling workaround - Show failure count (e.g. "15/15") next to failed build status icons - Add admin-only reset button that calls resetFailedBuilds endpoint to clear inflated failure counts so the Ingeminator retries them Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThe changes add failure count tracking to build status displays and introduce a reset mechanism for builds experiencing repeated failures (15+), along with documentation for an AWS ECS containerOverrides payload size limit. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
…#548 The 8192 troubleshooting entry and build reset button UI changes are now in a separate PR (#548) targeting main. The orchestrator-specific docs (AWS provider troubleshooting section and secrets tip callout) remain here since those files only exist on this branch. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
src/components/docs/versions/docker-image-link-or-retry-button.tsx (1)
55-79: Guard retry/reset actions against duplicate in-flight submissions.A fast double-click can fire concurrent POSTs before the prior request settles. Add an in-flight guard and disable the button while pending.
Suggested refactor
const [retryRequested, setRetryRequested] = useState<boolean>(false); const [resetRequested, setResetRequested] = useState<boolean>(false); + const [retryPending, setRetryPending] = useState<boolean>(false); + const [resetPending, setResetPending] = useState<boolean>(false); @@ const onRetryClick = async () => { + if (retryPending) return; + setRetryPending(true); try { setRetryRequested(true); await notify.promise(retryBuild(), { @@ } catch { setRetryRequested(false); + } finally { + setRetryPending(false); } }; @@ const onResetClick = async () => { + if (resetPending) return; + setResetPending(true); try { setResetRequested(true); await notify.promise(resetBuild(), { @@ } catch { setResetRequested(false); + } finally { + setResetPending(false); } }; @@ - <button type="button" onClick={onRetryClick} style={buttonStyle}> + <button type="button" onClick={onRetryClick} style={buttonStyle} disabled={retryPending}> @@ - <button type="button" onClick={onResetClick} style={buttonStyle}> + <button type="button" onClick={onResetClick} style={buttonStyle} disabled={resetPending}>Also applies to: 88-97
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/docs/versions/docker-image-link-or-retry-button.tsx` around lines 55 - 79, The onRetryClick and onResetClick handlers (and corresponding UI buttons) currently allow concurrent POSTs on fast double-click; add an in-flight guard using the existing state (e.g., retryRequested and resetRequested) so each handler returns early if already true, set the flag before calling notify.promise and only clear it in the catch/finally as appropriate, and ensure the Retry/Reset button props use the same flags to disable the button while the request is pending; reference onRetryClick, onResetClick, retryBuild, resetBuild, setRetryRequested, setResetRequested, retryRequested and resetRequested when making these changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/09-troubleshooting/common-issues.mdx`:
- Around line 380-389: The YAML example for the game-ci/unity-builder@v4 action
incorrectly places the Orchestrator inputs pullInputList and secretSource under
env: instead of under with:, so move pullInputList and secretSource into the
with: block alongside providerStrategy, targetPlatform, and gitPrivateToken;
update the snippet that references game-ci/unity-builder@v4 to ensure with:
contains providerStrategy, pullInputList, secretSource, targetPlatform and
gitPrivateToken and remove those keys from env:.
In `@src/components/docs/versions/docker-image-link-or-retry-button.tsx`:
- Around line 88-98: The icon-only action buttons rendered with onRetryClick and
onResetClick lack accessible names; add explicit aria-label attributes to the
retry and reset buttons (the elements using HiOutlineRefresh and MdRestartAlt)
so screen readers announce them (e.g., aria-label={`Retry build${retryRequested
? ' requested' : ''}`} and aria-label={`Reset failures
(${failureCount})${resetRequested ? ' requested' : ''}`}), keeping the existing
onClick handlers and visual styling intact.
---
Nitpick comments:
In `@src/components/docs/versions/docker-image-link-or-retry-button.tsx`:
- Around line 55-79: The onRetryClick and onResetClick handlers (and
corresponding UI buttons) currently allow concurrent POSTs on fast double-click;
add an in-flight guard using the existing state (e.g., retryRequested and
resetRequested) so each handler returns early if already true, set the flag
before calling notify.promise and only clear it in the catch/finally as
appropriate, and ensure the Retry/Reset button props use the same flags to
disable the button while the request is pending; reference onRetryClick,
onResetClick, retryBuild, resetBuild, setRetryRequested, setResetRequested,
retryRequested and resetRequested when making these changes.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 789eb13f-8525-4ad5-8c9b-3a8eeecb598e
📒 Files selected for processing (3)
docs/09-troubleshooting/common-issues.mdxsrc/components/docs/versions/builds/build-row.tsxsrc/components/docs/versions/docker-image-link-or-retry-button.tsx
| ```yaml | ||
| - uses: game-ci/unity-builder@v4 | ||
| env: | ||
| pullInputList: UNITY_LICENSE,UNITY_SERIAL,UNITY_EMAIL,UNITY_PASSWORD | ||
| secretSource: aws-secrets-manager | ||
| with: | ||
| providerStrategy: aws | ||
| targetPlatform: StandaloneLinux64 | ||
| gitPrivateToken: ${{ secrets.GITHUB_TOKEN }} | ||
| ``` |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
game-ci/unity-builder v4 documentation for pullInputList and secretSource parameters syntax
💡 Result:
game-ci/unity-builder v4 includes Orchestrator features for advanced builds. The parameters pullInputList and secretSource are Orchestrator-specific inputs defined in action.yml. pullInputList: '[Orchestrator] Extend game ci by specifying a command to execute to pull input from external source e.g cloud storage. The command is formatted to replace "{0}" with the parameter parameter name.' Syntax example from related CLI/docs: with: pullInputList: 'UNITY_EMAIL,UNITY_PASSWORD' secretSource: 'gcloud secrets versions access 1 --secret="{0}"' secretSource relates to secrets handling in postBuildSteps/preBuildSteps (yaml format with keys image, secrets (name, value object array), command line string), and AWS CloudFormation secrets (array with Name and ValueFrom). These are used when orchestratorMode is enabled (local, k8s, aws). No basic builder docs cover them; they are advanced/CLI/orchestrator features. Latest v4.8.1 (2025-11-22). For full inputs, see https://github.com/game-ci/unity-builder/blob/main/action.yml
Citations:
- 1: https://github.com/game-ci/unity-builder/blob/main/action.yml
- 2: https://game.ci/docs/github-orchestrator/advanced-topics/configuration-override
- 3: https://game.ci/docs/github/builder/
- 4: Fixed AWS to work when no secrets specified unity-builder#686
Move pullInputList and secretSource from env: to with: block.
The code example incorrectly places pullInputList and secretSource under the env: block. According to the game-ci/unity-builder action.yml, these are Orchestrator-specific action inputs that must be configured under the with: block. Update the YAML to:
- uses: game-ci/unity-builder@v4
with:
providerStrategy: aws
pullInputList: UNITY_LICENSE,UNITY_SERIAL,UNITY_EMAIL,UNITY_PASSWORD
secretSource: aws-secrets-manager
targetPlatform: StandaloneLinux64
gitPrivateToken: ${{ secrets.GITHUB_TOKEN }}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/09-troubleshooting/common-issues.mdx` around lines 380 - 389, The YAML
example for the game-ci/unity-builder@v4 action incorrectly places the
Orchestrator inputs pullInputList and secretSource under env: instead of under
with:, so move pullInputList and secretSource into the with: block alongside
providerStrategy, targetPlatform, and gitPrivateToken; update the snippet that
references game-ci/unity-builder@v4 to ensure with: contains providerStrategy,
pullInputList, secretSource, targetPlatform and gitPrivateToken and remove those
keys from env:.
| <button type="button" onClick={onRetryClick} style={buttonStyle}> | ||
| <HiOutlineRefresh color={retryRequested ? 'orange' : 'red'} /> | ||
| </button> | ||
| </Tooltip> | ||
| {isMaxedOut && ( | ||
| <Tooltip | ||
| content={`Reset failure count (${failureCount}) so Ingeminator retries this build.`} | ||
| > | ||
| <button type="button" onClick={onResetClick} style={buttonStyle}> | ||
| <MdRestartAlt color={resetRequested ? 'orange' : '#b45309'} /> | ||
| </button> |
There was a problem hiding this comment.
Add accessible names to icon-only action buttons.
Both action buttons are icon-only, so screen readers get unnamed controls. Add explicit aria-labels.
Suggested fix
- <button type="button" onClick={onRetryClick} style={buttonStyle}>
+ <button
+ type="button"
+ onClick={onRetryClick}
+ style={buttonStyle}
+ aria-label={`Retry build ${buildId}`}
+ >
<HiOutlineRefresh color={retryRequested ? 'orange' : 'red'} />
</button>
@@
- <button type="button" onClick={onResetClick} style={buttonStyle}>
+ <button
+ type="button"
+ onClick={onResetClick}
+ style={buttonStyle}
+ aria-label={`Reset failure count for build ${buildId}`}
+ >
<MdRestartAlt color={resetRequested ? 'orange' : '#b45309'} />
</button>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <button type="button" onClick={onRetryClick} style={buttonStyle}> | |
| <HiOutlineRefresh color={retryRequested ? 'orange' : 'red'} /> | |
| </button> | |
| </Tooltip> | |
| {isMaxedOut && ( | |
| <Tooltip | |
| content={`Reset failure count (${failureCount}) so Ingeminator retries this build.`} | |
| > | |
| <button type="button" onClick={onResetClick} style={buttonStyle}> | |
| <MdRestartAlt color={resetRequested ? 'orange' : '#b45309'} /> | |
| </button> | |
| <button | |
| type="button" | |
| onClick={onRetryClick} | |
| style={buttonStyle} | |
| aria-label={`Retry build ${buildId}`} | |
| > | |
| <HiOutlineRefresh color={retryRequested ? 'orange' : 'red'} /> | |
| </button> | |
| </Tooltip> | |
| {isMaxedOut && ( | |
| <Tooltip | |
| content={`Reset failure count (${failureCount}) so Ingeminator retries this build.`} | |
| > | |
| <button | |
| type="button" | |
| onClick={onResetClick} | |
| style={buttonStyle} | |
| aria-label={`Reset failure count for build ${buildId}`} | |
| > | |
| <MdRestartAlt color={resetRequested ? 'orange' : '#b45309'} /> | |
| </button> |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/components/docs/versions/docker-image-link-or-retry-button.tsx` around
lines 88 - 98, The icon-only action buttons rendered with onRetryClick and
onResetClick lack accessible names; add explicit aria-label attributes to the
retry and reset buttons (the elements using HiOutlineRefresh and MdRestartAlt)
so screen readers announce them (e.g., aria-label={`Retry build${retryRequested
? ' requested' : ''}`} and aria-label={`Reset failures
(${failureCount})${resetRequested ? ' requested' : ''}`}), keeping the existing
onClick handlers and visual styling intact.
This PR now only contains the reset button UI changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Visit the preview URL for this PR (updated for commit 6750c86): https://game-ci-5559f--pr548-feat-8192-docs-and-r-q719hc48.web.app (expires Thu, 02 Apr 2026 16:37:04 GMT) 🔥 via Firebase Hosting GitHub Action 🌎 Sign: 1f0574f15f83e11bfc148eae8646486a6d0e078b |

Summary
⚠ (15/15)) next to failed build status icons on the versions page so admins can identify stuck builds at a glanceresetFailedBuildsbackend endpoint to clear inflated failure counts so the Ingeminator can retry themContext
The old 500 error loop (fixed in versioning-backend#84) artificially inflated
failureCounton many builds past the max of 15. These builds are permanently stuck. The reset button provides a code-based way to fix them without manual Firestore edits.Depends on
resetFailedBuildsendpointTest plan
failureCount >= 15show count display (e.g.,⚠ (15/15))resetFailedBuildsendpoint and shows toast feedback🤖 Generated with Claude Code