running-ci-preflight について
PostHog のコントリビューター向けに、プッシュ前の CI を確認するスキルです。`hogli ci:preflight` は変更ファイルに応じたチェックを選び、CI 全体の実行前に失敗、警告、助言を報告します。
主な機能
- 01変更範囲に応じたチェック
- 02フォーマットと安全な自動修正
- 03ブランチの鮮度チェック
- 04JSON 出力オプション
- 05Semgrep とスナップショットの助言
活用シーン
- 01プッシュ前のブランチ確認
- 02プッシュ前フックの指摘事項の修正
- 03機械可読なチェック結果の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ posthog/ posthog --skill running-ci-preflightインストール後、Claude Code で/running-ci-preflightを入力して読み込まれたか確認します。
詳細
ci:preflight の実行
hogli ci:preflight は、厳選された一連のチェックを、ブランチが変更したファイルに限定して実行します — 各チェックは、master を落としてきた CI 障害クラスに対応付けられており、さらに常時有効なブランチ鮮度チェックも含まれます。これは hogli ci:insights(master で すでに 壊れているもの)に対する、プッシュ前のカウンターパートです。
pre-push フックは ci:preflight --strict を自動的に実行し、チェックが失敗するとプッシュをブロックします。
--no-verify で決してバイパスしないでください — 代わりに、報告された内容を修正してください。
ループ(フックがブロックしたとき、または完了を報告する前)
hogli ci:preflight --fix
--fixを付けて実行します — 安全な範囲でフォーマット、リント、自動修正を行います。- 各行を読みます:
✓ pass、✗ fail、⚠ warning(ブロックしない指摘)、→ advisory(自分で対応する)、· skipped(機能が存在しない)。 - すべての
✗ failを解消します — これらは--fixでは対応できなかったものです(実際のリントエラー、壊れたロックファイル、マイグレーションの競合)。これらはプッシュをブロックします。 - すべての
→ advisoryに対応します — たとえばopenapiの advisory →hogli build:openapiを実行してドリフトをコミットする、stalenessの advisory →git merge origin/master。advisory は決してブロックしませんが、無視すると障害が CI に届きます。プッシュする前にこれらを解消してください。自分が持ち込んでいないドリフトも含みます — プッシュするブランチの状態は自分の責任です。 - クリーンになるまで再実行し、その後プッシュします。
注意事項
- Strict = 失敗のみ。
--strict(フックが実行するもの)は✗ failの場合にのみ非ゼロで終了します。advisory はローカルでは検証できないクラスであるため、ブロックせずに警告を出します。クリーンな終了は「修正すべきものが何も残っていない」という意味であり、「CI が通る」という意味ではありません。CI が引き続き正式なゲートです。ブロックしないのは仕組み上の制約であり、スキップしてよいという許可ではありません。 type-checkは促しであり、実行ではありません。 CI に一致するのはリポジトリ全体の mypy 実行だけであり(mypy はインポートを辿るため、変更ファイルのサブセットでは逆依存関係の破損を見逃します)、それをコールドで実行すると数分かかります。毎回のプッシュに課すには負担が大きすぎます。そこで preflight はコマンドを実行せず、名前を示すだけにしています。あなたの変更が型に関するリスクがあるかどうかを判断し、自分で実行してください。CI は同じコマンドでブロックするため、ここでスキップした型エラーはフルの再実行として戻ってきます。complexityは警告のみです。 変更ファイル内の循環的複雑度が 10 を超えると⚠ warningとして表示され、決してブロックしません。CI も同じ警告を注釈として付け、CI レポートのコメントに投稿します。数値をごまかすのではなく、次にその関数に触れるときに簡素化してください。semgrep-devexはあなたのブランチが導入した検出事項について助言します。 変更ファイルとそのマージベースのコピーを 15 秒の予算内でスキャンします。どちらのスキャンも.github/workflows/ci-security.yamlでSEMGREP_IMAGEが固定するキャッシュ済みバージョンを使用し、ネットワークアクセスは無効化されています。ツールが見つからない場合はスキャンをスキップし、バックグラウンドでダウンロードを開始するため、次回の実行でスキャンされます。クラウドタスクや CI ジョブはそのダウンロードを開始しません。そこではネットワークアクセスを有効にしてhogli ci:preflight --prepare-semgrepを実行してください。不完全なスキャンは理由を付けてスキップされます。master にすでにある検出事項は報告されません。CI は新しい検出事項でブロックするため、プッシュする前に修正してください。advisory はそのルールを表示するコマンドを出力します。snapshot-baselinesは、frontend/snapshots.ymlがあなたのブランチで変更していないストーリーのエントリを失ったときに助言します。 これはマージコンフリクトの解決を誤ったときの症状です。ストーリーがまだレンダリングされる場合、マージキューはそのファイルを含むバッチを失敗させます。チェックが出力するgit diffを実行し、削除するつもりのなかったエントリを復元してください。同じブランチで削除、名前変更、タイトル変更したストーリーのエントリは通ります。merge-queue-laneは警告のみで、pre-push フックはこれをスキップします。 いくつかの横断的なファイル(CI ワークフロー、レーンスクリプト)によって PR 全体がすべてのマージキューレーンを主張し、その結果キューがその PR の後ろで直列にマージされる場合に発火します。他の変更がそれらのファイルを必要としない場合は、それらを独自の PR に移動してください。- Staleness はリスクベースです。 今 master をマージすると実際に何かが壊れる場合に発火します。つまり、テキスト上のマージコンフリクト(
git merge-treeで計算、ワーキングツリーはそのまま)、両側で追加されたマイグレーション、両側で変更された生成ファイルの入力、または master で変更された CI ワークフローに加えて、behind/age のバックストップがあり、デフォルトでは積極的です(5 コミット / 2 日、環境変数HOGLI_PREFLIGHT_STALE_COMMITS/HOGLI_PREFLIGHT_STALE_DAYSで調整可能)。これは最初は過剰に警告し、テレメトリから調整していくためです。発火したら master をマージしてください。助言のみで、自動マージは決してされません。 · skipped (needs …)はベアチェックアウトやサンドボックスでは想定内です。needs stack/needs clickhouseは実行中の dev スタック(hogli start)を、needs nodeはpnpm installを、needs desktop-nodeはpnpm --dir products/desktop installを、needs agent-nodeはpnpm --dir packages/agent installを必要とし(どちらのネストされたワークスペースもルートのインストールから除外されており、独自のロックファイルを持ちます)、needs python-envはuv syncを必要とするため、同期されたプロジェクト環境が PATH 上のpythonになります。できるものは満たすか、残りは CI に任せてください。あなたの環境にフックがありません(node_modulesがない)か? プッシュする前に自分でループを実行してください。- フラグ。
--against <ref>は明示的なベースと差分を取ります。--jsonは機械可読なサマリーを出力します。 - キルスイッチ。
HOGLI_PREFLIGHT_DISABLED=1はコマンド(およびフック)を終了コード 0 の no-op にします。これはロールアウト/緊急用のレバーです。尊重してください。実行を強制するために unset しないでください。
なぜ重要か
ドラフトはすでに CI の一部を絞り込んで実行しています。無駄にコストがかかるのは、準備が整った PR が決定論的な問題でフルマトリクスに失敗し、修正されたうえでマトリクス全体を再実行するケースです。これをローカルで捕捉することが、最も低コストな CI の節約になります。
コメント
Markdown 対応