Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
複雑化したリポジトリをなんとかした話 pipenvからuvによるモノレポ構成への移行
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Satoshi Kaneyasu
September 25, 2025
Programming
1
1.7k
複雑化したリポジトリをなんとかした話 pipenvからuvによるモノレポ構成への移行
PyCon JP 2025での登壇資料です。
https://2025.pycon.jp/ja/timetable/talk/EXQTNU
Satoshi Kaneyasu
September 25, 2025
Tweet
Share
More Decks by Satoshi Kaneyasu
See All by Satoshi Kaneyasu
Amazon_Cognito_で構築する_スケーラブルな_Web_アプリケーション__シングルページ_Web_アプリケーションに認証を組み込む_.pdf
satoshi256kbyte
0
8
人間とAI、どちらが書いたコードもCI/CDでチェックしてみよう
satoshi256kbyte
0
10
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
180
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎
satoshi256kbyte
1
32
人間とAI、どちらが書いたコードもCICDでチェックしてみよう
satoshi256kbyte
1
26
はじめてのカスタムエージェント【GitHub Copilot Agent Mode編】
satoshi256kbyte
0
450
お客様とSIerではじめたスクラム開発(で得た学び)
satoshi256kbyte
0
110
From Pipenv to UV: Migrating to a Monorepoto Tame a Complex Repository
satoshi256kbyte
0
59
ディレクトリ構成と設定ファイルから考えるSIerのVibe Coding
satoshi256kbyte
0
110
Other Decks in Programming
See All in Programming
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.1k
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
500
Claude Codeログ基盤の構築
giginet
PRO
7
3.6k
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
160
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
7
3.1k
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
230
存在論的プログラミング: 時間と存在を記述する
koriym
5
500
AI活用のコスパを最大化する方法
ochtum
0
330
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
240
20260315 AWSなんもわからん🥲
chiilog
2
170
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
110
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
110
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Fireside Chat
paigeccino
42
3.8k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
We Have a Design System, Now What?
morganepeng
55
8k
The Spectacular Lies of Maps
axbom
PRO
1
650
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
220
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
230
From π to Pie charts
rasagy
0
160
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
複雑化したリポジトリをなんとかした話 pipenvからuvによるモノレポ構成への移行 PyCon JP 2025 2025.09.26 Satoshi Kaneyasu
2 発表者自己紹介 氏名:兼安 聡 所属:株式会社サーバーワークス アプリケーションサービス部 在住:広島(フルリモート) 担当:DevOps、技術支援、PM、SM SNS(X):@satoshi256kbyte •
2025 AWS Community Builders • 2025 Japan AWS Top Engineers (AI/ML Data Engineer) • 2025 Japan AWS All Certifications Engineers • 認定スクラムマスター • PMP
4 目次 1. 複雑化したリポジトリ 2. ランタイムバージョンマネージャの見直し pyenvからasdfへの移行 3. pipenvからuvへの移行 複雑化したリポジトリをモノレポ構成へ
4. 後回しにしたもの 5. uvによるモノレポ構成移行の効果 6. まとめ
複雑化したリポジトリ 後期 初期 中期
6 プロジェクトとリポジトリの概要 ◼ アジャイル開発(スクラム) ◼ AWS上に構築されたWebアプリケーション ◼ AWSを用いている理由は、スケーリング重視のため ◼ バックエンドがPython、長時間の非同期処理あり
◼ バックエンドは基本サーバーレスで、長時間の非同期処理はコンテナ ◼ pyenv+pipenvを使用
7 構成図 Python 3.11 Python 3.13 後から追加
8 ディレクトリ構成 追加したモジュールは Python 3.13 最初からあったモジュールは Python 3.11
9 難解なデプロイスクリプト そのフォルダで使用している バージョンに切り替えてデプロイ モジュールごとにフォルダ移動して またバージョンを切り替えてデプロイ
10 この頃思っていたこと ◼ デプロイスクリプトが、かなり違和感を感じるものになった ◼ これもあって、CI/CDまわりが人気がなくなり、CI/CDの属人化が加速 ◼ ユニットテストが書きづらいという声が挙がり始めた ➢ わかりにくい意見だが、
根本は全体的に考えることが多すぎる、認知負荷が高い、ということだと感じた ◼ これはいずれは問題となり、開発チームにとってブレーキになるだろう 次ページから次の話題になります
ランタイムバージョンマネージャの見直し pyenvからasdfへの移行 後期 中期 初期
12 ランタイムバージョンマネージャのpyenvからasdfへの移行 ◼ まずはpyenvからasdfの移行に着手 ◼ another_project の担当者がasdfを使い始めてくれたのでそれを横展開 ◼ asdfの横展開を決めたのは、AWS CLIやIaC用のNode.jsなど、
Python以外にもバージョン管理したいものがあり、それとマッチしたから ◼ これにより、言語・ツールを管理する「asdf」、ライブラリを管理する「pipenv」と、 役割分担がわかりやすくなった .tool_versions aws-sam-cli 1.136.0 nodejs 23.10.0 python 3.13.1
13 ランタイムバージョンマネージャの見直し方針 ◼ 機能開発と同時進行する ◼ Gitブランチのイメージ develop 機能開発 移行ブランチ
14 pyenvからasdfへの移行 これだけはPython以外のバージョンも指定している
15 pyenvからasdfの移行に1ヶ月かかる ◼ asdfへの導入自体はすぐできたが、asdfがチームに浸透するまで1ヶ月ほど要した ◼ 時間がかかった理由は、メンバーからasdfが効かないという声が多数あがったこと ◼ pyenvで作られたPythonの仮想環境が残っている場合、 asdfと.tool-versionsの内容より仮想環境のバージョンが優先されることがあるので、 仮想環境から抜けてから削除するとうまくいく
◼ Pythonのパスがpyenvのものを指してしまう場合は、 reshimしたり、シェルの初期化スクリプトを見直す(.zshrcや.bashrcなど)
16 この時点ではデプロイスクリプトの見直しはなし 「pyenv local xxx」が「asdf install」になるだけなので、 そこだけ直して他のデプロイスクリプトの見直しは保留 次ページから次の話題になります
pipenvからuvへの移行 複雑化したリポジトリをモノレポ構成へ 中期 後期 初期
18 pipenvからの移行先にuvを選定した理由 ◼ 依存関係解決やパッケージインストールが圧倒的に速い ◼ CI/CDの高速化に繋がる ◼ 最近勢いがあり、メジャーなところで使われている ◼ 単体でトップレベルでの一括ロック/一括installするワークスペース機能を有する
=uvだけでモノレポ構成が可能
19 リファクタリングの方針 ◼ 機能開発と同時進行する ◼ ディレクトリ構造の再構成とPythonバージョンの統一により、 可読性の向上とデプロイスクリプトの簡素化を目的とする ◼ これにより、今後モジュールがさらに増えても大きな見直しが入らないようにする ◼
必要以上の見直しは行わない develop 機能開発 移行ブランチ
20 手順 生成AI/手動 ディレクトリの再構成 生成AI Pythonのバージョンを統一 手動 ライブラリの再インストール 手動 デプロイスクリプトの見直しとトライ&エラー
手動>生成AI 動作確認 手動 pipenvの設定ファイルをuv形式に書き換え 生成AI>手動 設定ファイルにモノレポ設定を加える 手動 デプロイスクリプトの見直しとトライ&エラー 生成AI>手動 動作確認 手動 リファクタリングの手順 ◼ 生成AIはAmazon Q Developer CLIを使用
21 ディレクトリの再構成<生成AI> <プロンプト> modulesフォルダを作り、 各モジュールをそこに集めます another_project_aをmodules配下に 移動して名前をmodule_aとしてください <プロンプト> 移動したのに合わせて、import文や各種スク リプトのパスを修正してください
22 ディレクトリの再構成<生成AI>
23 ディレクトリの再構成 <生成AI> <プロンプト> リポジトリルート直下にあるモジュールを、 modules/module_cとして移動させてください
24 Pythonのバージョンを統一<手動> asdfの.tools-versionsを一つに集約 =Pythonのバージョンを3.13に統一
25 ライブラリの再インストール<手動> 3.13に合わせてからライブラリを 再インストール
26 デプロイスクリプトの見直し<手動> ディレクトリ構成の見直しにより、 ビルドとデプロイは同じコマンド群をモジュールの個数分 繰り返せばOKと考えることができるようになった 故に、このタイミングでビルドとデプロイをシェル化 親子シェルにしている
27 デプロイスクリプトの見直し 親シェルのイメージ
28 デプロイスクリプトの見直し 子シェルのイメージ 親子シェルにしているのは開発時に モジュール単体のデプロイもすると考えたから シェルにしたのはAWSを用いている関係上、 引数・条件分岐・下準備が多いから
29 デプロイスクリプトの見直しとトライ&エラー<生成AI> 作成したビルド・デプロイシェルを生成AI経由で実行、 エラーが出るたびに修正を指示して綺麗にしていく
30 pipenvの設定ファイルをuv形式に書き換え<手動>
31 生成AIを用いたuv移行の注意点 ◼ 生成AIにpipenvのPipfileからuv用のpyproject.tomlへの移行を指示 ◼ ぱっと見移行をできたが、Pipfileの[scripts]相当のものを無理に書こうとしていた ため手動移行に変更 ◼ 生成AIが作ったものは、雰囲気を掴むためのテスト移行だと割り切り、手動で作り 直しをした
32 設定ファイルにモノレポ設定を加える
33 設定ファイルにモノレポ設定を加える モジュールのリスト
34 設定ファイルにモノレポ設定を加える リンター・フォーマッターなど、 共通のライブラリは各モジュール から移動させてここに集約
35 設定ファイルにモノレポ設定を加える モジュール特有のライブラリは こちらで指定
36 作業中ブランチのマージについて ◼ uvへの移行と、モノレポ構成への移行は作業ブランチで実施 ◼ その間も機能開発は進んでいて、随時更新内容を取り込んで(マージ)いたが、 大きなコンフリクトは起きなかった ◼ やっていることがディレクトリ構成やパッケージ管理の置き換えが中心で、 ビジネスロジックに変更はなかったからと思われる
develop 機能開発 移行ブランチ 次ページから次の話題になります
後回しにしたもの 中期 初期 その後 後期
38 後回しにしたもの 後回しにしたもの 理由 落とし所 タスクランナー • uvにタスクランナーはない • 移行先はMakefileが優先っぽいが決定的
なものがなかった • 進めるには議論が必要 • IaCを使っている関係で、package.jsonがあ るので一旦そちらで運用 • 違和感があるのでMakefileに移行 リンター・フォーマッター • 既存はblack+isort+flake8 • uvと合わせるためにruffを試したが、 整形結果が既存ツールと一致しなかったの で後回し • uvへの移行期間中は着手しない • 後日、isortとflake8はruffに移行 • blackは継続使用、整形結果がやはり既存と 完全一致しないため 重複コードの解消 重複コードの解消は、こういう方法もありますよというのを見つけたので紹介します (ベストプラクティスではありません)
39 重複コードの解消 共通モジュールを作ったはいいが、ディレクトリ構造上、 工夫をしないと他のモジュールが参照できない 参照できない
40 重複コードの解消 この書き方だと、エディタ上では共通モジュールを参照させられるが、 AWS Lambda・コンテナのデプロイまではできなかった
41 重複コードのパッケージ化とAWS Lambdaへのデプロイ ① uv run python -m build 共通モジュールをパッケージ化した
dist/shared_module.whlができる ② uv export --format requirements-txt --no-emit-workspace --no-dev --output-file requirements_layer/requirements.txt echo “../../../../../shared/dist/shared_module.whl --hash=sha256:ハッシュ値" >> requirements_layer/requirements.txt .whlファイルへの相対パスを追記したrequirements.txtを用意 それを持ってLambdaレイヤー、そしてLambdaをデプロイする
42 重複コードのパッケージ化とコンテナのマルチステージビルド ローカルで共通モジュールをコンテナビルド 他モジュールのコンテナは共通モジュールのビルドイメージ「も」参照して、 共通モジュールのwheelを自身の中にコピーする
43 [見送り]リポジトリサービスを利用する案 次ページから次の話題になります 全員がアクセスするリポジトリサービスを用意しないといけないのと、 サービスの認証・URL取得が手間なので見送り
uvによるモノレポ構成移行の効果 中期 初期 その後 後期
45 uvによるモノレポ構成移行の効果 ◼ CI/CDの属人性の軽減、これによるCI/CDにSCA・SASTの導入 Gitプッシュ 静的解析(flake8→後にruff) 自動テスト(pytest) SCA ライブラリのセキュリティチェック SAST
ソースコードのセキュリティチェック ビルド デプロイ
46 uvによるモノレポ構成移行の効果 ◼ モジュールの量産体制が整った ◼ ビルド・デプロイ以外の運用シェルのPython化など、新たな改善の動きが見られる ようになった
47 SCAとSASTの補足 ◼ SCAはAmazon Inspectorを使用し、ライブラリのチェック ◼ SASTはSemgrep(CE版)を使用して、ソースコードのチェック ◼ Inspectorはチェック対象としてuv.lockがサポートされていないので、 CI/CDでuvからrequirements.txtを出力してチェックさせる
次ページから次の話題になります uv export --format requirements-txt --no-emit-workspace --no-dev --output-file requirements_layer/requirements.txt
まとめ 2ページあります
49 複雑化したリポジトリから、uvによるモノレポ構成への移行手順 手順 生成AI 手動 備考 ランタイムバージョンマネージャの見直し ー ◦ この作業の生成AIの効果は未検証
ディレクトリの再構成 ◦ △ パスの整合性を取るのは生成AIの方が向いている Pythonのバージョンを統一 ー ◦ 生成AIでやるメリットがない 手動で丁寧にやった方が良い ライブラリの再インストール ー ◦ デプロイスクリプトの見直し △ ◦ 大枠は手動で作るのがおすすめ 生成AIに任せると冗長なスクリプトになりがち デプロイスクリプトのトライ&エラー ◦ △ 何度もトライ&エラーが要るので、 生成AIにやらせるのがおすすめ pipenvの設定ファイルをuv形式に 書き換え △ ◦ ハルシネーションの影響を受けやすいので、 手動の方が適している 設定ファイルにモノレポ設定を加える △ ◦ ハルシネーションの影響を受けやすいので、 手動の方が適している デプロイスクリプトの見直し △ ◦ 1回目のデプロイスクリプトと同じ デプロイスクリプトのトライ&エラー ◦ △
50 まとめ ◼ uvだけでランタイム管理もできますが、asdf+uvも使い勝手がいいです ◼ uvは高速なので、CI/CDの高速化にも寄与します ◼ uvへの移行、uvを用いたモノレポ構成への移行には生成AIが役立ちますが、 ハルネーションに惑わされることがあるので注意してください ◼
uvを導入すると、ruffなども入れたくなりますが、完全互換は難しいので、 段階移行や既存ツールとの併用も視野に入れた方がよいと思います ◼ モノレポ構成にすると共通モジュールの扱いが難しくなりますが、 wheelやマルチステージビルドを活用する手はあります
None
52 参考資料 ◼ 開発言語のバージョン管理にasdfはいかがですか ◼ v0.16.0以降のasdfのインストール手順(arm64 Amazon Linux 2023) ◼
Pipenv ユーザーのための uv 入門