Github ActionsによるPythonのコード整形とコミットを自動化
背景
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 に怒られてから自分で修正するのが面倒臭い方にはおすすめの方法です。
「もっと良い方法があるよ」という方はコメントに書いていただけると非常にありがたいです。
Discussion