Open3

pre-commit

豚&紙箱豚&紙箱

Geminiに聞いてみた

https://g.co/gemini/share/f72970565361

GitHub の Pull Request で pre-commit.ci チェックに遭遇する理由

疑問:なぜ自分のリポジトリに設定していない pre-commit.ci が、Pull Request で実行されるのか?

GitHub でオープンソースプロジェクトに貢献する際、自分のリポジトリで設定していないにもかかわらず、Pull Request を送った後に pre-commit.ci という自動チェックが実行され、エラーが発生することがあります。特に、対象のリポジトリのページを見ても「Actions」タブが見当たらず、なぜチェックが走るのか不思議に感じるかもしれません。

これは、GitHub Actions の一般的な使い方とは異なる、pre-commit.ci という外部サービスの仕組みによるものです。

回答:pre-commit.ci は GitHub と深く連携した独立したサービスである

pre-commit.ci は、リポジトリにコミットされたコードがプロジェクトの定めるコーディング規約やフォーマットに準拠しているかを自動でチェックするサービスです。このサービスは、GitHub の Pull Request イベントを自動で購読するように設計されています。

GitHub のリポジトリの管理者が pre-commit.ci を導入すると、GitHub の設定に特別な設定ファイルが追加されるわけではありません。その代わり、サービス自体がリポジトリに対する「フック」を設定し、Pull Request が作成されるたびに自動でチェックを実行します。

この仕組みは以下のように機能します。

  1. リポジトリの連携espnet/g2p のリポジトリ管理者が pre-commit.ci のウェブサイトで自身のプロジェクトを登録し、連携を許可します。
  2. イベントの監視pre-commit.ci サービスは、連携したリポジトリで Pull Request が作成されるイベントを監視します。
  3. チェックの実行:あなたの Pull Request が作成されると、このイベントを検知した pre-commit.ci が、自身のサーバー上で設定されたチェックを実行します。
  4. 結果の通知:チェックが完了すると、pre-commit.ci はその結果(成功または失敗)を GitHub の Checks API を通じて Pull Request に送信します。
  5. ステータスの表示:GitHub はこの結果を受け取り、あなたの Pull Request ページに「pre-commit.ci が失敗しました」といった形でステータスを表示します。

そのため、あなたが pre-commit.ci の実行を確認しても、リポジトリ内に /.github/workflows/ ディレクトリが存在しなかったり、「Actions」タブが見つからなかったりするわけです。このチェックは、リポジトリ内の .yml ファイルによって実行されるのではなく、外部サービスによって行われているからです。


解決策とベストプラクティス

この問題を解決するには、pre-commit.ci から提供されたエラーメッセージに従ってコードを修正する必要があります。

将来的に同じ問題を防ぐには、Pull Request を送る前に、ローカル環境でチェックを実行することが最も効果的です。

  1. pre-commit のローカルへのインストール

    pip install pre-commit
    pre-commit install
    

    これらのコマンドを実行すると、git commit を実行するたびに、プロジェクトの .pre-commit-config.yaml ファイルに基づいて自動でチェックが走るようになります。これにより、不適合なコードをコミットする前に問題を検知できます。

  2. 手動でのチェック
    pre-commit run --all-files コマンドを使用すると、いつでもすべてのファイルに対してチェックを手動で実行できます。

GitHub の Pull Request チェックが失敗した場合でも、それはあなたのコードがまだマージするには不十分であることを教えてくれる良い機会です。このチェックをうまく利用することで、より品質の高い貢献が可能になります。

豚&紙箱豚&紙箱

pre-commitをインストールし、以下の.pre-commit-config.yamlファイルをリポジトリに作成しました。

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

その後、pre-commit run --all-fileを実行しました。それでまた空白と改行に関するエラーが出ます。
それらのエラーを修正するために、pre-commitは関連のファイルを自動的に修正します。
その後、もう一回pre-commit run --all-fileを実行したら、検査は全部通りました。