release: formalize m2pack-full release tree layout + reproducible builder #11

Open
opened 2026-04-15 11:48:28 +02:00 by jann · 0 comments
Member

Today's 2026.04.15-m2pack-full release was built from an ad-hoc directory /home/mt2.jakubkadlec.dev/work/release-v2/client/ on the VPS, assembled by hand:

  1. Copy Metin2_RelWithDebInfo.exe from build-mingw64-lld/bin/ → rename to Metin2.exe
  2. Copy the sibling DLL / pyd / python314 embed bundle from the same bin dir
  3. Copy pack/, bgm/, mark/, config/ from /tmp/m2dev-client-runtime-http/
  4. Drop .offsingle, .prev*, .pck where a .m2p sibling exists
  5. Drop assets/, docs/, scripts/, upload/, log/, *.md, config.exe
  6. Inject runtime-key.json from m2pack export-runtime-key

No script, no commit, no reproducibility. If the tmpfs eats /tmp (which it almost did at 99% today) or someone else needs to cut a release, there is nothing to run.

Proposal

A scripts/build-release-tree.sh <dest> that:

  • takes the MinGW build dir and the canonical runtime as inputs (env vars or flags)
  • performs the six steps above deterministically
  • produces a tree under <dest>/client/ ready for make-manifest.py
  • optionally calls m2pack export-runtime-key if --key-dir is passed (covers #2 from the runtime-key issue)

Target location: m2dev-client/scripts/build-release-tree.sh next to the other release scripts.

Once this exists, make-release.sh can chain: build-release-tree → make-manifest → sign-manifest → blob tree build → atomic publish. That was the original design in docs/update-manager.md; we just haven't lifted the tree assembly into it yet.

Today's `2026.04.15-m2pack-full` release was built from an ad-hoc directory `/home/mt2.jakubkadlec.dev/work/release-v2/client/` on the VPS, assembled by hand: 1. Copy `Metin2_RelWithDebInfo.exe` from `build-mingw64-lld/bin/` → rename to `Metin2.exe` 2. Copy the sibling DLL / pyd / python314 embed bundle from the same bin dir 3. Copy `pack/`, `bgm/`, `mark/`, `config/` from `/tmp/m2dev-client-runtime-http/` 4. Drop `.offsingle`, `.prev*`, `.pck` where a `.m2p` sibling exists 5. Drop `assets/`, `docs/`, `scripts/`, `upload/`, `log/`, `*.md`, `config.exe` 6. Inject `runtime-key.json` from `m2pack export-runtime-key` No script, no commit, no reproducibility. If the tmpfs eats `/tmp` (which it almost did at 99% today) or someone else needs to cut a release, there is nothing to run. ## Proposal A `scripts/build-release-tree.sh <dest>` that: - takes the MinGW build dir and the canonical runtime as inputs (env vars or flags) - performs the six steps above deterministically - produces a tree under `<dest>/client/` ready for `make-manifest.py` - optionally calls `m2pack export-runtime-key` if `--key-dir` is passed (covers #2 from the runtime-key issue) Target location: `m2dev-client/scripts/build-release-tree.sh` next to the other release scripts. Once this exists, `make-release.sh` can chain: `build-release-tree → make-manifest → sign-manifest → blob tree build → atomic publish`. That was the original design in `docs/update-manager.md`; we just haven't lifted the tree assembly into it yet.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: metin-server/m2dev-client#11