7rikazhexde’s tech log

技術的な興味関心、備忘録、アウトプットなどを書いています。

【GitHub Actions】定期実行/手動実行でpre-commitのConfigファイル(.pre-commit-config.yaml)を更新するワークフローについて

はじめに

  • 本記事は2024/12/01時点の情報です。また、Dependabot, GitHub Actions, pre-commitの説明は割愛します。詳細、および、最新情報は公式ドキュメントを確認してください。
  • 本記事に記載された内容やコードによって生じたいかなる損害についても責任を負いません。使用する際は自己責任でお願いします。

経緯

私は個人で作成したPythonのプロジェクトでpre-commitを使用してコミット前に構文チェックや修正をしています。また、依存ファイルについて、Dependabotで更新管理をしています。

Dependabotはpipのrequirement.txtやpythonのpyproject.tomlを元にリポジトリのバージョン差異を検出しますが、pre-commitでは、コマンド実行時に参照されるconfigファイル(.pre-commit-config.yaml)で各hookのバージョン情報を管理する仕様になっています。

そのため、pre-commitもdependabotで管理できると思っていたのですが、本記事作成時点ではサポートしていませんでした。

最新機能を毎回試すわけではないため、多くの場合は更新しなくてもpre-commitでエラーになることはありませんが、更新対象のhookは定期的に更新して反映したいと考えていました。

そこで、pre-commitの公式ドキュメントを調べてみたところ、hookのバージョン更新はpre-commit autoupdateコマンドで対応できることがわかりました。

本記事ではpre-commit autoupdateの情報とプロジェクトで使用する方法としてGitHub Actionsでの実行例を紹介します。

pre-commit autoupdateコマンドについて

pre-commit autoupdateコマンドはconfigファイル(.pre-commit-config.yaml)記載のhookについて、リポジトリのバージョン情報をチェックして更新するコマンドです。 実際のコマンドを実行するとrevキーが更新されます。

https://pre-commit.com/#pre-commit-autoupdate

configファイル(.pre-commit-config.yaml)を更新するワークフローについて

多くの場合、依存ファイルはDependabotやプロジェクトの更新(パッケージの更新)をトリガーにしてチェックすることが多いと思います。

前者はDependabotによるプルリクエスト、後者はローカルリポジトリでの更新です。管理の点でいえば、前者の方がプロジェクトの更新を管理しやすいです。

そこで、プルリクエストをトリガーにConfigファイル(.pre-commit-config.yaml)を更新する方法を検討しました。

以下にシーケンス図とコードを示します。

シーケンス図

update-precommit-hooks.puml

ワークフローのトリガー条件はcronコマンドによる定期実行と手動実行です。

dependabotによるプルリクエストをトリガーにすることも可能ですが対象にしていません。

dependabotでは、pre-commitのconfigファイル(.pre-commit-config.yaml)記載のhookの更新をチェックする機能がないことと、必ずしも依存ファイルとconfigファイルの両方で追加していないケースもあるためです。

手動実行は個別に実行したいこともあるので追加しています。

ワークフローではプロジェクトのセットアップでpoetryを使用していますが、他のパッケージ管理ツールを使用している場合は置き換えれば使用できます。

また、configファイル(.pre-commit-config.yaml)をpre-commit autoupdateコマンドで更新した後は、pytestコマンドのstepを実行して更新によるテストへの影響をチェックします。

もし、カバレッジが90以下であれば、configファイル(.pre-commit-config.yaml)はコミットされません。pre-commit autoupdateで更新がなければコミットせずに終了します。これらはhas_updates変数で制御しています。

注意事項として、ワークフローではcommitとpushを実行するのにrepo権限追記のPATの設定しています。下記を参考にプロジェクトに合わせて設定してください。

docs.github.com

コード

ワークフロー実行結果

json2vars-setterというプロジェクトで実際に動かしている実行例を示します。

github.com

ワークフロー実行結果例(Step: Update pre-commit hooks / Commit changes)

上記は定期実行時のキャプチャですが、更新がある場合は、configファイル(.pre-commit-config.yaml)を更新後にpytest実行して、その結果でカバレッジが90%以上であるため、configファイルをcommitしてpushしています。

まとめ

pre-commit autoupdateの情報とプロジェクトで使用する方法としてGitHub Actionsでの実行例を紹介しました。

以下記事では、Poetryで管理するパッケージ情報(pyproject.toml, requirements.txt)をDependabotとGitHub Actionsを使用してメンテする方法について、の記事も投稿していますので確認してみてください。

7rikazhexde-techlog.hatenablog.com

これらのワークフローを使用することでプロジェクトをより管理しやすくなると思います。

以上です。