4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オフグリッドAdvent Calendar 2024

Day 15

GitHubActionsでFormatter,Linter(black,flake8)を自動化

Posted at

black,flake8を使ってのpythonのコードの自動整形をGitHubActionsで動作させようと思い調べて、検証してみました

使用するもの

  • GitHubActions
    pushなどする際にテスト等を自動化できるGitHubの機能
  • black
    Pythonのコードフォーマッター。コードを保存時に自動的に整形してくれるツールです。コードを整形せずに検証だけすることも可能です
  • flake8
    Pythonコードの静的解析を行うためのツール。コードのエラーチェックやPEP8(Pythonのコーディング規約)に沿ってコードが書かれているかを検証してくれます
    flake8エラーコード
    pep8エラーコードチートシート

black,flake8はどちらもPEP8に沿ったコーディングを手助けしてくれるツールです

ワークフローの設定

code-check.yaml
name: Code Check

on:
  push:
    branches:
      - "**"

jobs:
  format:
      runs-on: ubuntu-latest
      steps:
        - name: Checkout code
          uses: actions/checkout@v4
        - name: Set up Python
          uses: actions/setup-python@v4
          with:
            python-version: "3.11"
        - name: Install dependencies
          run: |
            python -m pip install --upgrade pip
            pip install --no-cache-dir -r requirements.txt
        - uses: psf/black@stable
          with:
            options: "--verbose"
            src: "./"
       # もしくは
       # - name: Run Black
       #  run: black .
        - name: Commit changes
          uses: stefanzweifel/git-auto-commit-action@v4
          with:
            commit_message: "Black format applied"
        - name: Run Flake8
          run: flake8 .

■ jobs内の処理

actions/checkout:チェックアウトしてコードにアクセス

actions/setup-python:Pythonの環境をセットアップ

psf/black:Blackを使用するActions(@stableで最新の安定版Blackを使用できます)

psf/blackのパラメータ

  • 「options: "--verbose"」 optionを--verboseのみに指定しています
    (デフォルトだと--checkが設定されているためコードが整形されません)
    --verbose 除外パターンにより変更されなかったファイルまたは無視されたファイルに関するメッセージを出力します
  • 「src: "./"」 フォーマット対象のディレクトリを指定します

Black公式ドキュメント
psf/blackのパラメータ定義

psf/blackrun: black .はどちらもBlackを使用するものですがpsf/blackの方だとactions/setup-pythonなどの環境構築をしなくても使えます。

stefanzweifel/git-auto-commit-action:変更を自動的にコミットし、リポジトリにプッシュする

ワークフロー中に変更されたファイルを自動的にコミットし、リポジトリにプッシュするアクションです

stefanzweifel/git-auto-commit-actionのパラメータ

  • 「commit_message」 コミットメッセージを指定します
  • 「file_pattern」 コミット対象のファイルを絞り込むためのパターンを指定します(例: 「app/.py」「.py *.yaml *.md」など)

stefanzweifel/git-auto-commit-actionのパラメータ定義

run: flake8 .:flake8を実行してコードを検証

Blackで整形した後のコードをさらに検証しています

flake8のオプション
(例:flake8 main.py --ignore E402 E403 --max-line-length 100)

  • 「--ignore」 無視するerrorを指定します
  • 「--max-line-length」 1行あたりの最大文字数を指定します

flake8の使い方とオプション

run: black .:Blackを使用する

black,flake8の設定

どちらもルートディレクトリに設定ファイルを置いておけばGitHubActionsの際に読み込まれます

  • blackの場合
    pyproject.tomlファイルでの設定
pyproject.toml
[tool.black]
line-length = 120
include = '\.pyi?$'
exclude = '''
/(
    \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | _build
  | buck-out
  | build
  | dist
)/
'''

Black公式ドキュメント
blackのpyproject.toml

  • flake8の場合

1. .flake8ファイルでの設定

.flake8
[flake8]
max-line-length = 120
max-complexity = 10
exclude = tests/*
ignore=C901, E501

2. pyproject.tomlファイルでの設定
flake8はpyproject.tomlに対応していないので
pyproject-flake8を導入します

コマンドライン
pip install pyproject-flake8
pyproject.toml
[tool.flake8]
max-line-length = 120
max-complexity = 10
exclude = tests/*
ignore = "C901, E501"

flake8の使い方とオプション

両方使う場合は、pyproject.tomlファイルまとめてしまったほうが綺麗になると思います

実際に使って分かった注意点

コードがBlackで整形され、コミット、プッシュされた場合にはGitHubActionsの後にプルをしないとコンフリクトが起こる可能性があります

一旦、修正途中でGitHubにプッシュする(GitHubActions作動)

Blackでコードが整形される

気づかずにプルせずそのまま修正を進める

プッシュする際にコンフリクト発生

ということが起こりました

代替案

blackによる整形はローカルで実行し、GitHubActionsではチェックのみを行う

コマンドライン
black .

code-check.yaml
#- uses: psf/black@stable
#          with:
#            options: "--verbose"
#            src: "./"
# もしくは
# - name: Run Black
#  run: black .

- uses: psf/black@stable
  with:
    options: "--check --verbose"
    src: "./"
# もしくは
- name: Run Black
 run: black --check .

こちらの方がフォーマット以外の修正を邪魔することがないので良いかもしれません

参考にさせていただいた記事、サイト

4
0
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?