🎃

GitHub Actions で Python コードの自動フォーマットを実現しよう

2023/11/07に公開

はじめに

CI/CD(継続的インテグレーションと継続的デリバリー)は、ソフトウェア開発プロジェクトにおいて品質向上と効率化を実現するための不可欠な要素となっています。GitHub Actions は、GitHub リポジトリ内で CI/CD パイプラインを簡単に設定できるツールで、本記事ではその導入と設定について解説します。

GitHub Actions を採用するメリット

  • 簡単なセットアップ
    GitHub Actions は GitHub リポジトリとシームレスに統合されており、設定は YAML ファイルで定義するだけでワークフローを簡単にセットアップできます。複雑な環境設定や外部ツールの導入は不要です。

  • イベント駆動
    GitHub Actions はイベント駆動型で、リポジトリ内で発生するさまざまなイベント(プッシュ、プルリクエスト、リリースなど)に応じてワークフローをトリガーできます。これにより、特定のアクションが自動的に実行されるように設定できます。

  • カスタマイズ性
    GitHub Actions はカスタマイズ性が高く、さまざまなアクションやワークフローを組み合わせて複雑な自動化プロセスを作成できます。さらに、サードパーティのアクションやワークフローを共有することも可能です。

  • インフラストラクチャの管理不要
    GitHub Actions はクラウドベースで実行され、インフラストラクチャの管理が不要です。GitHub が実行環境を提供し、スケーリングや保守について心配する必要がありません。

GitHub Actions のファイルの構成

GitHub Actions を定義する YAML ファイルは次のような階層構造になっています。

.github/workflows/jobs.yml
name: learn-github-actions #ワークフローの名前
run-name: learning GitHub Actions # ワークフローの実行名を指定
on: [push] # ワークフローをトリガーするイベントを指定
jobs: # ジョブの定義を開始
  check-bats-version: # ジョブの名前を指定
    runs-on: ubuntu-latest # ジョブが実行されるランナーを指定
    steps: # ジョブ内のステップの定義を開始
      - uses: actions/checkout@v4 # リポジトリのチェックアウトを行うアクションを使用
      - uses: actions/setup-node@v3 # Node.js 環境のセットアップを行うアクションを使用
        with:
          node-version: "14" # Node.js のバージョンを指定
      - run: npm install -g bats # npm を使用してグローバルに `bats` パッケージをインストール
      - run: bats -v # インストールされた `bats` パッケージのバージョンを表示
  • ワークフロー
    GitHub Actions の設定ファイル(.github/workflowsディレクトリ内で定義)は、ワークフローをトリガーするトリガーイベントを指定します。これらのイベントには、プッシュ、プルリクエスト、タグの作成、スケジュール実行などが含まれます。設定ファイル内でどのイベントに反応するかを指定し、ワークフローのトリガー条件を定義します。

  • イベント
    ワークフロー実行をトリガーする、リポジトリ内の特定のアクティビティです。 たとえば、pull request が作成されたとき、issue が開かれたとき、またはリポジトリにコミットがプッシュされたときに、GitHub からアクティビティを発生させることができます。

  • ジョブとステップ
    設定ファイル内で、1 つ以上のジョブを定義できます。各ジョブは、実行する一連のステップで構成されます。ステップはコマンドやアクションを実行し、ジョブの目的を達成します。ジョブは並列に実行され、ステップは順次実行されます。

  • アクション
    アクションは、GitHub Actionsワークフローで実行されるカスタムアプリケーションやタスクです。これらのアクションは、ワークフロー内で再利用でき、独自のアクションを記述したり、GitHub Marketplace から提供されているアクションを利用できます。アクションは、複雑なタスクを効率的に実行するために使用され、設定ファイル内で uses フィールドを通じて指定します。

  • ランナー
    ランナーは、ワークフローがトリガーされると実行されるサーバーまたは実行環境です。GitHub Actionsはさまざまなランナーを提供し、主要なプラットフォームで動作します。例えば、Ubuntu Linux、Microsoft Windows、macOS ランナーがあります。ランナーはワークフロー内のジョブを実行し、必要な環境を提供します。ワークフローの設定ファイル内で runs-on フィールドを使用して、どのランナーでジョブを実行するかを指定します。

Pythonコードの自動フォーマットを実現する方法

  1. 自身のリポジトリで、ワークフロー ファイルを格納するための .github/workflows/ ディレクトリを作成します。

  2. .github/workflows/ ディレクトリで、check.yml という名前の新しいファイルを作成し、次のコードを追加します。

