🍰

Github ActionsによるPythonのコード整形とコミットを自動化

2021/03/30に公開

背景

Pythonで開発している時、何らかのコードフォーマッター(blackとかyapfとかautopep8とか)を利用していることが多いと思います。
そして、おそらく皆さんいろいろなタイミングや方法でコードフォーマッターを実行しているはずです。

  • コミット前に手動で実行
  • pre-commitで設定しておいてコミット前に問題ないかチェックして怒られたらコードフォーマッターを実行して再度commit
  • リポジトリにpushしてからCIに整形ができていないと怒られてからコードフォーマッターを実行して再度push

この記事は上記のどれも毎回コードフォーマッターで整形しなきゃいけないので面倒臭い or コードフォーマッターを実行するの忘れがちだと思った方向けにGithub Actionsにコード整形とそのコード整形後のコミットを丸投げするための方法を書いた記事になります。

パッケージ管理

この記事ではPoetryを利用します。
Poetryのインストール方法についてはここを参考にしてください。

この記事で利用するフォーマッター

以下の2つのフォーマッターを利用していることを想定しています。

  • black
  • autoflake8

ちなみに本記事で紹介する方法はこの2つじゃないと行えないわけではなく、該当箇所を別のコードフォーマッターに差し替えれば別のコードフォーマッターでも問題ないです。

自動コミットを実現するツール

本記事ではstefanzweifel/git-auto-commit-actionというツールを活用します。

このツールはGithub Actions の workflow の yamlファイルに以下のように書けば利用できます。

- uses: stefanzweifel/git-auto-commit-action@v3.0.0
    with:
      commit_message: Apply Code Formatter Change
      ref: ${{ github.head_ref }}

commit_message や ref の他にも push するブランチを指定したり、commit や push 時の引数を指定できたりもします。
詳しくはstefanzweifel/git-auto-commit-actionに記載があるので、そちらを確認してみましょう。

実際に Github Actions でコード整形とコミットを自動化

では、このツールを使って実際にGithub Actionsでコミットを自動化してみましょう。
今回は Github Actions の設定ファイルを以下2パターン用意しています。

  • push された時に自動でコードを整形 & コミットを行う
  • Pull Request がクローズされた時に自動でコードを整形 & コミットを行う

それぞれメリット・デメリットがあるので、場合によって使い分けてください。

push された時に自動でコードを整形 & コミットを行う

こちらはmasterブランチのコミットログを汚したくない方にお勧めの方法です。

メリット

Pull Request に追加でコミットした時にコードフォーマッターが走るため、Pull Request の時に切ったブランチ内にコミットログが増える。これにより Squash and Merge すればmasterブランチがコミットログで汚れない。
ただし、master に直接 push すると汚れてしまうため、注意が必要。

デメリット

プルリクエストにコミットを追加で push するとき、git push -f をするか、もしくは、git pull してから git push する必要があります。

name: sample_ci

on:
  push:

jobs:
    formatter:
        name: formatter
        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 }}
          - name: Install Poetry
            run: |
              curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
          - name: Add path for Poetry
            run: echo "$HOME/.poetry/bin" >> $GITHUB_PATH
          - name: Install Dependencies
            run: poetry install --no-interaction
          - name: black
            run: poetry run black .
          - name: autoflake
            run: poetry run autoflake -r .
          - uses: stefanzweifel/git-auto-commit-action@v3.0.0
            with:
              commit_message: Apply Code Formatter Change
              ref: ${{ github.head_ref }}

Pull Request がクローズされた時に自動でコードを整形 & コミットを行う

こちらはmasterブランチのコミットログは汚れても良いのでとにかく楽がしたい人におすすめです。

メリット

プルリクエストにコミットを追加で push するとき、git push -f をするか、もしくは、git pull してから git push などの手間のかかる作業が不要になる。

デメリット

Pull Request がマージされた先にコミットされるので、マージ先のコミットログが汚れやすいです。

name: sample_ci

on:
    pull_request:
        types: [closed]

jobs:
    formatter:
        name: formatter
        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 }}
          - name: Install Poetry
            run: |
              curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
          - name: Add path for Poetry
            run: echo "$HOME/.poetry/bin" >> $GITHUB_PATH
          - name: Install Dependencies
            run: poetry install --no-interaction
          - name: black
            run: poetry run black .
          - name: autoflake
            run: poetry run autoflake -r .
          - uses: stefanzweifel/git-auto-commit-action@v3.0.0
            with:
              commit_message: Apply Code Formatter Change
              ref: ${{ github.head_ref }}

終わりに

Github Actions を使ったコード整形とコミットの自動化の方法を2パターン紹介しました。
手動で行っているためコードの整形を忘れがちだったり、CI か pre-commit に怒られてから自分で修正するのが面倒臭い方にはおすすめの方法です。
「もっと良い方法があるよ」という方はコメントに書いていただけると非常にありがたいです。

参考文献

GitHub にコード整形してもらおう - GitHub Actions でコード整形&コミット

Discussion