Batocera and the ES-family handhelds run on ARM, where a linux_x64 binary will not start. The image gains the aarch64 cross compiler and the arm64 dev libraries the pipeline links against. The image itself also moved out of the internal package namespace, which did not travel with the repo during the org reorganization. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
bevy-tools
CI/CD templates for Bevy (Rust) game projects, in the same spirit as ebitengine-tools and godot-tools.
example-makefile.make— project Makefile: local dev targets (build,run,wasm,export,binaries,watch,clean).example-woodpecker.yaml— a one-line marker (platform: bevy): the full pipeline (version → build → binaries → upload → publish) is served by the update server's Woodpecker configuration extension — preview it withcurl "https://teletypegames.org/build/config?platform=bevy".builder.Dockerfile— the CI builder image:rust:1-bookworm(glibc — bevy's native linux build needs alsa/udev, which does not build against musl) with the wasm +x86_64-pc-windows-gnutargets, mingw-w64, the wasm-bindgen CLI and make/zip/curl baked in.example-tasks.json— VS Code.vscode/tasks.jsonwith the common dev tasks: Run (cargo run, default build task,Cmd+Shift+B), Build & Run, Build WASM and Make build.web/index.html— the HTML shell downloaded bymake exportand packaged next to thewasm-bindgenoutput (game.js+game_bg.wasm).
Usage in a game repo
-
Copy
example-makefile.maketoMakefileand setPROJECT(must match the crate name inCargo.toml; the native binary is built tobin/$(PROJECT)). -
Pin the
wasm-bindgencrate inCargo.tomlto the exact version inWASM_BINDGEN_VERSION:[target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "=0.2.100"The
wasm-bindgenCLI and the crate must be the same version, otherwise the generated JS glue refuses to load. The builder image ships the CLI — when bumping the version, rebuild the image with the matching--build-arg WASM_BINDGEN_VERSION. -
Copy
example-woodpecker.yamlto.woodpecker.yaml(a one-line marker — the pipeline itself is served by the update server; addname:when the software name differs from the repo name) and add theapplication_tokensecret in Woodpecker (an ApplicationToken with theupdate+uploadscopes, created in the admin). -
Copy
example-tasks.jsonto.vscode/tasks.jsonand replace the binary name (bevydemo) with$(PROJECT).
Local WASM builds additionally need
rustup target add wasm32-unknown-unknown and the wasm-bindgen CLI
(cargo install wasm-bindgen-cli --version 0.2.100).
The served pipeline uploads $(PROJECT)-$(VERSION).html.zip and the native
binary zips (-win-x64.zip, -linux-x64.zip) via /build/upload, then
triggers /build/publish?platform=bevy&name=$(PROJECT)&version=$(VERSION).
The API's BinaryAttachment concern picks up the
<name>-<version>-<slug>.zip files automatically and registers them
as win_x64 / linux_x64 release assets.
Native binaries
make binaries VERSION=x.y builds:
- linux-x64 — a regular
cargo build --releasein the debian-based builder; the binary links against the builder's glibc and the usual desktop libs (alsa, udev). - win-x64 — mingw-w64 cross-compile via the
x86_64-pc-windows-gnutarget; the linker is set from the Makefile (CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER), no per-repo.cargo/configneeded. - mac — not built here: cgo-style native cross-compilation to darwin needs osxcross, the same (planned) toolchain as the ebitengine mac targets.
If the project has an assets/ directory it is packaged next to the
binary — bevy loads it at runtime, it is not embedded.
Builder image
docker build --platform linux/amd64 -f builder.Dockerfile \
--build-arg WASM_BINDGEN_VERSION=0.2.100 \
-t git.teletypegames.org/build/bevy-builder:latest .
docker push git.teletypegames.org/build/bevy-builder:latest
Detailed documentation lives on the wiki: /development/bevy.