.github/workflows/check.yml
name: Format code # ワークフローの名前を指定

on: # トリガー条件を指定
  pull_request: # プルリクエストに反応
    types: [opened, synchronize] # プルリクエストがオープン、更新された場合にトリガー

jobs: # ジョブの定義を開始
  formatter: # ジョブ名を指定
    name: formatter # ジョブの名前
    runs-on: ubuntu-latest # Ubuntu Linux 上で実行
    strategy: # マトリクス戦略の設定
      matrix:
        python-version: [3.9] # Pythonバージョン3.9を指定
    permissions:
      contents: write # コンテンツに対する書き込み権限を設定
    steps: # ジョブ内のステップの定義を開始
      - name: Checkout Repository # リポジトリのチェックアウト
        uses: actions/checkout@v4 # GitHubリポジトリからコードをチェックアウト
        with:
          ref: ${{ github.head_ref }} # GitHubヘッドリファレンスを指定
      - name: Set up Python ${{ matrix.python-version }} # Python環境のセットアップ
        uses: actions/setup-python@v4 # Python環境のセットアップアクションを使用
        with:
          python-version: ${{ matrix.python-version }} # マトリクスで指定されたPythonバージョンを使用
      - name: Install Dependencies # 依存関係のインストール
        run: |
          python -m pip install --upgrade pip # pipをアップグレード
          pip install autoflake black isort # autoflake、black、isortをインストール
      - name: autoflake # autoflakeを使用してコードを修正
        run: autoflake -r .
      - name: black # blackを使用してコードをフォーマット
        run: black .
      - name: isort # isortを使用してインポートステートメントを整理
        run: isort .
      - name: Auto Commit # 自動コミット
        uses: stefanzweifel/git-auto-commit-action@v5 # 自動コミットアクションを使用
        with:
          commit_message: Apply Code Formatter # コミットメッセージを指定
  1. これらの変更をコミットして、GitHub リポジトリにプッシュします。

これで、新しい GitHub Actions ワークフローファイルがリポジトリにインストールされ、プルリクエストがオープン、更新されるたびにPythonコードの自動フォーマットを実行し、修正された場合コミットするように設定されました。

check.ymlで行っていること

  1. リポジトリのコードをチェックアウト
  2. Python 3.9のランタイムをセットアップ
  3. 必要な依存関係をインストール
  4. autoflakeを使用してコードの不要なインポートを削除
  5. blackを使用してコードを自動的にフォーマット
  6. isortを使用してコードのインポートステートメントを整理
  7. フォーマットが適用されたコードを自動的にコミットし、変更内容をコミットメッセージに記録

実際の動作

  1. 適当なブランチを作成して、コードのフォーマットが必要なサンプルコードを用意します。
sample.py
import sys
import random

import math

def greet(name):
    message = "Hello, " + name
    print(message)

name = "Alice"
greet(name)

def add_numbers(a, b):
  result = a + b
  return result

num1 = 5
num2 = 7
sum = add_numbers(num1, num2)
print("Sum:", sum)
  1. プルリクエストを作成して、コードの変更を提案します。

  2. 実際にプルリクエストを作成すると、GitHub Actionsが自動的に実行され、コードのフォーマットを確認し、必要に応じて修正します。また、プルリクエストが更新されるたびに、GitHub Actionsが再度トリガーされ、コードの整形を継続的に実行します。

  1. GitHub Actionsがフォーマット作業を完了すると、自動的にコミットが行われます。

  2. コミットの詳細を確認すると、import文の整理や空行、インデントの修正など、コードの品質向上が行われたことが分かります。

sample.py
- import sys
+ import math
  import random
+ import sys

- import math

  def greet(name):
      message = "Hello, " + name
      print(message)

+
  name = "Alice"
  greet(name)

+
  def add_numbers(a, b):
-   result = a + b
-   return result
+     result = a + b
+     return result


  num1 = 5
  num2 = 7

最後に

GitHub Actionsを活用することで、コードの品質を一貫して向上させることが可能です。プロジェクト全体で統一されたコーディングスタイルを確保し、開発者チームの生産性を向上させることができます。GitHub Actionsによる自動化と効率化の利点を最大限に活かし、ソフトウェア開発プロジェクトを成功に導くための基盤を築きましょう!

Arsaga Developers Blog

Discussion