From 8e56ef60c1ee002753c7ebb2fdc3bb2aed66bfd0 Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Wed, 13 May 2026 16:18:18 +0900 Subject: [PATCH] =?UTF-8?q?feat(container):=20pre-up=20=E3=83=95=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=A6=E3=83=93?= =?UTF-8?q?=E3=83=AB=E3=83=89=E5=89=8D=E3=81=AE=E3=83=AA=E3=83=9D=E3=82=B8?= =?UTF-8?q?=E3=83=88=E3=83=AA=20clone=20=E7=AD=89=E3=82=92=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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) --- docs/plugin-dev/quickstart.md | 25 +++++++++++++++++++++++++ lib/devbase/commands/container.py | 27 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/docs/plugin-dev/quickstart.md b/docs/plugin-dev/quickstart.md index 453800c..e03c419 100644 --- a/docs/plugin-dev/quickstart.md +++ b/docs/plugin-dev/quickstart.md @@ -123,6 +123,31 @@ CONTAINER_SCALE=1 MY_SECRET_API_KEY=sk-xxxxxxxxxxxx ``` +### 2.5 ライフサイクルフック(任意) + +プロジェクトディレクトリ直下に以下の実行可能ファイルを置くと、`devbase up` のライフサイクルに合わせて自動的に呼び出されます。どちらも実行できなくても問題ない場合は配置不要です。 + +| ファイル | 実行タイミング | 主な用途 | +|---------|---------------|---------| +| `pre-up` | `devbase up` 開始直後(`docker compose up` の前) | `build.context` 用ソースリポジトリの clone、設定ファイルの生成など、イメージビルド前に完了させたい準備 | +| `deploy` | コンテナ起動完了後、各スケールインスタンスごとに実行 | S3 からの `.env` 取得、コンテナ起動後に必要な外部リソースの初期化など | + +```bash +#!/bin/bash +# projects/my-project/pre-up +set -e + +# env から GIT_USER / GIT_REPO を取得 +source ./env + +# build context に使うリポジトリが無ければ clone +if [ ! -d "./repo" ]; then + git clone "https://github.com/${GIT_USER}/${GIT_REPO}.git" repo +fi +``` + +> **Note:** どちらのフックも `bash` で実行されます。`chmod +x` で実行可能ビットを立てておいてください。`pre-up` が非ゼロ終了すると `devbase up` は中断します。`deploy` は各インスタンスに対して `DEVBASE_INSTANCE_INDEX` を環境変数として渡しますが、失敗してもデプロイは続行されます。 + --- ## 3. ローカルでの開発・テスト diff --git a/lib/devbase/commands/container.py b/lib/devbase/commands/container.py index 4ec166e..528a143 100644 --- a/lib/devbase/commands/container.py +++ b/lib/devbase/commands/container.py @@ -54,6 +54,29 @@ def _run_deploy_script_for_instances(deploy_script: Path, indices) -> None: logger.warning("Deploy script failed for instance %d (exit code %d)", i, e.returncode) +def _run_pre_up_hook() -> bool: + """`./pre-up` フックがあればコンテナ起動前に実行する。 + + ビルドコンテキスト用のリポジトリ clone など、`docker compose up` より前に + 完了しておく必要のある準備処理をプロジェクト側で記述するためのフック。 + + Returns: + True: フックが存在しなかった、または成功した + False: フックが失敗した(呼び出し側で `cmd_up` を中断する) + """ + pre_up_script = Path('./pre-up') + if not (pre_up_script.exists() and pre_up_script.is_file()): + return True + + logger.info("Running pre-up hook: %s", pre_up_script) + try: + subprocess.run(['bash', str(pre_up_script)], check=True, env=os.environ.copy()) + return True + except subprocess.CalledProcessError as e: + logger.error("pre-up hook failed (exit code %d)", e.returncode) + return False + + # --------------------------------------------------------------------------- # ディスパッチャ # --------------------------------------------------------------------------- @@ -105,6 +128,10 @@ def cmd_up(project_name: str = None, scale: int = None) -> int: logger.error("Failed to create .env file. Please run 'devbase env init' manually.") return 1 + # Pre-step: Run ./pre-up hook (e.g. clone source repos used as build contexts) + if not _run_pre_up_hook(): + return 1 + # Pre-check 2: Ensure container images exist if not _ensure_images(): logger.error(