projects/<name>/project.yml は、1 つのプロジェクト(= 1 つの dev コンテナ群)が
どのリポジトリを開発対象にするかと、devbase 自身のふるまいを定義するファイルです。
Git 管理対象で、プロジェクト設定の正です。
1 プロジェクトに複数のリポジトリを登録でき、すべてが同じコンテナの /work 配下へ
clone されます。関連する複数リポジトリ(本体・ドキュメント・インフラなど)を 1 つの
開発環境で横断的に扱うための仕組みです。
version: 1
repos:
- owner: volareinc
repo: carmodevbase up すると、コンテナ内の /work/carmo にリポジトリが clone され、
ログイン直後の作業ディレクトリもそこになります。
version: 1
scale: 1
open_editor: true
defaults:
owner: uttaro-dev2
repos:
- repo: uttarov2 # 先頭が primary
host: gitlab.com # リポジトリごとにホストを変えられる
owner: uttaro_dev
dir: system # /work/system へ clone する
- repo: uttarov2-doc
- repo: uttarov2migration
branch: develop
init: falseリポジトリが 2 件以上あるとき、devbase up は全リポジトリを含む
multi-root ワークスペース /work/<プロジェクト名>.code-workspace を生成し、
エディタはそれを開きます(1 件のときは primary リポジトリのフォルダを開きます)。
| キー | 必須 | 既定値 | 説明 |
|---|---|---|---|
version |
はい | -- | スキーマ版。現在は 1 |
repos |
はい | -- | clone するリポジトリの配列(1 件以上) |
defaults |
いいえ | -- | repos の各要素へ継承させる既定値(host / owner / branch / init) |
scale |
いいえ | 2 |
起動するコンテナ数。devbase project scale N はこの値を書き換える |
open_editor |
いいえ | -- | devbase up 後に VS Code を自動で開くか。未指定なら env DEVBASE_OPEN_EDITOR に従う |
work_dir |
いいえ | primary の /work/<dir> |
エディタが開く既定フォルダを明示指定する。効くのはリポジトリが 1 件のときだけで、2 件以上のときは自動生成の multi-root ワークスペースが開かれる |
| キー | 必須 | 既定値 | 説明 |
|---|---|---|---|
owner |
はい | defaults.owner |
Git ホストのユーザー名または Organization 名 |
repo |
はい | -- | リポジトリ名 |
host |
いいえ | github.com |
Git ホスト名(例 gitlab.com) |
dir |
いいえ | repo と同じ |
/work 直下の clone 先ディレクトリ名 |
branch |
いいえ | リポジトリの既定ブランチ | clone 直後にチェックアウトするブランチ |
init |
いいえ | true |
リポジトリ直下の ./init.sh を実行するか。clone 直後だけでなくコンテナ起動のたび(既存 clone があっても)実行されます |
primary |
いいえ | 先頭要素が true |
ログイン直後の作業ディレクトリになるリポジトリ(1 件だけ指定可) |
clone URL は https://<host>/<owner>/<repo>.git で組み立てられます。認証は
コンテナに渡された既存の Git 資格情報の仕組みに委ねます(project.yml に
資格情報は書きません)。
branch と init は実行タイミングが異なります。
| キー | 実行タイミング | 理由 |
|---|---|---|
branch |
clone 直後の 1 回だけ | 既存 clone にも毎回適用すると、コンテナ内で作業ブランチへ切り替えた状態が再起動のたびに引き戻されるため |
init |
コンテナ起動のたび(既存 clone があっても毎回) | 依存パッケージの再取得など、コンテナ再生成後にも必要な処理を置く場所のため |
init.sh は毎回走るので、何度実行しても同じ結果になる(冪等な)内容にしてください。
git clone や追記のような繰り返すと壊れる処理を書く場合は、スクリプト側で実行済みかを
判定してください。実行が重い・1 回だけでよい場合は init: false にして手動実行に切り替えます。
なお init.sh の失敗は警告に留まり、他リポジトリの処理とコンテナ起動は続行されます。
設定ミスを黙って無視せず、devbase up の時点でエラーにします。
owner/repoが無い、reposが空dirの重複(同じ/work/<dir>を 2 つのリポジトリが奪い合う)primary: trueが 2 件以上- 未知のキー(
brunch: mainのような打ち間違いが「書いたのに効かない」形で表れないため) repos[]のhost/owner/repo/dir/branchに空白・制御文字が混ざっているdirが/work直下から外れている(../や入れ子のパス、./..)
primary には権限があるがサブリポジトリには権限がない、という構成は起こりえます。この場合 権限のあるリポジトリだけが clone され、コンテナは通常どおり起動します。1 本 clone できない だけで開発環境ごと止めても、他のリポジトリでの作業まで巻き添えになるためです。
| 起きること | 挙動 |
|---|---|
| clone の失敗 | 警告を出して次のリポジトリへ進む。devbase up は成功で終わる (終了コード 0) |
devbase up の出力 |
/work に無いリポジトリを clone URL 付きで一覧表示する。揃っていれば何も出さない |
| multi-root ワークスペース | clone できたリポジトリだけが folders に載る。開けないフォルダは並ばない |
| primary が clone できなかった | 警告を出し、ログイン直後のカレントは /work になる |
clone はコンテナ起動のたびに試行されるので、後から権限が付与されれば次の devbase up で
取り込まれます。project.yml を直す必要はありません。
権限が無い場合も存在しない場合も、GitHub は private リポジトリに対して同じ
Repository not found (404) を返します。警告からは区別できないため、リポジトリ名の
打ち間違いも同じ見え方になります。詳細は devbase project logs <name> で確認してください。
| 書く場所 | 内容 | 例 |
|---|---|---|
project.yml |
devbase 自身の設定 | リポジトリ、コンテナ数、エディタの自動オープン |
env |
コンテナへ渡す環境変数 | ENABLE_SSH、アプリが読む設定値 |
.env |
プロジェクト固有の機密 | API キー、DB 接続情報 |
project.local.yml |
個人・機材ごとの devbase 設定(git 管理しない) | 別ホストの docker context、リモート側の HOME / gid |
compose.yml が env_file: - env で参照するため、env はファイル自体が必須です。
渡したい環境変数が無ければ空ファイルで構いませんが、削除すると devbase up が
compose の起動時に失敗します。
projects/<name>/project.local.yml は、同じプロジェクトを使う他の人には関係ない設定を
置くファイルです。project.yml はチームで共有される正ですが、「このプロジェクトのコンテナは
別ホストの Docker に立てる」は個人の事情で、リモート側の HOME や docker グループの gid は
機材そのものに依存します。共有ファイルに混ぜると、同じ project.yml を使う他の人の
devbase up が壊れるため、別ファイルにします。
devbase-samples / devbase-ext などプロジェクト定義を持つリポジトリでは、.gitignore に
project.local.yml を加えてください(devbase 本体は projects/* ごと除外済みです)。
# projects/<name>/project.local.yml
docker:
context: gpu-wsl # docker context ls に出る名前。未指定なら現在の context
home: /home/takemi # リモート側の HOME。bind mount の ~ をこの値で展開する
# gid: 999 # リモート側の docker グループ gid。省略時は初回の up で自動取得| キー | 必須 | 説明 |
|---|---|---|
docker.context |
いいえ | docker / docker compose を向ける docker context の名前。接続先の実体(ssh://user@host など)は書かず、各マシンの docker context create に委ねる |
docker.home |
いいえ | リモート側の HOME(絶対パス)。compose.yml の bind mount の ~ をこの値で展開する。未指定のままリモートへ向けると、~ は手元の HOME に展開されてリモートでは空ディレクトリになるため、devbase up が該当する mount を警告する |
docker.gid |
いいえ | リモート側の docker グループの gid(group_add: ["${DOCKER_GID}"] に渡る値)。未指定なら初回の up で docker run --rm -v /var/run/docker.sock:/s alpine:3 stat -c %g /s により取得し、$DEVBASE_ROOT/.cache/docker-gid/<context> に控える。rootless Docker や socket が root:root の構成では 0 が返るため明示する |
最上位に docker 以外のキーは書けません(scale / open_editor の個人上書きは今後の課題)。
project.yml に docker: を書くと、このファイルへ移すよう案内するエラーになります。
context の優先順位は CLI --context > env DEVBASE_DOCKER_CONTEXT(グローバル .env /
プロジェクト env)> project.local.yml の docker.context > 現在の docker context です。
一時的に別ホストへ向けたいときは devbase up --context <name> を使います。CLI / env で
ファイルと別の名前へ向けたときは、ファイルの home / gid は使いません(別の機材の
値を持ち込まないため)。
使い方の全体像(WSL / EC2 への context の作り方、VS Code の attach、制約)は 環境変数ガイドの「リモート Docker」 を参照してください。
GIT_USER / GIT_REPO / GIT_HOST / WORK_DIR / CONTAINER_SCALE /
DEVBASE_OPEN_EDITOR を env に書く旧形式は廃止されました。project.yml の無い
プロジェクトは devbase up が移行手順を案内して停止します。
変換は devbase project migrate-config
で行います。
devbase project migrate-config --dry-run # 変換結果を確認
devbase project migrate-config # 適用旧 env のキー |
移行先 |
|---|---|
GIT_USER |
repos[].owner |
GIT_REPO |
repos[].repo |
GIT_HOST |
repos[].host |
WORK_DIR |
work_dir(既定値と同じ場合は書きません) |
CONTAINER_SCALE |
scale |
DEVBASE_OPEN_EDITOR |
open_editor |
project.yml を編集する人が意識する必要はありませんが、仕組みを知っておくと
トラブルシュートに役立ちます。
flowchart LR
Y["project.yml<br/>(人が編集する正)"] -->|"devbase up がホスト側で正規化"| P["clone プラン<br/>DEVBASE_REPOS (base64)"]
P -->|"compose の dev サービスへ"| C["コンテナ"]
C -->|"entrypoint が復号して clone"| W["/work/<dir> ×N"]
YAML の解釈はホスト側の Python に閉じています。コンテナ側は復号して 1 行ずつ clone するだけなので、イメージへ YAML パーサを持ち込みません。
プロジェクトに pre-up / deploy フックを置いている場合、それらはホスト側で
動くため env を読み込めません。フックがよく必要とする値は、devbase が
project.yml から解決して環境変数として渡します。
| 環境変数 | project.yml の由来 |
|---|---|
DEVBASE_PRIMARY_DIR |
primary リポジトリの repos[].dir(未指定ならリポジトリ名) |
DEVBASE_PRIMARY_URL |
primary リポジトリの host / owner / repo から組み立てた clone URL |
DEVBASE_WORK_DIR |
work_dir(未指定なら /work/<primary の dir>) |
DEVBASE_REPO_DIRS |
repos[].dir を宣言順に空白区切りで並べたもの |
旧 env 形式のフックが source ./env で読んでいた GIT_REPO / WORK_DIR は、
それぞれ DEVBASE_PRIMARY_DIR / DEVBASE_WORK_DIR に置き換えてください。詳細は
プラグイン開発クイックスタート「フックへ渡る環境変数」
を参照してください。
Note:
entrypoint.shはイメージに焼き込まれます。devbase 本体を更新して clone のふるまいが変わった場合は、devbase build --no-cacheでベースイメージを 再ビルドしないと反映されません。