MIXI DEVELOPERS
🐍

みてねにおけるRuff導入までの道のり

2024/12/16に公開

はじめに

これは、MIXI DEVELOPERS Advent Calendar 2024 の16日目の記事です。

みてねプロダクト開発部 Data Engineeringグループの 鶴田 です。
この記事では、「家族アルバムサービス みてね (以下みてね)」における、Python系リポジトリへのRuff導入までの数年にわたる取り組みを説明します。

2021年前半 (入社当時): コーディング規約だけの世界

2021年 (私の入社当時)、みてねには以下のようなPythonコーディング規約が存在しました。

  • コーディングスタイルはpep8に準拠しましょう
  • docstringを書きましょう
  • 極力型ヒントを書きましょう

ただし、ルールとして存在するだけで強制力はなく、実際には様々なスタイルのコードが混在していました。

2021年後半: エディタ設定の共有

このような状況を改善すべく、まずはチーム内でエディタのLinter周りの設定を共有する取り組みを始めました。
具体的には、VSCodeの settings.json をリポジトリに入れ、エディタのLinter設定が共有されるようにしました。
当時の設定は以下のようなものです。(2021年当時のものであり、現在では非互換が発生する可能性があります)

  • flake8でStyle Checkする
  • Blackでフォーマットする
  • Pylanceで型チェックを行う
{
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": ["--ignore=E501"],
    "python.linting.pydocstyleEnabled": true,
    "python.formatting.provider": "black",
    "python.analysis.typeCheckingMode": "basic",
    "python.languageServer": "Pylance",
    "python.analysis.completeFunctionParens": true
}

この取り組みにより、新規コードのスタイルは極力統一されるようになりましたが、既存コードの大半が違反状態となることからCIへの導入は見送られました。

2022年: ML実験環境へのflake8導入・CIでの強制化

コーディングスタイルへの意識が浸透してきたと判断し、2022年ごろに機械学習の実験用リポジトリに対し、GitHub ActionsによるCI中でのチェック機構を導入しました。
当時、Actionの導入には python-lint を利用しました。(注: 2024年現在ではメンテナンスが停止している可能性があります)

設定は以下のものを適用しました。

  stylecheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ricardochaves/python-lint@v1.4.0
        with:
          use-pylint: false
          use-pycodestyle: false
          use-flake8: true
          use-black: false
          use-mypy: false
          use-isort: false
          extra-flake8-options: "--ignore=E501,E722,F401,F403,W605"

例によって既存のコードが多く引っかかってしまい、修正に工数がかかることから、一部のルールは採用が見送られています。(importの順番、対象を明示しない exception のcatchなど)
また、当時は本番環境で稼働しているリポジトリへのCI導入も見送られました。

2024年: 本番環境へのRuff導入

時は流れて2024年、ちょうど機械学習モデルを運用しているリポジトリの大規模なリファクタリングが進行していたこともあり、サービスの本番環境で稼働しているPython系リポジトリに対してもLinterの導入に踏み切りました。
前年あたりから、Rustで実装された高速なLinterである Ruff が流行し始めていたため、流行りに乗ってみてねでもRuffを採用しています。
採用したルールは以下のようなものです。設定にあたって、FastAPI などのRuffを導入しているOSSの設定を参考にしました。

[tool.ruff]
line-length = 120
indent-width = 4
target-version = "py311"

lint.select = [
  "B",  # flake8 bugbear
  "C4", # flake8 comprehensions
  "C9", # flake8 McCabe
  "E",  # pycodestyle errors
  "W",  # pycodestyle warnings
  "F",  # pyflakes
  "I",  # isort
  "UP", # pyupgrade
]
lint.ignore = ["E501"]

かつて放置されていた過去のコードたちですが、この機会にまとめて違反状態を解消しました。
多くのコードはRuffの自動修正機能で対応することができ、Ruff最高!という気持ちです。
ルールについてはこれでFixではなく、よりよいルールがあれば適宜アップデートしていきたいと考えています。

まとめ

この記事では、みてねにおけるRuff導入までの道のりについて解説しました。
将来的にはmypyによる型チェックなどもCIへ導入したいと考えており、うまくいけばまた記事にします。

また、うちのプロジェクトはRuffをこう設定してるよ!という情報があれば是非コメントしてください。

MIXI DEVELOPERS
MIXI DEVELOPERS

Discussion