fixing-streamlit-ci

作者: streamlit

分析并修复当前分支/PR中失败的GitHub Actions CI任务。当CI检查失败、PR检查显示失败或需要诊断时使用…

npx skills add https://github.com/streamlit/streamlit --skill fixing-streamlit-ci

Fix CI Failures

Diagnose and fix failed GitHub Actions CI jobs for the current branch/PR using gh CLI and git commands.

When to Use

  • CI checks have failed on a PR
  • You need to understand why a workflow failed
  • You want to apply fixes and verify locally

Workflow

Copy this checklist to track progress:

- [ ] Verify authentication
- [ ] Gather context & find failed jobs
- [ ] Download & analyze logs
- [ ] Present diagnosis to user
- [ ] Apply fix & verify locally
- [ ] Push & recheck CI

1. Verify Authentication

gh auth status

If authentication fails, prompt user to run gh auth login with appropriate scopes.

2. Gather PR Context

# Get PR for current branch
gh pr view --json number,title,url,headRefName

# Get PR description and metadata
gh pr view --json title,body,labels,author

# List changed files
gh pr diff --name-only

# All changes
gh pr diff

3. Check CI Status

# List all checks (shows pass/fail status)
gh pr checks

# Get detailed check info
gh pr checks --json name,state,conclusion,detailsUrl,startedAt,completedAt

# List only failed runs
gh run list --branch $(git branch --show-current) --status failure --limit 10

# Check if CI is still running
gh run list --branch $(git branch --show-current) --status in_progress

4. Find Failed Jobs

# View run details (get RUN_ID from previous step)
gh run view {RUN_ID}

# List failed jobs with IDs
gh run view {RUN_ID} --json jobs --jq '.jobs[] | select(.conclusion == "failure") | {id: .databaseId, name: .name}'

# List failed jobs with their failed steps
gh run view {RUN_ID} --json jobs --jq '.jobs[] | select(.conclusion == "failure") | {name: .name, steps: [.steps[] | select(.conclusion == "failure") | .name]}'

5. Download & Analyze Logs

Primary method:

# Get failed logs (last 250 lines usually contains the error)
gh run view {RUN_ID} --log-failed 2>&1 | tail -250

# Target a specific failed job by ID
gh run view {RUN_ID} --job {JOB_ID} --log-failed 2>&1 | tail -100

Fallback for pending logs:

REPO=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
gh api "/repos/${REPO}/actions/jobs/{JOB_ID}/logs"

Smart log extraction (examples):

# Context around failure markers
gh run view {RUN_ID} --log-failed 2>&1 | grep -B 5 -A 10 -iE "error|fail|exception|traceback|panic|fatal" | head -100

# Python tests - pytest summary
gh run view {RUN_ID} --log-failed 2>&1 | grep -E -A 50 "FAILED|ERROR|short test summary"

# TypeScript/ESLint errors
gh run view {RUN_ID} --log-failed 2>&1 | grep -E -B 2 -A 5 "error TS|error  "

# E2E snapshot mismatches
gh run view {RUN_ID} --log-failed 2>&1 | grep -E -B 2 -A 5 "Missing snapshot for|Snapshot mismatch for"

6. Analyze Failure

Identify:

  • Error type: Lint, type check, test failure, build error
  • Root cause: First/primary error (not cascading failures)
  • Affected files: Which files need changes
  • Error message: Exact error text

Common CI failure categories:

CategoryWorkflowMake CommandAuto-fix
Python lintpython-tests.ymlmake python-lintmake autofix
Python typespython-tests.ymlmake python-types❌ Manual
Python testspython-tests.ymlmake python-tests❌ Manual
Frontend lintjs-tests.ymlmake frontend-lintmake autofix
Frontend typesjs-tests.ymlmake frontend-types❌ Manual
Frontend testsjs-tests.ymlmake frontend-tests❌ Manual
E2E testsplaywright.ymlmake run-e2e-test <file>❌ Manual
E2E snapshotsplaywright.ymlmake run-e2e-test <file>make update-snapshots
NOTICESjs-tests.ymlmake update-noticesmake update-notices
Min constraintspython-tests.ymlmake update-min-depsmake update-min-deps
Pre-commitenforce-pre-commit.ymluv run pre-commit run --all-files✅ Mostly auto-fix
Relative importsensure-relative-imports.ymlCheck script output❌ Manual
PR Labelsrequire-labels.ymlN/A⏭️ Ignore

💡 Quick win: Run make autofix first for lint/formatting failures.

7. Present Diagnosis

