ci-job-analysis
1
总安装量
1
周安装量
#44704
全站排名
安装命令
npx skills add https://github.com/penkzhou/swiss-army-knife-plugin --skill ci-job-analysis
Agent 安装分布
mcpjam
1
claude-code
1
windsurf
1
crush
1
cline
1
Skill 文档
CI Job åæç¥è¯åº
æ¬ç¥è¯åºæä¾ GitHub Actions Job 失败åæåä¿®å¤çä¸ä¸ç¥è¯ã
失败类ååç±»ä½ç³»
1. æµè¯å¤±è´¥ (test_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| unit_test | 45% | pytest FAILED, jest FAIL, vitest | æ¯ |
| integration_test | 30% | integration, api test, mock server | æ¯ |
| snapshot_test | 15% | snapshot, toMatchSnapshot | æ¯ |
| other_test | 10% | å ¶ä»æµè¯æ¡æ¶ | é¨å |
注æï¼é¢çæ°æ®åºäºåå²ç»è®¡ï¼æ»å为 100%ã
å¸¸è§æ ¹å ï¼
- Mock æ°æ®ä¸å®æ´ï¼æµè¯ mock ç¼ºå°æ°å¢å段
- API å¥çº¦åæ´ï¼æ¥å£è¿åæ ¼å¼æ¹å
- 弿¥æ¶åºé®é¢ï¼await ç¼ºå¤±ææ¶åºé误
- ç¯å¢å·®å¼ï¼CI ç¯å¢ä¸æ¬å°ç¯å¢ä¸ä¸è´
ä¿®å¤çç¥ï¼
1. å®ä½å¤±è´¥æµè¯åæè¨
2. æ¯è¾ææå¼ vs å®é
å¼
3. è¿½è¸ªæ°æ®æµå°æºå¤´
4. æ´æ° mock æä¿®å¤æè¨
5. éªè¯ä¿®å¤
2. E2E 失败 (e2e_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| timeout | 35% | Timeout, 30000ms, waiting for | æ¯ |
| selector | 30% | strict mode, not found, resolved to | æ¯ |
| assertion | 20% | expect().toHave, toBeVisible | æ¯ |
| network | 15% | Route handler, net::ERR | é¨å |
å¸¸è§æ ¹å ï¼
- éæ©å¨è¿æ¶ï¼UI 忴坼è´éæ©å¨å¤±æ
- å è½½æ¶åºï¼é¡µé¢å è½½æ ¢å¯¼è´è¶ æ¶
- ç½ç»æ¦æªå¤±æï¼API mock æªæ£ç¡®é ç½®
- ç¶ææ±¡æï¼æµè¯ä¹é´ç¶ææªé离
ä¿®å¤çç¥ï¼
1. åæè¶
æ¶/éæ©å¨é误çå
·ä½ä½ç½®
2. æ£æ¥ UI æ¯å¦åæ´
3. æ·»å éå½ççå¾
çç¥
4. æ´æ°éæ©å¨ææè¨
3. æå»ºå¤±è´¥ (build_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| typescript | 45% | tsc, error TS, compile | é¨å |
| webpack | 20% | webpack, Module not found | é¨å |
| python | 20% | SyntaxError, ModuleNotFound | é¨å |
| other | 15% | build failed, make error | å¦ |
å¸¸è§æ ¹å ï¼
- ç±»åä¸å¹é ï¼TypeScript ç±»åé误
- 缺失ä¾èµï¼import çæ¨¡åä¸åå¨
- è¯æ³é误ï¼ä»£ç è¯æ³é®é¢
- é ç½®éè¯¯ï¼æå»ºé ç½®ä¸æ£ç¡®
4. Lint 失败 (lint_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| eslint | 50% | eslint, @typescript-eslint | æ¯ |
| ruff | 25% | ruff, E501, W503 | æ¯ |
| prettier | 20% | prettier, formatting | æ¯ |
| other | 5% | mypy, pylint | é¨å |
å¿«éä¿®å¤è·¯å¾ï¼
# ESLint
npx eslint --fix {files}
# Ruff
ruff check --fix {files}
# Prettier
npx prettier --write {files}
5. ç±»åæ£æ¥å¤±è´¥ (type_check_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| typescript | 70% | tsc –noEmit, error TS | é¨å |
| mypy | 30% | mypy, type: ignore | é¨å |
常è§é误类åï¼
| é误ç | æè¿° | èªå¨ä¿®å¤ |
|---|---|---|
| TS2345 | åæ°ç±»åä¸å¹é | å¦ |
| TS2322 | ç±»åèµå¼é误 | å¦ |
| TS2339 | 屿§ä¸åå¨ | å¦ |
| TS7006 | éå¼ any | æ¯ |
6. ä¾èµå¤±è´¥ (dependency_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| npm | 40% | npm install, ERESOLVE | å¦ |
| pip | 35% | pip install, requirement | å¦ |
| yarn | 15% | yarn, resolution | å¦ |
| other | 10% | pnpm, poetry | å¦ |
常è§é®é¢ï¼
- çæ¬å²çª
- ç§æå 认è¯å¤±è´¥
- ç½ç»é®é¢
- éæä»¶è¿æ¶
建议ï¼ä¾èµé®é¢é常éè¦æå¨å¤çï¼å 为æ¶åçæ¬çç¥å³çã
7. é 置失败 (config_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| env | 50% | env, secret, KEY_ERROR | å¦ |
| permission | 30% | permission denied, 403 | å¦ |
| config_file | 20% | config, settings | å¦ |
ä¸å¯èªå¨ä¿®å¤åå ï¼æ¶åææä¿¡æ¯åæéé ç½®ï¼éè¦äººå·¥å¤çã
8. åºç¡è®¾æ½å¤±è´¥ (infrastructure_failure)
| åç±»å | é¢ç | å ³é®ä¿¡å· | å¯èªå¨ä¿®å¤ |
|---|---|---|---|
| runner | 40% | runner, self-hosted | å¦ |
| resource | 35% | OOM, killed, disk | å¦ |
| network | 25% | network, timeout | å¦ |
ä¸å¯èªå¨ä¿®å¤åå ï¼æ¶å CI åºç¡è®¾æ½ï¼éè¦è¿ç»´å¤çã
置信度è¯ä¼°ä½ç³»
è¯åå ç´
| å ç´ | æé | æè¿° |
|---|---|---|
| ä¿¡å·æç¡®æ§ | 40% | éè¯¯ä¿¡å·æ¯å¦æ¸ æ°æç¡® |
| æä»¶å®ä½ | 30% | æ¯å¦è½å®ä½å°å ·ä½æä»¶åè¡å· |
| 模å¼å¹é | 20% | æ¯å¦å¹é å·²ç¥éè¯¯æ¨¡å¼ |
| ä¸ä¸æå®æ´ | 10% | æ¯å¦æå®æ´çå æ 追踪 |
置信度éå¼
| åæ° | çº§å« | è¡ä¸º |
|---|---|---|
| >= 80 | é« | èªå¨ä¿®å¤ |
| 60-79 | ä¸ | 询é®ç¨æ·åä¿®å¤ |
| 40-59 | ä½ | å±ç¤ºåæï¼å»ºè®®æå¨ |
| < 40 | æä½ | è·³è¿ |
ç½®ä¿¡åº¦è°æ´è§å
æåæ¡ä»¶ï¼
- æ¾å°é«ç¸ä¼¼åº¦å岿¡ä¾ï¼+10
- 宿´çå æ 追踪ï¼+5
- æç¡®ç代ç åæ´ç¹ï¼+5
- å¹é å·²ç¥é误模å¼ï¼+5
é使¡ä»¶ï¼
- æ¶åå¤ä¸ªä¸ç¸å ³æä»¶ï¼-10
- éè¯¯æ¶æ¯æ¨¡ç³ï¼-10
- æ æ³å®ä½å ·ä½åå ï¼-15
- å¯è½æ¶åé ç½®/æéï¼-20
ææ¯æ è¯å«
åºäºæä»¶è·¯å¾
backend:
patterns:
- "**/*.py"
- "tests/backend/**"
- "tests/unit/**"
- "src/api/**"
- "app/**"
signals:
- "pytest"
- "FastAPI"
- "Django"
- "Python"
frontend:
patterns:
- "**/*.tsx"
- "**/*.jsx"
- "**/*.ts"
- "tests/frontend/**"
- "src/components/**"
signals:
- "jest"
- "vitest"
- "React"
- "Vue"
e2e:
patterns:
- "e2e/**"
- "tests/e2e/**"
- "playwright/**"
- "cypress/**"
signals:
- "playwright"
- "cypress"
- "puppeteer"
æ··åææ¯æ å¤ç
彿£æµå°å¤ä¸ªææ¯æ æ¶ï¼
- æé误æ°éç¡®å®ä¸»è¦ææ¯æ
- æ¬¡è¦ææ¯æ ä½ä¸º
secondary_stack - ä¼å å¤çä¸»è¦ææ¯æ çé误
常è§é误模å¼åº
pytest é误模å¼
# æè¨å¤±è´¥
FAILED tests/test_xxx.py::test_name - AssertionError: assert X == Y
# å¼å¸¸æªæè·
FAILED tests/test_xxx.py::test_name - ExceptionType: message
# fixture é误
ERROR tests/test_xxx.py::test_name - fixture 'xxx' not found
# 导å
¥é误
ERROR tests/test_xxx.py - ModuleNotFoundError: No module named 'xxx'
jest/vitest é误模å¼
# æè¨å¤±è´¥
FAIL src/xxx.test.ts
â test name (123ms)
expect(received).toBe(expected)
# è¶
æ¶
FAIL src/xxx.test.ts
â test name (5001ms)
Timeout - Async callback was not invoked within 5000ms
# å¿«ç
§å¤±è´¥
FAIL src/xxx.test.ts
â test name
expect(received).toMatchSnapshot()
playwright é误模å¼
# è¶
æ¶
Error: locator.click: Timeout 30000ms exceeded.
waiting for locator('selector')
# éæ©å¨é®é¢
Error: locator.click: Error: strict mode violation:
locator('selector') resolved to 2 elements
# æè¨å¤±è´¥
Error: expect(locator).toBeVisible()
Locator expected to be visible
TypeScript é误模å¼
# ç±»åä¸å¹é
error TS2345: Argument of type 'X' is not assignable to parameter of type 'Y'
# 屿§ä¸åå¨
error TS2339: Property 'xxx' does not exist on type 'Y'
# éå¼ any
error TS7006: Parameter 'xxx' implicitly has an 'any' type
ä¿®å¤å·¥ä½æµæ å°
| 失败类å | ä¿®å¤æ¹å¼ | å ³è工使µ |
|---|---|---|
| test_failure (backend) | bugfix_workflow | /fix-backend |
| test_failure (frontend) | bugfix_workflow | /fix-frontend |
| e2e_failure | bugfix_workflow | /fix-e2e |
| lint_failure | quick_fix | ç´æ¥è¿è¡ lint –fix |
| type_check_failure | bugfix_workflow | å¯¹åºæ 工使µ |
| build_failure | bugfix_workflow | å¯¹åºæ 工使µ |
| dependency_failure | manual | æ |
| config_failure | manual | æ |
| infrastructure_failure | manual | æ |
å岿¡ä¾å¹é
ç¸ä¼¼åº¦è®¡ç®
def calculate_similarity(current, historical):
score = 0
# é误类åå¹é
(30%)
if current.failure_type == historical.failure_type:
score += 30
# æä»¶è·¯å¾å¹é
(25%)
file_overlap = len(set(current.files) & set(historical.files))
score += min(25, file_overlap * 5)
# éè¯¯æ¶æ¯ç¸ä¼¼ (25%)
message_similarity = text_similarity(current.error, historical.error)
score += message_similarity * 25
# ä¿®å¤æ¨¡å¼ç¸ä¼¼ (20%)
if current.suggested_fix_type == historical.fix_type:
score += 20
return score
é«ä»·å¼æ¡ä¾ç¹å¾
å¼å¾è®°å½ä¸ºå岿¡ä¾çä¿®å¤ï¼
- 置信度 >= 80
- ä¿®å¤æå
- ææç¡®çæ ¹å åæ
- å å«å¯å¤ç¨çä¿®å¤æ¹æ³
- æ¶å常è§é误模å¼