Skip to content

Commit 8e56ef6

Browse files
takemi-ohamaclaude
andcommitted
feat(container): pre-up フックを追加してビルド前のリポジトリ clone 等を可能に
`devbase up` 開始直後(`_ensure_env_files` の後・`_ensure_images` の前)に、 プロジェクト直下に `pre-up` 実行可能ファイルがあれば bash で実行する。 `build.context` に外部リポジトリを指定したいプロジェクトで、`docker compose up` より前にリポジトリ clone を完了させるためのフックポイントとして用意した。 既存の `./deploy` がコンテナ起動「後」に走るのに対し、`./pre-up` は起動「前」に 走るため、対称な命名としている。 - 非ゼロ終了で `devbase up` を中断(`deploy` は失敗しても続行する設計と区別) - ドキュメント (`docs/plugin-dev/quickstart.md`) に `pre-up` / `deploy` の ライフサイクル比較表とサンプルを追記 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e1b396b commit 8e56ef6

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

docs/plugin-dev/quickstart.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,31 @@ CONTAINER_SCALE=1
123123
MY_SECRET_API_KEY=sk-xxxxxxxxxxxx
124124
```
125125

126+
### 2.5 ライフサイクルフック(任意)
127+
128+
プロジェクトディレクトリ直下に以下の実行可能ファイルを置くと、`devbase up` のライフサイクルに合わせて自動的に呼び出されます。どちらも実行できなくても問題ない場合は配置不要です。
129+
130+
| ファイル | 実行タイミング | 主な用途 |
131+
|---------|---------------|---------|
132+
| `pre-up` | `devbase up` 開始直後(`docker compose up` の前) | `build.context` 用ソースリポジトリの clone、設定ファイルの生成など、イメージビルド前に完了させたい準備 |
133+
| `deploy` | コンテナ起動完了後、各スケールインスタンスごとに実行 | S3 からの `.env` 取得、コンテナ起動後に必要な外部リソースの初期化など |
134+
135+
```bash
136+
#!/bin/bash
137+
# projects/my-project/pre-up
138+
set -e
139+
140+
# env から GIT_USER / GIT_REPO を取得
141+
source ./env
142+
143+
# build context に使うリポジトリが無ければ clone
144+
if [ ! -d "./repo" ]; then
145+
git clone "https://github.com/${GIT_USER}/${GIT_REPO}.git" repo
146+
fi
147+
```
148+
149+
> **Note:** どちらのフックも `bash` で実行されます。`chmod +x` で実行可能ビットを立てておいてください。`pre-up` が非ゼロ終了すると `devbase up` は中断します。`deploy` は各インスタンスに対して `DEVBASE_INSTANCE_INDEX` を環境変数として渡しますが、失敗してもデプロイは続行されます。
150+
126151
---
127152

128153
## 3. ローカルでの開発・テスト

lib/devbase/commands/container.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,29 @@ def _run_deploy_script_for_instances(deploy_script: Path, indices) -> None:
5454
logger.warning("Deploy script failed for instance %d (exit code %d)", i, e.returncode)
5555

5656

57+
def _run_pre_up_hook() -> bool:
58+
"""`./pre-up` フックがあればコンテナ起動前に実行する。
59+
60+
ビルドコンテキスト用のリポジトリ clone など、`docker compose up` より前に
61+
完了しておく必要のある準備処理をプロジェクト側で記述するためのフック。
62+
63+
Returns:
64+
True: フックが存在しなかった、または成功した
65+
False: フックが失敗した(呼び出し側で `cmd_up` を中断する)
66+
"""
67+
pre_up_script = Path('./pre-up')
68+
if not (pre_up_script.exists() and pre_up_script.is_file()):
69+
return True
70+
71+
logger.info("Running pre-up hook: %s", pre_up_script)
72+
try:
73+
subprocess.run(['bash', str(pre_up_script)], check=True, env=os.environ.copy())
74+
return True
75+
except subprocess.CalledProcessError as e:
76+
logger.error("pre-up hook failed (exit code %d)", e.returncode)
77+
return False
78+
79+
5780
# ---------------------------------------------------------------------------
5881
# ディスパッチャ
5982
# ---------------------------------------------------------------------------
@@ -105,6 +128,10 @@ def cmd_up(project_name: str = None, scale: int = None) -> int:
105128
logger.error("Failed to create .env file. Please run 'devbase env init' manually.")
106129
return 1
107130

131+
# Pre-step: Run ./pre-up hook (e.g. clone source repos used as build contexts)
132+
if not _run_pre_up_hook():
133+
return 1
134+
108135
# Pre-check 2: Ensure container images exist
109136
if not _ensure_images():
110137
logger.error(

0 commit comments

Comments
 (0)