For multiple failures, list all and let user choose:

CI Failure Analysis for PR #{NUMBER}: {TITLE}
═══════════════════════════════════════════════════════════════

Found {N} failed jobs/checks:

─────────────────────────────────────────────────────────────────

1. [LINT] Python Unit Tests → Run Linters
   Workflow: python-tests.yml (GitHub Actions)
   Error:    Ruff formatting error in lib/streamlit/elements/foo.py
   Auto-fix: ✅ `make autofix`

2. [TYPE] Javascript Unit Tests → Run type checks
   Workflow: js-tests.yml (GitHub Actions)
   Error:    TS2322: Type 'string' is not assignable to type 'number'
   File:     frontend/lib/src/components/Bar.tsx:42
   Auto-fix: ❌ Manual fix required

─────────────────────────────────────────────────────────────────

Which failures should I address?
Recommended: "1" (auto-fixable)
Options: "1" | "1,2" | "1-2" | "all" | "only auto-fixable"

For single failure, show detailed analysis:

─────────────────────────────────────────────────────────────────
Analyzing: [TYPE] Javascript Unit Tests → Run type checks
─────────────────────────────────────────────────────────────────

Category: TYPE
Workflow: js-tests.yml
Job:      js-unit-tests (ID: 12345678)
Step:     Run type checks

Error snippet:
  frontend/lib/src/components/Bar.tsx:42:5
  error TS2322: Type 'string' is not assignable to type 'number'.

Proposed Fix:
  Change type annotation or fix the value type

─────────────────────────────────────────────────────────────────

Would you like me to:
  [1] Apply the fix automatically
  [2] Show the proposed changes first
  [3] Run local verification only
  [4] Skip this and move to next failure

8. Apply Fix & Verify Locally

After user approval, apply fix and run verification:

# Run all checks (lint, types, tests) on changed files
make check

# Python tests (specific)
uv run pytest lib/tests/path/to/test_file.py::test_name -v

# Frontend tests (specific)
cd frontend && yarn test path/to/test.test.tsx

# E2E tests
make run-e2e-test {test_file.py}

# E2E snapshots
make update-snapshots

9. Summary & Push

git status --short
git diff --stat

Report what failed, what changed, and local verification result.

git add -A
git commit -m "fix: resolve CI failure in {workflow/step}"
git push

10. Recheck CI Status

gh pr checks --watch
# Or re-run failed jobs
gh run rerun {RUN_ID} --failed

Rules

  • Focus on root cause: First error, not cascading failures
  • Minimal fixes: Smallest change that fixes the issue
  • Don't skip tests: Never disable tests to "fix" CI
  • Verify locally: Always run appropriate local command
  • Preserve intent: Understand what code was trying to do

Error Handling

IssueSolution
Auth failedgh auth login with workflow/repo scopes
No PR for branchgh run list to check workflow runs
CI still runninggh pr checks --watch
Logs pendingRetry with job logs API
No failed checksAll passing ✅
Rate limitedWait and retry
Flaky testRe-run: gh run rerun {RUN_ID} --failed

来自 streamlit 的更多技能

developing-with-streamlit
streamlit
**[必需]** 用于所有Streamlit任务:创建、编辑、调试、美化、样式化、主题化或优化Streamlit应用。同样必需…
official
addressing-pr-review-comments
streamlit
处理当前分支在streamlit/streamlit仓库中PR上的所有有效审查评论,涵盖内联审查评论和一般PR(问题)评论……
official
checking-changes
streamlit
在提交前通过运行格式化、代码检查、类型检查和单元测试来验证所有代码变更。在完成后端(Python)或前端(TypeScript)修改后使用。
official
discovering-make-commands
streamlit
列出Streamlit开发中可用的make命令。用于构建、测试、代码检查或格式化任务。
official
finalizing-pr
streamlit
通过简化代码、运行检查、审查变更并在需要时创建PR,最终确定分支变更以进行合并。在准备将变更合并到……时使用。
official
fixing-flaky-e2e-tests
streamlit
诊断并修复不稳定的Playwright端到端测试。当测试间歇性失败、出现超时错误、快照不匹配或表现出浏览器特定问题时使用…
official
generating-changelog
streamlit
在两个git标签之间生成用于docs.streamlit.io的精美网站发布说明。在准备新的Streamlit版本或审查变更时使用…
official
improving-frontend-coverage
streamlit
运行前端单元测试并生成覆盖率报告,分析覆盖率报告,并实施有意义的测试以将覆盖率提升约0.2%。当你想要……时使用。
official