9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ZOZOAdvent Calendar 2022

Day 9

pre-commit と GitHub Actions で実行する flake8 と black の設定を共有する方法

Last updated at Posted at 2022-12-08

これは ZOZO Advent Calendar 2022 カレンダー Vol.2の9日目の記事です。昨日の投稿は @light0w0 さんの 「Vertex Piplinesのコンポーネントのスキップ処理」でした。

概要

pre-commitGithub Actions で実行する flake8 と black の設定を共有する方法を紹介します。
具体例としてPythonのリンタ・フォーマッタである flake8 と black を扱っていますが他の言語の様々な hook で応用可能です。

なぜ pre-commit と GitHub Actions で二重チェックするのか?

以下2つの理由から二重チェックを行なっています。

  • pre-commit を使う理由: 「コミットする前にリンタ・フォーマッタを自動実行することができ、開発者が意識せずともコミットするコードの健全性を保てるため」と「Github Actions などのCIでリンタ・フォーマッタを実行すると時間がかかり開発スピードが損なわれるため」
  • Github Actions を使う理由: pre-commit を設定し忘れた開発者のコードについても強制的にリンタ・フォーマッタを実行することができ、マージブロックなどでマージ先ブランチの健全性を保てるため。

二重チェックの注意点

Github Actions での flake8 と black の設定としては Flake8 actionBlack Check を利用することが考えられますが、これらでは pre-commit の flake8 と black などのオプション設定を共有することはできません。 もし pre-commit と GitHub Actions で実行するリンタ・フォーマッタの設定を共有することができないと Github Actions のリンタ・フォーマッタの設定とは異なる設定で pre-commit による自動フォーマットが実行されてしまいます。 このことによって Github Actions のチェックを通すことができず開発が止まってしまう可能性があります。

そこで下記では pre-commit はどういうものかを紹介するためにその使い方を簡単に説明した後に、pre-commit と Github Actions の設定を共有する方法を紹介します。

pre-commitの使い方

まず pre-commit を以下のようにpipでインストールします。

$ pip install pre-commit

そして、 pre-commit の設定ファイル .pre-commit-config.yaml をGitで管理するディレクトリ配下に作成します。具体例として flake8, black の .pre-commit-config.yaml の設定を以下に書いています。特にオプション設定として flake8 の args で1行あたりの文字数制限88文字(デフォルトは79文字だが black の文字数制限88文字に合わせる)を指定しています。

repos:
  - repo: https://github.com/ambv/black
    rev: "22.3.0"
    hooks:
      - id: black
        language_version: python3
  - repo: https://github.com/pycqa/flake8
    rev: "4.0.1"
    hooks:
      - id: flake8
        args: "--max-line-length=88"

そして、以下のコマンドを実行することで .pre-commit-config.yaml の設定を反映したリンタ・フォーマッタがコミット時に自動実行されます。

$ pre-commit install

pre-commit と Github Actions の設定を共有する方法

pre-commit と Github Actions の設定を共有する方法として pre-commit のコマンド実行を利用する方法を紹介します。pre-commit は自動実行だけでなく以下のコマンドで任意のタイミングで実行することが可能です。

pre-commit run --all-files

一方で、 Github Actions の設定ファイルではonで push などのトリガーを指定して、runで実行したいコマンドを設定することができます。 Github Actions の詳細設定は公式ドキュメントに譲りますが、以下の設定ファイルの概要のようにrunにコマンドpre-commit run --all-filesを指定することも可能です。これによって、Github Actions でも .pre-commit-config.yaml の設定を反映したリンタ・フォーマッタを自動実行することができます。

Github Actionsの設定ファイル概要
name: sample_ci

# push をトリガーとする
on:
  push:

jobs:
    lint-and-format:
        name: lint-and-format
        runs-on: ubuntu-latest
        strategy:
            matrix:
                python-version: [3.9.0]
        steps:
          - name: Checkout
            uses: actions/checkout@v2
          - name: Set up Python ${{ matrix.python-version }}
            uses: actions/setup-python@v2
            with:
              python-version: ${{ matrix.python-version }}
          # 依存関係を考慮したライブラリのインストールstepの記載は省略しています。
          # 実際にGithub Actionsを実行したい場合は適切に記入して下さい。
          # 以下、pre-commitの実行
          - name: Run pre-commit
            run: pre-commit run --all-files

備考

サンプルのPythonファイルを用意して上記の具体例で示した .pre-commit-config.yaml での pre-commit の実行確認を行いました。

pre-commit 実行前の sample.py
def sample(a, aa, aaa, aaaa, aaaaa, aaaaaa, aaaaaaa, aaaaaaaa, aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa):
    return
pre-commit 実行後の sample.py
def sample(
    a,
    aa,
    aaa,
    aaaa,
    aaaaa,
    aaaaaa,
    aaaaaaa,
    aaaaaaaa,
    aaaaaaaaa,
    aaaaaaaaaa,
    aaaaaaaaaaa,
):
    return

実行前は1行目が99文字記述されていましたが、上記のように期待通りフォーマットされていることを確認しました。

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?