Uh oh!
There was an error while loading. Please reload this page.
feat: pre-up / deploy フックへ clone 先とリポジトリ URL を渡す - #110
Conversation
PLAN32 Task 5。複数リポジトリ構成と project.yml への移行に合わせて利用者向け ドキュメントを更新した。 - docs/user/project-yml.md を新設: スキーマ、複数リポジトリの例、検証される 内容、env との使い分け、旧 env からの移行表、コンテナへの渡り方 - 環境変数ガイド / コンテナ操作ガイド / CLI リファレンス / プラグイン開発の 各所から旧キー (GIT_USER / GIT_REPO / WORK_DIR / CONTAINER_SCALE) の説明を 外し、project.yml とその参照へ置き換え - CLI リファレンスに devbase project migrate-config を追記 - アーキテクチャ解説に project/ モジュールの節を追加 - CHANGELOG に破壊的変更と再ビルドの注意を追記 過去リリース分の CHANGELOG 記述は履歴なので書き換えていない。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- repo-backed-projects.md: 見出し変更で切れた `#スケール前提-container_scale1` 参照 2 箇所を `#スケール前提-scale-1` に修正 - quickstart.md: `env` はファイル自体が必須(中身は任意)と見出しから分かるよう変更し、 最小構成のディレクトリツリーへ `project.yml` を追加 - project-yml.md: `env` ファイルが必須である旨を同じ表現に揃える Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`devbase env init` の editor コレクター (lib/devbase/env/collectors/editor.py) が `DEVBASE_OPEN_EDITOR` を対話収集し、対話の既定は `1` (有効) である。 「収集対象外」「既定: OFF」という記述は実装と矛盾していたため、収集対象で あることと、OFF に倒れるのはキー自体が未設定のときだけである旨へ修正した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- project.yml リファレンス: `init` は clone 直後だけでなくコンテナ起動の たびに `./init.sh` を実行することを明記し、`branch` (clone 直後のみ) との タイミング差の表と冪等性の注意を追加 - 環境変数: `DEVBASE_WORKSPACE` が効くのはリポジトリ 1 件の構成だけで、 2 件以上では自動生成した workspace を直接開くため上書きできない旨を明記 - container-operations / plugin-dev quickstart の関連記述も同じ挙動へ揃える Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PLAN32 で GIT_REPO / WORK_DIR が env から project.yml へ移った結果、それらを `source ./env` で読んでいたライフサイクルフックが値を取れなくなる。実際に plugin リポジトリの pre-up / deploy が壊れることを結合検証で確認した。 フックはホスト側で動くため、devbase 側から明示的に環境変数として渡す: - DEVBASE_PRIMARY_DIR: primary repo の /work 配下ディレクトリ名 - DEVBASE_PRIMARY_URL: primary repo の clone URL - DEVBASE_WORK_DIR: コンテナ内の既定の作業ディレクトリ - DEVBASE_REPO_DIRS: 全 repo のディレクトリ名 (空白区切り、宣言順) env を経由せず devbase が渡すことで、複数リポジトリ構成でもフックが clone 先を 一意に知れる。渡した値は子プロセス限定で、親の os.environ は汚さない。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
公開フック契約と公式ガイドの整合を修正してください。
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | APPROVE
特に指摘事項はありません。
env の役割を「コンテナへ渡す環境変数」と書き換えたのに、直上の表だけ 「リポジトリ名・コンテナ数等」と旧仕様のままで矛盾していた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
pre-up / deploy へ渡す DEVBASE_PRIMARY_DIR / DEVBASE_PRIMARY_URL / DEVBASE_WORK_DIR / DEVBASE_REPO_DIRS は公開契約だが、ガイドは移行前の GIT_REPO / WORK_DIR を案内したままだった。フック作者がこの契約を使って 移行できないため、次を追記する。 - quickstart: 「フックへ渡る環境変数」表 (pre-up / deploy の別と DEVBASE_INSTANCE_INDEX が pre-up に渡らないことを含む) と、 DEVBASE_PRIMARY_URL を使う pre-up サンプル - repo-backed-projects: clone 先 / URL の受け取り方と pre-up 骨子、 関連環境変数節への追記、チェックリスト項目 - project.yml リファレンス: project.yml の各キーとの対応表 - CHANGELOG: Unreleased / Added へ本機能を記載 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
commented
Aug 22, 2026
🔧 /ndf:fix サマリ (round 1)対応件数: critical=0 / major=0 / minor=1 (合計 1 件) 詳細
codex の指摘は妥当と判断しました。公開契約(フックへ渡る環境変数)を増やしたのにガイドが旧 変更内容
|
| ドキュメントの記述 | 実装上の根拠 |
|---|---|
DEVBASE_PRIMARY_DIR = repos[].dir(未指定ならリポジトリ名) | config.py:300merged.get("dir", repo) |
primary = repos 先頭 または primary: true の 1 件 | config.py:383replace(first, primary=True) |
DEVBASE_PRIMARY_URL = https://<host>/<owner>/<repo>.git | RepoSpec.url |
DEVBASE_WORK_DIR = work_dir(未指定なら /work/<primary.dir>) | resolved_work_dir() |
DEVBASE_REPO_DIRS = 宣言順・空白区切り | hook_env() の " ".join(...) |
DEVBASE_INSTANCE_INDEX は deploy のみ | _run_deploy_script_for_instances のみが設定 |
@takemi-ohama 再レビューをお願いします。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
テスト環境に依存する失敗を避けるため、親プロセス環境の非変更テストで事前状態を固定または保存してください。
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | APPROVE
指摘事項はありません。
親プロセスへ漏れないことを確かめるテストは、実行環境に同名の変数が居ると 偽陰性/偽陽性になる。事前に unset して初期状態を固定した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | APPROVE
修正が必要な問題はありません。全 1377 テストの成功を確認しました。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | APPROVE
変更内容を確認しました。指摘事項はありません。
# Conflicts: # CHANGELOG.md # docs/plugin-dev/quickstart.md # docs/plugin-dev/repo-backed-projects.md # docs/user/project-yml.md
Summary
ライフサイクルフック(
pre-up/deploy)へ、プロジェクトの clone 先とリポジトリ URL を環境変数として渡します。DEVBASE_PRIMARY_DIR/work配下ディレクトリ名DEVBASE_PRIMARY_URLDEVBASE_WORK_DIRDEVBASE_REPO_DIRS背景
PLAN32 で
GIT_REPO/WORK_DIRがenvからproject.ymlへ移った結果、それらをsource ./envで読んでいたフックが値を取れなくなります。結合検証で、実際に配布中のプラグインのpre-up/deployが壊れることを確認しました(docker compose cp ... dev:${WORK_DIR}/...が/...になる、git clone https://${GIT_HOST}/${GIT_USER}/${GIT_REPO}.gitが組み立てられない)。フックはホスト側で動くため、
envを経由せず devbase が明示的に渡す形にします。複数リポジトリ構成でもフックが clone 先を一意に知れます。設計上の判断
渡した値は子プロセス限定にし、親プロセスの
os.environは汚しません(プロジェクト切り替え時の残留を避けるため)configを渡さない呼び出し(後方互換のための既定引数)ではフック自体は従来どおり動きますdevbase scaleの deploy 実行にも同じ値を渡しますplan:
issues/PLAN32_multi-repo-project.mdrelease PR: release: PLAN32 1 プロジェクト = 複数リポジトリ構成への変更 (v3.0.0) #103
Test plan
uv run pytest tests/project/test_runtime.py—hook_envの値(primary / work_dir / 全リポジトリ)uv run pytest tests/commands/test_hook_env.py— 実際にbashでフックを起動し、pre-up/deployが値を受け取ること、DEVBASE_INSTANCE_INDEXと併用できること、設定なしでも動くこと、親プロセスへ漏れないことuv run pytest— 全 1377 件 green