binary assets
This commit is contained in:
@@ -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
@@ -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
@@ -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
|
||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user