binary assets

This commit is contained in:
2026-08-02 18:51:02 +02:00
parent 6661f957c6
commit 56054a21b4
4 changed files with 88 additions and 19 deletions
+22 -11
View File
@@ -4,13 +4,14 @@ CI/CD templates for [Ebitengine](https://ebitengine.org) (Go) game
projects, in the same spirit as [tic80-tools](../tic80-tools).
- `example-makefile.make` — project Makefile: local dev targets
(`build`, `wasm`, `export`, `watch`, `clean`) plus the Woodpecker
pipeline targets (`ci-version`, `ci-export`, `ci-upload`,
`ci-update`).
(`build`, `wasm`, `export`, `watch`, `clean`), native binary targets
(`binaries`, `binary-win-x86`, `binary-win-x64`, `binary-linux-x64`)
plus the Woodpecker pipeline targets (`ci-version`, `ci-export`,
`ci-binaries`, `ci-upload`, `ci-update`).
- `example-woodpecker.yaml` — Woodpecker pipeline: version → export
(Go, `GOOS=js GOARCH=wasm`) → upload (scp to the droparea) → update
(calls the teletypegames `/update` endpoint with
`platform=ebitengine`).
(Go, `GOOS=js GOARCH=wasm`) → binaries (native desktop zips) →
upload (scp to the droparea) → update (calls the teletypegames
`/update` endpoint with `platform=ebitengine`).
- `example-tasks.json` — VS Code `.vscode/tasks.json` with the common
dev tasks: **Run** (`go run .`, default build task, `Cmd+Shift+B`),
**Build & Run**, **Build WASM** and **Make build**.
@@ -26,16 +27,26 @@ projects, in the same spirit as [tic80-tools](../tic80-tools).
3. Copy `example-tasks.json` to `.vscode/tasks.json` and replace the
binary name (`ebitenginedemo`) with `$(PROJECT)`.
The pipeline uploads `$(PROJECT)-$(VERSION).html.zip` to the droparea,
then triggers
The pipeline uploads `$(PROJECT)-$(VERSION).html.zip` plus the native
binary zips (`$(PROJECT)-$(VERSION)-<target>.zip`, currently `win-x86`,
`win-x64`, `linux-x64`) to the droparea, then triggers
`/update?platform=ebitengine&name=$(PROJECT)&version=$(VERSION)`.
The updater picks up the binary zips by naming convention and attaches
them to the release as assets (see `teletypegames/NOTES_BINARY_PLAN.md`).
Binary zip layout: a single root folder
(`$(PROJECT)-$(VERSION)-<target>/`) containing the executable (plus
LICENSE/README.md when present). The zips are created with unix `zip`,
so the executable bit survives on the linux binary. mac targets need a
mac runner (or osxcross) and are not part of the pipeline yet.
## Builder image
`builder.Dockerfile` bakes the pipeline's build-step dependencies
(Go + git/make/zip/curl) into
`git.teletypegames.org/internal/ebitengine-builder`, so the build step
no longer runs `apk add` on every run:
(Go + git/make/zip/curl/jq and the X11/GL/ALSA dev libraries needed by
the cgo `linux-x64` build) into
`git.teletypegames.org/internal/ebitengine-builder`. Debian-based so
the linux binary links against glibc:
```sh
docker build --platform linux/amd64 -f builder.Dockerfile \
+18 -6
View File
@@ -1,6 +1,10 @@
# CI builder image for Ebitengine projects: Go toolchain + packaging tools.
# Used by the `build` step in example-woodpecker.yaml instead of installing
# zip/make/curl on every pipeline run.
# CI builder image for Ebitengine projects: Go toolchain + packaging tools
# + the X11/GL/ALSA dev libraries needed for the native linux-x64 (cgo) build.
# Used by the `build` and `binaries` steps in example-woodpecker.yaml instead
# of installing everything on every pipeline run.
#
# Debian-based (not alpine): the linux-x64 game binary must link against
# glibc, otherwise it won't run on regular desktop distros.
#
# Build & push (the CI runner is linux/amd64):
# docker build --platform linux/amd64 -f builder.Dockerfile \
@@ -8,10 +12,18 @@
# docker push git.teletypegames.org/internal/ebitengine-builder:latest
# 1.26 covers every current game repo's go.mod directive (1.25.x, 1.26.x).
FROM golang:1.26-alpine
FROM golang:1.26-bookworm
RUN apk add --no-cache git make zip curl
# Ebitengine linux build dependencies:
# https://ebitengine.org/en/documents/install.html (Debian/Ubuntu section)
RUN apt-get update && apt-get install -y --no-install-recommends \
git make zip curl jq pkg-config \
libc6-dev libgl1-mesa-dev libglu1-mesa-dev \
libx11-dev libxcursor-dev libxi-dev libxinerama-dev \
libxrandr-dev libxxf86vm-dev \
libasound2-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
CMD ["/bin/sh"]
CMD ["/bin/bash"]
+43 -2
View File
@@ -37,6 +37,42 @@ export: wasm
@echo "==> Cleaning temporary files"
rm -f $(DIST_DIR)/$(WASM_NAME) $(DIST_DIR)/wasm_exec.js $(DIST_DIR)/index.html
# --- native binaries (lásd: teletypegames/NOTES_BINARY_PLAN.md) -------------
# win-x86 / win-x64: pure Go cross-compile (Windowson nem kell cgo)
# linux-x64: cgo build, linux/amd64 hoston fut (builder image, X11/GL dev libekkel)
BINARY_TARGETS = win-x86 win-x64 linux-x64
binaries:
@if [ -z "$(VERSION)" ]; then \
echo "ERROR: VERSION not set!"; exit 1; \
fi
@for target in $(BINARY_TARGETS); do \
$(MAKE) binary-$$target VERSION=$(VERSION) || exit 1; \
done
binary-win-x86:
@$(MAKE) binary-build VERSION=$(VERSION) B_GOOS=windows B_GOARCH=386 B_CGO=0 B_EXT=.exe B_TARGET=win-x86
binary-win-x64:
@$(MAKE) binary-build VERSION=$(VERSION) B_GOOS=windows B_GOARCH=amd64 B_CGO=0 B_EXT=.exe B_TARGET=win-x64
binary-linux-x64:
@$(MAKE) binary-build VERSION=$(VERSION) B_GOOS=linux B_GOARCH=amd64 B_CGO=1 B_EXT= B_TARGET=linux-x64
# belső helper: egy target buildje + zip egyetlen gyökérmappával
# (a zipet unixos zip készíti, így a végrehajtási bit megmarad)
binary-build:
@PKG_DIR="$(PROJECT)-$(VERSION)-$(B_TARGET)"; \
echo "==> Building $$PKG_DIR"; \
rm -rf "$$PKG_DIR" "$$PKG_DIR.zip"; \
mkdir -p "$$PKG_DIR"; \
CGO_ENABLED=$(B_CGO) GOOS=$(B_GOOS) GOARCH=$(B_GOARCH) go build -o "$$PKG_DIR/$(PROJECT)$(B_EXT)" .; \
if [ -f LICENSE ]; then cp LICENSE "$$PKG_DIR/"; fi; \
if [ -f README.md ]; then cp README.md "$$PKG_DIR/"; fi; \
zip -r "$$PKG_DIR.zip" "$$PKG_DIR" >/dev/null; \
rm -rf "$$PKG_DIR"; \
echo "==> $$PKG_DIR.zip kesz"
watch:
fswatch -o . | while read; do make build; done
@@ -59,18 +95,23 @@ ci-export:
@VERSION=$$(cat $(VERSION_FILE)); \
$(MAKE) export VERSION=$$VERSION
ci-binaries:
@VERSION=$$(cat $(VERSION_FILE)); \
$(MAKE) binaries VERSION=$$VERSION
ci-upload:
@VERSION=$$(cat $(VERSION_FILE)); \
FILE="$(PROJECT)-$$VERSION.html.zip"; \
META_SRC="metadata.json"; \
META_DST="$(PROJECT)-$$VERSION.metadata.json"; \
BINS=$$(ls $(PROJECT)-$$VERSION-*.zip 2>/dev/null || true); \
cp $$META_SRC $$META_DST; \
sshpass -p "$(DROPAREA_SSH_PASSWORD)" scp -o StrictHostKeyChecking=no -P $(DROPAREA_PORT) \
$$FILE $$META_DST \
$$FILE $$META_DST $$BINS \
$(DROPAREA_USER)@$(DROPAREA_HOST):$(DROPAREA_TARGET_PATH)/
ci-update:
@VERSION=$$(cat $(VERSION_FILE)); \
curl "$(UPDATE_SERVER)/update?secret=$(UPDATE_SECRET)&name=$(PROJECT)&platform=ebitengine&version=$$VERSION"
.PHONY: all build wasm export watch clean ci-version ci-export ci-upload ci-update
.PHONY: all build wasm export watch clean binaries binary-win-x86 binary-win-x64 binary-linux-x64 binary-build ci-version ci-export ci-binaries ci-upload ci-update
+5
View File
@@ -10,6 +10,11 @@ steps:
commands:
- make ci-export
- name: binaries
image: git.teletypegames.org/internal/ebitengine-builder:latest
commands:
- make ci-binaries
- name: artifact
image: alpine
environment: