npx skills add ...
npx skills add brave/brave-core --skill make-ci-green
npx skills add brave/brave-core --skill make-ci-green
'Re-run failed CI jobs for a brave/brave-core PR. Detects failure stage and uses WIPE_WORKSPACE for build/infra failures. Triggers on: make ci green, retry ci, rerun ci, fix ci, re-run failed jobs, retrigger ci.'
Re-run failed Jenkins CI jobs for a brave/brave-core PR. Automatically detects the failure stage and decides whether to use WIPE_WORKSPACE (for build/infra failures) or a normal re-run (for test/storybook failures).
The following environment variables must be set (e.g., in your .envrc):
Get your API token from $JENKINS_BASE_URL/me/configure.
Extract the PR number from the user's input. The PR number is required. Check
for --dry-run flag.
| User says | PR number |
|---|---|
/make-ci-green 33936 | 33936 |
| "retry ci for 33936" | 33936 |
| "make ci green on PR 33936" | 33936 |
| "re-run failed jobs 33936 --dry-run" | 33936 (dry run) |
Run the script in dry-run mode to analyze without triggering:
Show the user what was found:
Example output (build/infra failure):
Example output (test failure with analysis):
Key decisions shown per test failure:
If the user wants to proceed (and not --dry-run), run the script to trigger
rebuilds:
Report the results: which checks were retriggered, the action taken, and any errors.
The script examines which pipeline stage failed:
| Failed Stage | Action | Rationale |
|---|---|---|
| init, checkout, install, config, build, compile, setup, sync, gclient, source, deps, fetch, configure, bootstrap, prepare, environment | WIPE_WORKSPACE | Infrastructure/build failure; workspace may be corrupted |
| storybook, test(s), audit, lint, upload, publish, or anything else | Normal re-run | Test failure likely flaky; no workspace issue |
| Unknown (API error) | Normal re-run | Safe default |
Stage matching is case-insensitive substring matching (e.g., "Build (Debug)" matches "build").
When the failed stage is a test stage (not build/infra), the script automatically:
[ FAILED ]
patterns)src/brave/) or Chromium (src/
excluding brave) using git grepbrave/brave-browser matching the test
name| Scenario | Assessment | Action |
|---|---|---|
| PR modifies the test file itself | likely_from_pr | No issue suggestion — developer should fix their PR |
| PR modifies files in the same directory/module | likely_from_pr | No issue suggestion |
PR has chromium_src/ overrides in related paths | likely_from_pr | No issue suggestion |
Chromium test with no related chromium_src/ changes | likely_unrelated | Suggest filing issue (if none exists) |
| Brave test with no overlapping PR changes | likely_unrelated | Suggest filing issue (if none exists) |
| Cannot determine (e.g., test source not found) | unknown | No suggestion |
Issues are never auto-filed. The script only suggests filing and provides:
Test failure: <TestSuite.TestMethod>QA/intermittentbrave/brave-browserThe user must confirm before any issue is created.
0: Success (checks found and processed)1: Config error (missing JENKINS_TOKEN)2: API error (GitHub or Jenkins unreachable)3: No failing Jenkins checks found$JENKINS_BASE_URL in the URL)[ FAILED ]
markers)src/ checkout for git grep test classificationPR 33936: 1 failing Jenkins check(s)
[DRY-RUN] continuous-integration/linux-x64/pr-head
Stage: build
Action: WIPE_WORKSPACE
Reason: Pre-test stage failure: "build" -> WIPE_WORKSPACE
URL: https://$JENKINS_BASE_URL/job/brave-core-build-pr-linux-x64/job/PR-33936/2/PR 33936: 1 failing Jenkins check(s)
[DRY-RUN] continuous-integration/linux-x64/pr-head
Stage: test_brave_unit_tests
Action: normal
Reason: Test/post-build stage failure: "test_brave_unit_tests" -> normal re-run
URL: https://$JENKINS_BASE_URL/job/brave-core-build-pr-linux-x64/job/PR-33936/2/
Test Failures (2):
- BraveWalletServiceTest.GetBalance
Location: brave
PR correlation: likely_from_pr (PR modifies files in same directory as test: browser/brave_wallet/)
- WebUIURLLoaderFactoryTest.RangeRequest
Location: chromium
Upstream flake: known_upstream_flake
PR correlation: likely_unrelated (Chromium test with no related chromium_src overrides in PR)
>> SUGGEST FILING ISSUE: "Test failure: WebUIURLLoaderFactoryTest.RangeRequest"
Stack trace (last 20 lines):
...python3 .claude/skills/make-ci-green/retrigger-ci.py <pr-number> --format json# Dry run: analyze without triggering
python3 .claude/skills/make-ci-green/retrigger-ci.py 33936 --dry-run
# Trigger rebuilds for all failing checks
python3 .claude/skills/make-ci-green/retrigger-ci.py 33936
# JSON output for programmatic use
python3 .claude/skills/make-ci-green/retrigger-ci.py 33936 --format json
# Dry run with JSON output
python3 .claude/skills/make-ci-green/retrigger-ci.py 33936 --dry-run --format json