Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[PyCon APAC 2023]PantsではじめるPython Monorepo

[PyCon APAC 2023]PantsではじめるPython Monorepo

Koki Nishihara

October 29, 2023
Tweet

More Decks by Koki Nishihara

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 Koki Nishihara (github@nishikoh) CADDi AI Team, Lead Engineer •

    MLOpsの推進 • Python Working Group Lead 好きなOSS • pydantic • Pants 2
  2. Monorepo Contents Pants 概要と活用 1 2 Keywords monorepo, build tools,

    Python, Pants, CI/CD, 静的解析, チーム開発, 大規模 開発, 開発効率, 依存管理, コード共有, Docker, pex 話さないこと Bazel や Buck2、Moon、NX といった Pants 以外のビルドシステムの詳細 Monorepoとビルドツール 3
  3. Monorepoの特徴 ✅ ⼀貫性と集約的な管理 ✅ コードや設定、   CI/CDの再利⽤による⼯数削減 ✅ ⾼い可視性 ✅

    Single source of truth ✅ Atomic commits repo proj ⚠ 技術選定や意思決定の影響範囲 ❌ ビルドやテストのパフォーマンス ❌ 学習コストと   認知負荷 7
  4. ビルドツールの機能 • ローカルキャッシュ • リモートキャッシュ • リモート実⾏ • 差分検知 •

    ツールの統⼀ ビルドツールが開発規模拡⼤した際のパフォーマンスや管理をサポート • ビルド‧パッケージング • 依存管理 • 依存の制約(禁⽌‧許可)管理 • タスクランナー ... etc 10
  5. Pants PantsでサポートしているPython開発ツールの例 pip, pytest, black, yapf, flake8, docformatter, pydocstyle, isort,

    pylint, bandit, autoflake, pyupgrade, ruff, mypy, setuptools, iPython … etc Docker, pex, AWS Lambda, Google Cloud Functions requirements.txt, pyproject.toml (PEP621, poetry) , Pipfile.lock 依存管理 packaging tools 14
  6. Getting started [ディレクトリ構成] pants.tomlと各ディレクトリのBUILDファイルを配置すると、 最終的に右のような構成になる . ├── lib/ │ └──

    hello_world.py ├── main.py └── requirements.txt . ├── BUILD ├── lib/ │ ├── BUILD │ └── hello_world.py ├── main.py ├── requirements.txt └── pants.toml 17
  7. Getting started [BUILD] BUILDにはどのファイルをPantsで管理するかや entorypoint などを記述 . ├── BUILD ├──

    lib/ │ ├── BUILD │ └── hello_world.py ├── main.py ├── requirements.txt └── pants.toml python_sources() python_requirements( name="requirements", source="requirements.txt" ) python_sources() 20
  8. Getting started [BUILD] python_sources()でカレントディレクトリの*.pyをPantsに紐づける python_sources() python_requirements( name="requirements", source="requirements.txt" ) python_sources()

    . ├── BUILD ├── lib/ │ ├── BUILD │ └── hello_world.py ├── main.py ├── requirements.txt └── pants.toml 21
  9. Getting started [BUILD] python_requirements()でファイルに依存するパッケージをPantsで管理 requirements.txt 以外に poetry や PEP621 対応のpyproject.toml

    でもOK python_sources() python_requirements( name="requirements", source="requirements.txt" ) . ├── BUILD ├── lib/ │ ├── BUILD │ └── hello_world.py ├── main.py ├── requirements.txt └── pants.toml 22
  10. Getting started [run] setupが終わった今の状態で、右のコマンドを実⾏するとプログラムが起動 . ├── BUILD ├── lib/ │

    ├── BUILD │ └── hello_world.py ├── main.py ├── requirements.txt └── pants.toml $ pants run main.py Hello World! 23
  11. Getting started [lint] 以下のコマンドでlintを実⾏ . ├── BUILD ├── lib/ │

    ├── BUILD │ └── hello_world.py ├── main.py ├── requirements.txt └── pants.toml # 単一のファイル $ pants lint lib/hello_world.py # ディレクトリ配下全て $ pants lint lib/:: # repo全体 $ pants lint :: 24
  12. shard分割による並列実⾏ テストを複数の shard(分割単位)に分けて実⾏ 30 $ pants test --shard=0/10 :: $

    pants test --shard=1/10 :: … 770秒かかっていたテストを試しに1/10に分割すると58秒まで短縮 CI 環境で複数のマシンで並列分散実⾏すると、CIの待ち時間を短縮できる
  13. Diamond DependenciesとOne-Version Rule Diamond Dependenciesはコードの依存するバージョンが衝突する状況 37 libaが使うlibbaseとlibbが使う libbaseのバージョンが違うとビルド や実⾏時にエラーを引き起こす 対策:

    One-Version Rule 任意のライブラリに対して 1 つの バージョンを使⽤することでビルドの 堅牢性を⾼め、失敗を防ぐ 引用: https://abseil.io/resources/swe-book/html/images/seag_2101.png
  14. CADDi社内でのPants活⽤ 活⽤場⾯ • backendのWebAPI • 機械学習パイプライン • 社内向けPythonライブラリ 39 規模

    • 依存するパッケージ数: 300以上 • プロジェクト数: 30以上 パッケージは全て⼀つのバージョンを 使っている(”One-Version Rule”) 300以上のパッケージを最新バージョン に更新するのも5分以内に完了する
  15. おすすめ書籍 Software Engineering at Google Build Systems and Build Philosophy

    の章は モノレポに関わる人にオススメ! 42
  16. 43