背景
特定組織の定期 crawl が毎時間失敗していた。原因は削除済みリポジトリが登録に残っていたこと。
GitHub GraphQL API が repository: null を返すが、現在のコードでは適切に処理できていない。
問題点
1. paginateGraphQL が repository: null とページング空結果を区別できない
extractConnection が null を返す場合、現在はページサイズ縮小ループに入る。しかし repository 自体が null の場合はページサイズを変えても解決しないため、無駄にリトライした後 min page size でエラーになる。
- 該当箇所:
batch/github/fetcher.ts L806-824
2. 1リポの失敗で crawl ジョブ全体が止まる
per-repo の for ループ内で throw すると残りのリポが処理されない。
- 該当箇所:
app/services/jobs/crawl.server.ts L69 の for ループ
3. エラーメッセージにリポ名が含まれない
pullrequestList(): empty response at min page size 10 (cursor: null) だけでは、どのリポで失敗したか特定できない。
改善案
extractConnection の戻り値で connection 自体が null(リポ不在)と nodes が null(空ページ)を区別し、リポ不在は即座に明確なエラーメッセージで throw する
- crawl の per-repo ループでエラーをキャッチし、失敗リポをスキップして他のリポの処理を継続する(失敗情報は output に含める)
- エラーメッセージに
owner/repo を含める
背景
特定組織の定期 crawl が毎時間失敗していた。原因は削除済みリポジトリが登録に残っていたこと。
GitHub GraphQL API が
repository: nullを返すが、現在のコードでは適切に処理できていない。問題点
1.
paginateGraphQLがrepository: nullとページング空結果を区別できないextractConnectionが null を返す場合、現在はページサイズ縮小ループに入る。しかしrepository自体が null の場合はページサイズを変えても解決しないため、無駄にリトライした後 min page size でエラーになる。batch/github/fetcher.tsL806-8242. 1リポの失敗で crawl ジョブ全体が止まる
per-repo の for ループ内で throw すると残りのリポが処理されない。
app/services/jobs/crawl.server.tsL69 の for ループ3. エラーメッセージにリポ名が含まれない
pullrequestList(): empty response at min page size 10 (cursor: null)だけでは、どのリポで失敗したか特定できない。改善案
extractConnectionの戻り値で connection 自体が null(リポ不在)と nodes が null(空ページ)を区別し、リポ不在は即座に明確なエラーメッセージで throw するowner/repoを含める