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 }}
-
確認方法
- developブランチから、適当なtopicブランチを作成する
- 適当なtopicブランチで、適当なコード(今回はb.py)編集(フォーマットを崩す)
- commit & push
- github上でプルリク生成
- 適当なtopicブランチ→developにmerge
- アクションが走る
- developブランチのb.pyが、コード整形された状態でpushされている
-
developブランチのコミット履歴
lastly
今回はtopicブランチ→developブランチを想定して行いましたが、develop→mainも同様です
また、このケースだと、main or developブランチにダイレクトコミットした場合もactionsが走ります