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). projects, in the same spirit as [tic80-tools](../tic80-tools).
- `example-makefile.make` — project Makefile: local dev targets - `example-makefile.make` — project Makefile: local dev targets
(`build`, `wasm`, `export`, `watch`, `clean`) plus the Woodpecker (`build`, `wasm`, `export`, `watch`, `clean`), native binary targets
pipeline targets (`ci-version`, `ci-export`, `ci-upload`, (`binaries`, `binary-win-x86`, `binary-win-x64`, `binary-linux-x64`)
`ci-update`). plus the Woodpecker pipeline targets (`ci-version`, `ci-export`,
`ci-binaries`, `ci-upload`, `ci-update`).
- `example-woodpecker.yaml` — Woodpecker pipeline: version → export - `example-woodpecker.yaml` — Woodpecker pipeline: version → export
(Go, `GOOS=js GOARCH=wasm`) → upload (scp to the droparea) → update (Go, `GOOS=js GOARCH=wasm`) → binaries (native desktop zips) →
(calls the teletypegames `/update` endpoint with upload (scp to the droparea) → update (calls the teletypegames
`platform=ebitengine`). `/update` endpoint with `platform=ebitengine`).
- `example-tasks.json` — VS Code `.vscode/tasks.json` with the common - `example-tasks.json` — VS Code `.vscode/tasks.json` with the common
dev tasks: **Run** (`go run .`, default build task, `Cmd+Shift+B`), dev tasks: **Run** (`go run .`, default build task, `Cmd+Shift+B`),
**Build & Run**, **Build WASM** and **Make build**. **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 3. Copy `example-tasks.json` to `.vscode/tasks.json` and replace the
binary name (`ebitenginedemo`) with `$(PROJECT)`. binary name (`ebitenginedemo`) with `$(PROJECT)`.
The pipeline uploads `$(PROJECT)-$(VERSION).html.zip` to the droparea, The pipeline uploads `$(PROJECT)-$(VERSION).html.zip` plus the native
then triggers 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)`. `/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 image
`builder.Dockerfile` bakes the pipeline's build-step dependencies `builder.Dockerfile` bakes the pipeline's build-step dependencies
(Go + git/make/zip/curl) into (Go + git/make/zip/curl/jq and the X11/GL/ALSA dev libraries needed by
`git.teletypegames.org/internal/ebitengine-builder`, so the build step the cgo `linux-x64` build) into
no longer runs `apk add` on every run: `git.teletypegames.org/internal/ebitengine-builder`. Debian-based so
the linux binary links against glibc:
```sh ```sh
docker build --platform linux/amd64 -f builder.Dockerfile \ 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. # CI builder image for Ebitengine projects: Go toolchain + packaging tools
# Used by the `build` step in example-woodpecker.yaml instead of installing # + the X11/GL/ALSA dev libraries needed for the native linux-x64 (cgo) build.
# zip/make/curl on every pipeline run. # 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): # Build & push (the CI runner is linux/amd64):
# docker build --platform linux/amd64 -f builder.Dockerfile \ # docker build --platform linux/amd64 -f builder.Dockerfile \
@@ -8,10 +12,18 @@
# docker push git.teletypegames.org/internal/ebitengine-builder:latest # 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). # 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 WORKDIR /workspace
CMD ["/bin/sh"] CMD ["/bin/bash"]
+43 -2
View File
@@ -37,6 +37,42 @@ export: wasm
@echo "==> Cleaning temporary files" @echo "==> Cleaning temporary files"
rm -f $(DIST_DIR)/$(WASM_NAME) $(DIST_DIR)/wasm_exec.js $(DIST_DIR)/index.html 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: watch:
fswatch -o . | while read; do make build; done fswatch -o . | while read; do make build; done
@@ -59,18 +95,23 @@ ci-export:
@VERSION=$$(cat $(VERSION_FILE)); \ @VERSION=$$(cat $(VERSION_FILE)); \
$(MAKE) export VERSION=$$VERSION $(MAKE) export VERSION=$$VERSION
ci-binaries:
@VERSION=$$(cat $(VERSION_FILE)); \
$(MAKE) binaries VERSION=$$VERSION
ci-upload: ci-upload:
@VERSION=$$(cat $(VERSION_FILE)); \ @VERSION=$$(cat $(VERSION_FILE)); \
FILE="$(PROJECT)-$$VERSION.html.zip"; \ FILE="$(PROJECT)-$$VERSION.html.zip"; \
META_SRC="metadata.json"; \ META_SRC="metadata.json"; \
META_DST="$(PROJECT)-$$VERSION.metadata.json"; \ META_DST="$(PROJECT)-$$VERSION.metadata.json"; \
BINS=$$(ls $(PROJECT)-$$VERSION-*.zip 2>/dev/null || true); \
cp $$META_SRC $$META_DST; \ cp $$META_SRC $$META_DST; \
sshpass -p "$(DROPAREA_SSH_PASSWORD)" scp -o StrictHostKeyChecking=no -P $(DROPAREA_PORT) \ 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)/ $(DROPAREA_USER)@$(DROPAREA_HOST):$(DROPAREA_TARGET_PATH)/
ci-update: ci-update:
@VERSION=$$(cat $(VERSION_FILE)); \ @VERSION=$$(cat $(VERSION_FILE)); \
curl "$(UPDATE_SERVER)/update?secret=$(UPDATE_SECRET)&name=$(PROJECT)&platform=ebitengine&version=$$VERSION" 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: commands:
- make ci-export - make ci-export
- name: binaries
image: git.teletypegames.org/internal/ebitengine-builder:latest
commands:
- make ci-binaries
- name: artifact - name: artifact
image: alpine image: alpine
environment: environment: