Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
688efde
chore: v3.7.0 の release ブランチを開く
takemi-ohama Sep 21, 2026
5ad056b
docs(PLAN63): base イメージの日本語の描画と、文書を扱う軽量の道具の要求仕様と設計 (#161, #160) (#221)
takemi-ohama Sep 22, 2026
5c4cd82
設計(PLAN64): 機密の参照の見出しにグループの読み替えの前後を出す (#188) (#223)
takemi-ohama Sep 22, 2026
c3c0d3b
設計(PLAN65): devbase scale の Compose 呼び出しを共通経路へ寄せ、cmd_scale の段階を分ける (#…
takemi-ohama Sep 22, 2026
33ee9ef
設計(PLAN66): 名前の形に合わないプロジェクトを、作られた時点で知らせる (#203) (#230)
takemi-ohama Sep 22, 2026
c75c1cc
docs: [name] / --context を取るサブコマンドの列挙を揃え、profiles に requires.devbase …
takemi-ohama Sep 22, 2026
b112584
test: pytest のセッション全体で DEVBASE_ROOT を隔離する (#209) (#217)
takemi-ohama Sep 22, 2026
eaa9e5d
refactor(PLAN65): devbase scale と login の Compose 呼び出しを共通経路へ寄せる (#192…
takemi-ohama Sep 22, 2026
ff48e8e
refactor(PLAN65): cmd_scale の段階を前提の検査と段階の実行へ分ける (#192) (#232)
takemi-ohama Sep 22, 2026
1111926
feat(PLAN66): 名前の形に合わないプロジェクトを、作られた時点で知らせる (#203) (#233)
takemi-ohama Sep 22, 2026
9879093
refactor(PLAN66): スナップショットの名前の検証を utils/names の述語へ寄せる (#203) (#235)
takemi-ohama Sep 22, 2026
fb969a4
fix(PLAN64): 機密の参照の見出しにグループの読み替えの前後を出す (#188) (#237)
takemi-ohama Sep 22, 2026
03459ce
feat(PLAN63): base イメージの日本語の描画を直し、文書を扱う軽量の道具を足す (#161, #160) (#238)
takemi-ohama Sep 22, 2026
3e7f7d7
docs: PLAN63 / PLAN64 / PLAN65 / PLAN66 を確定仕様へ取り込む (#161, #160, #188,…
takemi-ohama Sep 22, 2026
95f3221
chore(release): v3.7.0 (#241)
takemi-ohama Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 58 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,62 @@

## [Unreleased]

## [3.7.0] - 2026-09-23

### Added
- **base イメージに、Office 文書・PDF を扱う軽量の道具を足しました(PLAN63 / #160)。**
`poppler-utils`(`pdftoppm` / `pdfinfo` / `pdffonts` / `pdftocairo`)、`python3-pil`、
`python3-defusedxml`、`python3-lxml` で、PDF を画像にする・調べる、OOXML を壊さずに
読み書きすることが base だけでできます。あわせて欧文の metric 互換の
`fonts-crosextra-carlito` / `fonts-crosextra-caladea` を入れ、`Calibri` / `Cambria` の
指定が正しい字幅の書体(Carlito / Caladea)へ解決されるようにしました(これまでは
どちらも中国語フォントへ落ちていました)。**LibreOffice と `pip` は入れていません。**
Python パッケージが要るときは既にある `uv` / `uvx` を使ってください。
**反映には `devbase build base --no-cache` が要ります。**
- **名前の形に合わないプロジェクト(`_foo` など)が `projects/` に載る時点で、警告を 1 行出すように
しました(PLAN66 / #203)。** `devbase plugin install` / `update` / `sync` は、プラグインの
プロジェクト・衝突のときに合成する別名 `<名前>.<owner>`・`projects/` 直下の実ディレクトリの
名前を見ます。`devbase env import` は取り込むプロジェクト名を見て、保存先が `projects/` の外
(age・サーバ backend)ならそのことも知らせます(`--dry-run` でも出ます)。知らせるだけで弾かず、
作られる symlink・ディレクトリと終了コードは変わりません。そうした名前は名前を指定した操作
(`devbase up _foo` など)ができず、そのディレクトリの中で名前なしに打てば動きます。

### Changed
- **`devbase scale` が、端末や `.env` に置いた `COMPOSE_PROFILES` を見なくなりました(PLAN65 / #192)。**
`devbase scale` が呼ぶ Compose の子プロセスでも `COMPOSE_PROFILES` を打ち消すようにしたためで、
`COMPOSE_PROFILES` を置いている場合、`devbase scale` はプロファイルのサービスを起動しなくなります。
確定仕様は以前から「`COMPOSE_PROFILES` を端末や `.env` に置いても devbase 経由の操作には効かない」と
定めており、`scale` だけが例外になっていたものを揃えました。プロファイルのサービスを起動するには
`devbase project profile up <名前>` を使ってください。プロファイルを持たないプロジェクトでは、
`devbase scale` が起動の対象にするサービスの集合は変わりません。`devbase login` の `exec` も同じ
環境を通るようになりましたが、観測できる振る舞いは変わりません。
- **スナップショットの名前が、末尾に改行を持つ値(`abc\n`)を受け付けなくなりました(PLAN66 / #203)。**
スナップショットの名前の検証を、位置引数のプロジェクト名と同じ規則(`utils/names`)へ寄せました。
それ以外に受け付ける名前と、エラーの文言は変わりません。

### Fixed
- **base コンテナで日本語が中国語のフォントで描画される問題を直しました(PLAN63 / #161)。**
総称ファミリ(`sans-serif` / `sans` / `serif` / `monospace`)と、イメージに無い書体名
(`Meiryo` / `Yu Gothic` / `MS PGothic` / `Noto Sans JP` など)が、Noto CJK の **JP**
フェイスへ解決されるようになります。これまでは `sans-serif` そのものが中国語フォント
(WenQuanYi Zen Hei)へ解決され、Chromium / Playwright のスクリーンショット・PDF の生成・
画像の生成のすべてが中国語の字形で写っていました。欧文(`Arial` / `Times New Roman` /
`Courier New`)は Liberation の metric 互換のままで、`lang=zh-cn` / `lang=ko` を明示した
指定は、その言語の、しかも同じ様式(sans / serif / 等幅)のフェイスのままです。
**言語を明示しない中国語は日本語の字形で描かれるようになります**(意図した変更です)。
設定は `/etc/fonts/local.conf` に置いており、個人の `~/.config/fontconfig/fonts.conf` で
上書きできます。**反映には `devbase build base --no-cache` が要ります。** `devbase up`
だけでは変わらず、派生イメージ(`general` など)を使っているプロジェクトは、その派生
イメージも建て直してください。
- **`group_aliases` のある置き場で、機密の参照の見出しがグループの読み替えの前と後を出すように
しました(PLAN64 / #188)。** `devbase env list` の節の見出しと件数の行、`devbase env backend test`
の参照ごとの行、`devbase env backend migrate` の移行の計画の一覧と `--to age` の完了後の一覧が、
`グローバル(グループ default)` から `グローバル(グループ default → nyle)` になります。これまでは
読み替える前の名前だけが出て、隣に並ぶパス(`devbase/team/nyle/global`)と食い違って見えていました。
読み替えの対応が無いグループ・`version: 1` ・ファイル backend(`plaintext` / `age`)の見出しと、
エラー文言・警告・ログ・`devbase env backend status` の表示は変わりません。置き場のパス・サーバへの
要求・キャッシュにも影響しません。

## [3.6.0] - 2026-09-19

### Added
Expand Down Expand Up @@ -694,7 +750,8 @@ OSS 化に伴う初回リリース。devbase は本バージョンより `devbas
### Removed
- 「公式レジストリ」固定の概念を廃止。各レジストリは対等な扱いとなる。

[Unreleased]: https://github.com/devbasex/devbase/compare/v3.6.0...HEAD
[Unreleased]: https://github.com/devbasex/devbase/compare/v3.7.0...HEAD
[3.7.0]: https://github.com/devbasex/devbase/compare/v3.6.0...v3.7.0
[3.6.0]: https://github.com/devbasex/devbase/compare/v3.5.0...v3.6.0
[3.5.0]: https://github.com/devbasex/devbase/compare/v3.4.0...v3.5.0
[3.4.0]: https://github.com/devbasex/devbase/compare/v3.3.0...v3.4.0
Expand Down
21 changes: 20 additions & 1 deletion containers/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,13 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
openssh-client \
curl ca-certificates gnupg lsb-release \
libnss3 libxrandr2 libxss1 \
fonts-noto-cjk fonts-noto-cjk-extra; \
fonts-noto-cjk fonts-noto-cjk-extra \
# 欧文の metric 互換 (Calibri -> Carlito / Cambria -> Caladea)。
# 30-metric-aliases.conf が既に対応を持っており、実体が無いと中国語フォントへ落ちる。
fonts-crosextra-carlito fonts-crosextra-caladea \
# 文書を扱う軽量の道具 (#160)。PDF を画像にする・調べる、OOXML を壊さずに読み書きする。
# LibreOffice (展開 372〜459MB) と pip は入れない。Python パッケージは uv / uvx で賄う。
poppler-utils python3-pil python3-defusedxml python3-lxml; \
# ロケール設定
locale-gen en_US.UTF-8; \
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8; \
Expand Down Expand Up @@ -250,6 +256,19 @@ COPY --chmod=0755 tmux-clean /usr/local/bin/tmux-clean
RUN sudo ln -sf tmux-first /usr/local/bin/tmux1 \
&& sudo ln -sf tmux-clean /usr/local/bin/tmuxc

# フォントの既定。素の fontconfig は sans-serif を中国語フェイス (WenQuanYi Zen Hei) へ
# 向けるため、日本語を描くと中国語の字形で写る (#161)。/etc/fonts/local.conf は
# conf.d/51-local.conf 経由で読まれ、これを中国語へ向けている 64 / 65 より「先」になる。
# conf.d/99-*.conf へ置くと <alias><prefer> が効かない。理由と実測は fonts-local.conf の
# 先頭のコメントにある。利用者は ~/.config/fontconfig/fonts.conf (スロット 50) で上書きできる。
COPY --chmod=0644 fonts-local.conf /etc/fonts/local.conf

# フォントのキャッシュを作り直す。上の Playwright の RUN が --with-deps で
# fonts-wqy-zenhei / fonts-ipafont-gothic / fonts-liberation を入れた「後」でなければ、
# 後から入った書体を知らないキャッシュが残る。直後に ~/.cache を消しているため、
# ここで /var/cache/fontconfig を作り直してコンテナ初回起動時の生成を避ける。
RUN sudo fc-cache -f

# entrypoint と dind
COPY --chmod=755 entrypoint.sh /entrypoint.sh
COPY --chmod=755 dind /usr/local/bin/dind
Expand Down
101 changes: 101 additions & 0 deletions containers/base/fonts-local.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<!--
base コンテナの日本語の描画 (devbasex/devbase#161)

このファイルは /etc/fonts/local.conf へ置く。conf.d/ へ置いてはいけない。

/etc/fonts/fonts.conf は <include>conf.d</include> の 1 行しか持たず、conf.d を番号順に
読む。local.conf は conf.d/51-local.conf 経由で読まれる ── つまりスロット 51 で、
sans-serif を WenQuanYi Zen Hei (中国語) へ向けている 64-wqy-zenhei.conf と
65-nonlatin.conf より「先」である。

<prefer> は一致した総称ファミリの直前へ挿入する (prepend) ため、最も早く読まれた
<prefer> が先頭に残る。効くのは順序が後だからではなく、先だからである。

同じ内容を conf.d/99-devbase-fonts.conf へ置いて実測した結果 (2026-09-22、arm64):

置き場所 fc-match sans-serif fc-match sans-serif:lang=ja
/etc/fonts/local.conf Noto Sans CJK JP Noto Sans CJK JP
/etc/fonts/conf.d/99-devbase-fonts.conf WenQuanYi Zen Hei WenQuanYi Zen Hei

<match target="pattern"> の規則 (下の zh-cn / ko) はどのスロットからでも効くが、
<alias><prefer> は 64 / 65 より先に読まれないと効かない。だから 99 では直らない。
規則の種類によって順序への依存が違うため、「99 でも一部は効く」ことを知らないと、
部分的に直ったのを見て置き場所の問題を見落とす。

利用者は ~/.config/fontconfig/fonts.conf (スロット 50、このファイルより先) で
上書きできる。実測で確認済み。
-->
<fontconfig>
<!-- 総称ファミリの先頭を日本語フェイスにする -->
<alias><family>sans-serif</family><prefer><family>Noto Sans CJK JP</family></prefer></alias>
<alias><family>sans</family><prefer><family>Noto Sans CJK JP</family></prefer></alias>
<alias><family>serif</family><prefer><family>Noto Serif CJK JP</family></prefer></alias>
<alias><family>monospace</family><prefer><family>Noto Sans Mono CJK JP</family></prefer></alias>

<!--
未導入の書体を指定されたときの受け皿 (Meiryo / Yu Gothic / MS PGothic /
Zen Kaku Gothic New など)。弱い結合なので実在する指定は妨げない。Arial は
30-metric-aliases.conf (スロット 30、このファイルより先) の強い結合で
Liberation Sans へ向くため、受け皿は末尾に付くだけで結果を変えない。
-->
<match target="pattern">
<edit name="family" mode="append" binding="weak"><string>Noto Sans CJK JP</string></edit>
</match>

<!--
中国語・韓国語を明示したときは、その言語の、しかも同じ様式のフェイスを保つ。
総称ファミリを名指しした指定にだけ効かせる (<test name="family">)。

この test を省くと、Arial:lang=zh-cn のような欧文の指定まで CJK のフェイスへ
奪われる (binding="strong" の前置は名指しの書体よりも強いため)。実測済み。
様式も崩れる ── serif:lang=zh-cn が sans のフェイスになり、monospace:lang=zh-cn が
等幅でなくなる。だから総称ファミリ 4 つ × 言語 2 つ = 8 つを並べる。

zh-cn は OS 既定の 65-nonlatin.conf と 70-fonts-noto-cjk.conf が正しく扱うので
規則なしでも合うが、ko は合わない (上の <alias> が JP を先頭にするため、韓国語が
日本語の字形になる)。ko だけ書くと非対称で後から読めないため、8 つで対称にする。
-->
<match target="pattern">
<test name="family"><string>sans-serif</string></test>
<test name="lang" compare="contains"><string>zh-cn</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK SC</string></edit>
</match>
<match target="pattern">
<test name="family"><string>sans</string></test>
<test name="lang" compare="contains"><string>zh-cn</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK SC</string></edit>
</match>
<match target="pattern">
<test name="family"><string>serif</string></test>
<test name="lang" compare="contains"><string>zh-cn</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Serif CJK SC</string></edit>
</match>
<match target="pattern">
<test name="family"><string>monospace</string></test>
<test name="lang" compare="contains"><string>zh-cn</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans Mono CJK SC</string></edit>
</match>

<match target="pattern">
<test name="family"><string>sans-serif</string></test>
<test name="lang" compare="contains"><string>ko</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK KR</string></edit>
</match>
<match target="pattern">
<test name="family"><string>sans</string></test>
<test name="lang" compare="contains"><string>ko</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK KR</string></edit>
</match>
<match target="pattern">
<test name="family"><string>serif</string></test>
<test name="lang" compare="contains"><string>ko</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Serif CJK KR</string></edit>
</match>
<match target="pattern">
<test name="family"><string>monospace</string></test>
<test name="lang" compare="contains"><string>ko</string></test>
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans Mono CJK KR</string></edit>
</match>
</fontconfig>
2 changes: 1 addition & 1 deletion docs/developer/architecture.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# devbase アーキテクチャ概要

devbase v3.6.0 のアーキテクチャ設計と内部構造について説明する。
devbase v3.7.0 のアーキテクチャ設計と内部構造について説明する。

## 全体構成

Expand Down
22 changes: 21 additions & 1 deletion docs/plugin-dev/compose-profiles.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ dev のほかに app / db などのサービスを持つプロジェクトで、
| 項目 | 条件 |
| --- | --- |
| Docker Compose | **2.20.0 以上**。`depends_on` の `required` を使うため。動作を確かめたのは v5.1.4 |
| devbase | `devbase project profile` があるバージョン |
| devbase | **3.5.0 以上**。`devbase project profile` が入った版です(CHANGELOG の `[3.5.0]`)。Plugin として配るなら [`plugin.yml` の `requires.devbase` も上げます](#plugin-として配るなら-requiresdevbase-を-350-以上へ上げる) |

## 1. `compose.yml` の書き方

Expand Down Expand Up @@ -43,6 +43,26 @@ services:

プロファイル名に `__devbase_none__` は使わないでください。devbase が「どのプロファイルも有効にしない」ために予約している名前です。

### Plugin として配るなら `requires.devbase` を 3.5.0 以上へ上げる

`profiles:` を使うプロジェクトを含む Plugin は、`plugin.yml` の `requires.devbase` を
`">=3.5.0"` へ上げてください。`compose.yml` を書き換えたのと同じ Pull Request で上げます。

```yaml
# <plugin>/plugin.yml
requires:
devbase: ">=3.5.0"
```

3.5.0 未満の devbase では、`profiles:` を付けたサービスが `devbase up` の起動対象から外れたまま、
後から起動する手段(`devbase project profile up`)もありません。テスト用サーバ群が黙って起動
しない状態になります。

`requires.devbase` を上げておけば、新規の `devbase plugin install` はその場で拒否され、
`devbase plugin update` では警告が出ます。仕組みは既にあるため、Plugin 側でやることは版数を
書くことだけです。書式(必ずクォートする)と検証の詳細は
[`plugin.yml` リファレンスの `requires`](plugin-yml-reference.md#requires) を参照してください。

## 2. コマンド

```bash
Expand Down
11 changes: 9 additions & 2 deletions docs/plugin-dev/plugin-yml-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,15 @@ WARNING プラグイン 'carmo-web' は devbase >=4.0.0 を要求しています
devbase 本体を更新してください (この警告を止める場合は DEVBASE_IGNORE_PLUGIN_REQUIRES=1)。
```

> `requires.devbase` を上げるのは、**Plugin が `project.yml` 形式へ移行したタイミング**です。
> 本体の版数と一緒に自動では上がりません。
> **`requires.devbase` は本体の版数と一緒に自動では上がりません。** 上げるのは、**Plugin が
> devbase の新しい機能に依存しはじめたタイミング**です。契機は次のとおりです。
>
> | 契機 | 上げる版数 |
> | --- | --- |
> | Plugin が `project.yml` 形式へ移行した | その形式を読める版 |
> | Plugin のプロジェクトが `compose.yml` に `profiles:` を使う | `">=3.5.0"`([テスト用サーバを後から起動・停止する](compose-profiles.md#plugin-として配るなら-requiresdevbase-を-350-以上へ上げる)) |
>
> どちらも、その機能を使い始めた Pull Request で一緒に上げます。

### `priority`

Expand Down
Loading
Loading