analyze-github-flake について
analyze-github-flake は、Flutter の GitHub イシューにある不安定なチェックを分析するスキルです。ビルドログを集めて失敗を種類別に整理し、ファイル変更や flutter/ 内の根本原因調査を行わずに概要をまとめます。
主な機能
- 01対象となる不安定なイシューの判定
- 02イシューやコメントからビルドリンクを抽出
- 03ビルドログの確認
- 04失敗の種類別分類
- 05ファイルを変更せず概要を提示
活用シーン
- 01不安定なイシューに関連する失敗ビルドの確認
- 02複数のビルドログにある失敗種別の集約
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ flutter/ flutter --skill analyze-github-flakeインストール後、Claude Code で/analyze-github-flakeを入力して読み込まれたか確認します。
詳細
Flake 分析の手順
ルール いかなるファイルも変更してはいけません。特定のチェックが不安定になる理由を分析するだけです。 確認するのは、イシュー本文と、追加のビルドへのリンクを含むコメントだけです。 フレークの解決を試みたり、flutter/ 内で根本原因を特定したりしてはいけません。何が起きているかを大まかにまとめ、失敗を種類ごとに分類してください。
失敗したビルドの一覧を収集し、ログを取得する
GitHub のイシュー URL は https://github.com/flutter/flutter/issues/ の形式です。issue-number は数字です。
次のコマンドを使って、イシューの情報を取得します:gh issue view <issue-number> --repo flutter/flutter --json=author,body,id,labels,number,state,title,url
たとえば、https://github.com/flutter/flutter/issues/174116 の情報を取得するには、次のコマンドを実行します:gh issue view 174116 --repo flutter/flutter --json=author,body,id,labels,number,state,title,url
この時点では、次の 2 つのケースが考えられます。
- fluttergithubbot が起票したイシューである
- タイトルが「<ci.yaml target> is X% flaky」の形式である
いずれかに該当する場合は、分析対象です。該当しない場合は、ここで処理を終了します。ユーザーがこのスキルの実行を直接依頼した場合は、そのイシューが GitHub のフレークボットによって起票されたものではないことをユーザーに伝えます。それ以外の場合は、以前の作業を続けます。
上記の条件を満たす場合、タイトルに不安定になっているチェックの名前が含まれています。また、本文には、そのチェックが失敗または不安定になったビルドへの URL が「Flaky builds:」の直後に、それぞれ 1 行ずつ記載されています。コメントも確認し、"login": "fluttergithubbot" によるコメントをすべて見つけて、そこからも URL を抽出してください(形式は同じで、先頭にフレークの例があり、「Flaky builds:」の見出しの直後に一覧全体が記載されています)。
特定の失敗に関する情報を得るには、イシュー本文にある URL のいずれかを使用します。
リンクは "https://ci.chromium.org/ui/p/flutter/builders/<bucket>/<check_name>/<buildNumber>/overview", の形式です。
例:https://ci.chromium.org/ui/p/flutter/builders/prod/Windows%20plugin_test/16247/overview の場合、prod が 、Windows%20plugin_test が <check_name>、16247 が です。
次のコマンドを実行して、 を使ってテストログのメタデータを取得します。
curl 'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds/GetBuild' \
-H 'accept: application/json' \
-H 'accept-language: en-US,en;q=0.9,es;q=0.8' \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'origin: https://ci.chromium.org' \
-H 'pragma: no-cache' \
-H 'priority: u=1, i' \
-H 'referer: https://ci.chromium.org/' \
-H 'sec-ch-ua: "Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: empty' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36' \
-H 'x-return-encrypted-headers: all' \
--data-raw '{"builder":{"project":"flutter","bucket":"<bucket>","builder":"<check_name>"},"buildNumber":<buildNumber>,"mask":{"fields":"id,builder,builderInfo,number,canceledBy,createdBy,createTime,startTime,endTime,cancelTime,status,statusDetails,summaryMarkdown,output,steps,tags,schedulingTimeout,executionTimeout,gracePeriod,ancestorIds,retriable"}}'
レスポンスの先頭にある )]}' の文字列は無視し、それ以降を JSON として扱います。
ログの内容を確認し、失敗の原因を特定します。
イシュー本文にある URL ごとに、これを行います。それぞれの失敗についてログを収集し、失敗の種類ごとに分類して概要をまとめます。