LoginSignup
0
1

More than 3 years have passed since last update.

python codeの自動整形をするアクションを作ってみた

Last updated at Posted at 2021-01-20

Why

  • チーム開発をしていると、コードフォーマットの差が大きい
    • やる人もいれば、やらない人もいる
    • フォーマッタが異なる
  • コード整形のみのコミットを入れたくない
  • 開発者に手間を掛けさせず、且つローカル環境の依存をなくしたい

    • black, autopepなどのライブラリをローカル環境に依存したくない
    • vscodeやemacsなどエディタに依存したくない
  • github actionsを触ってみたかった

    • 初めてのお題としては丁度いいと思った

What

  • 作ったもの
    • 所定のbranchにpushした時に、所定(今回の例だと、workspace/python以下)の*.pyコードをサーチし、対象となったpythonファイルにblackによるコード整形を実行する
    • プルリク→マージも想定して、マージ先のブランチにマージされた時にも、上記コード整形を実行する
    • リポジトリ
  • 前提
    • コード整形にはblackを用いる
    • ブランチは適当に、main/developの2つ
  • ディレクトリ構成
    • code-format.ymlが今回のアクションの中身
├─.github
│  └─workflows
│          code-format.yml
│
└─python
    │  pyproject.toml
    │
    └─source
            a.py
            b.py

How

  • code-format.ymlは以下のようにしました
code-format.yml
name: python auto code format

on:
  push:
    branches: 
      - main
      - develop
    paths:
      - 'python/**'

  workflow_dispatch:

jobs:
  black:
    name: Check code style with Black
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./python
    steps:    
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up Python 3.6.8
        uses: actions/setup-python@v2
        with:
          python-version: 3.6.8
      - name: Install black
        run: pip install black
      - name: run code format
        run: find . -type f -name "*.py" | xargs black
      - name: git settings
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
      - name: Extract branch name
        id: extract_branch
        run: echo "##[set-output name=BRANCH_NAME;]$(echo ${GITHUB_REF#refs/heads/})"
      - name: commit
        run: git commit -m "python modules changed auto format." -a || echo "No changes to commit."
      - name: push
        run: |
          echo target branch is ${{ steps.extract_branch.outputs.BRANCH_NAME }}
          git pull
          git push origin ${{ steps.extract_branch.outputs.BRANCH_NAME }}

  • 確認方法

    1. developブランチから、適当なtopicブランチを作成する
    2. 適当なtopicブランチで、適当なコード(今回はb.py)編集(フォーマットを崩す)
    3. commit & push
    4. github上でプルリク生成
    5. 適当なtopicブランチ→developにmerge
    6. アクションが走る
    7. developブランチのb.pyが、コード整形された状態でpushされている
  • actionsの様子
    image.png

  • developブランチのコミット履歴

    • ちょっとわかりにくいですが以下、github actionsがコミットした履歴が残っており、きれいにフォーマットされているのが確認できます image.png

lastly

今回はtopicブランチ→developブランチを想定して行いましたが、develop→mainも同様です
また、このケースだと、main or developブランチにダイレクトコミットした場合もactionsが走ります

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