Godot is an open source 2D and 3D game engine with a visual editor. Scripting in GDScript or C#.
Website: https://godotengine.org
The Godot editor runs headless and exports the web build (HTML5/WASM) plus the desktop binaries. Templates are in godot-tools:
example-makefile.make → Makefile, then set PROJECTexample-export_presets.cfg → export_presets.cfg (presets: Web, Windows x86, Windows x64, Linux x64, Mac universal)Mac universal set application/bundle_identifierTwo settings that are easy to miss:
# project.godot — the arm64 macOS slice fails to export without this
[rendering]
textures/vram_compression/import_etc2_astc=true
# export_presets.cfg, Web preset — no threads, so the game runs without COOP/COEP headers
variant/thread_support=false
| Variable | Description | Default |
|---|---|---|
PROJECT |
Name used in output filenames | godotdemo |
GODOT |
Godot editor binary | godot |
EXPORT_PRESET |
Preset in export_presets.cfg |
Web |
DIST_DIR |
Artifact directory | dist |
WEB_DIR |
Raw web export | dist/web |
VERSION_FILE |
Version file for CI | .version |
make build # godot --headless --import, creates .godot/ cache
make run # godot --path .
make web # export the Web preset into dist/web/
make export VERSION=1.0.0 # web export packed as godotdemo-1.0.0.html.zip
make binaries VERSION=1.0.0 # all desktop targets
make binary-win-x64 VERSION=1.0.0 # one target only
make watch # re-import on .gd / .tscn change (needs fswatch)
make clean # remove dist/ and .godot/
build is also a quick "does the project load" check. Run it on a fresh checkout before any export.
Desktop notes:
.app is ad-hoc signed by Godot (codesign/codesign=1); arm64 macOS refuses unsigned binaries..pck in the executable, so each zip holds a single file.Copy example-tasks.json to .vscode/tasks.json. Tasks: Run (default, Cmd+Shift+B), Edit, Export Web, Make build.
| File | Description |
|---|---|
dist/web/ |
Raw web export (index.html, .js, .wasm, .pck) |
godotdemo-<version>.html.zip |
Web build |
godotdemo-<version>-win-x86.zip |
Windows 32-bit |
godotdemo-<version>-win-x64.zip |
Windows 64-bit |
godotdemo-<version>-linux-x64.zip |
Linux 64-bit |
godotdemo-<version>-mac-universal.zip |
macOS universal .app, ad-hoc signed |
Local only: make, a Godot 4.x binary with export templates (web + desktop), export_presets.cfg, zip, unzip, and fswatch for watch mode. CI needs nothing in the repo.
Game repos contain no pipeline YAML and no CI make targets. Woodpecker asks the update server, and WarpEngine serves the whole config from /build/config (template lib/warp_engine/ci_templates/godot.yaml.erb).
The repo needs three things:
# .woodpecker.yaml
platform: godot
metadata.jsonapplication_token Woodpecker secret: a WarpEngine ApplicationToken with update + upload scopesname: <software> in the marker only when the software name differs from the repo nameBuilder images (e.g. godot-builder:4.7.1) come from the update server's ci_platforms config. Preview the served pipeline:
curl "https://teletypegames.org/build/config?platform=godot"
| Step | What it does |
|---|---|
| 1. version | read the version from metadata.json, else the git short hash; outside main/master prefix it as dev-<version>-<branch>; write .version |
| 2. build | in the godot-builder image: import, export the Web preset, then the four desktop targets; pack each into its own zip |
| 3. upload | copy metadata.json to godotdemo-<version>.metadata.json, then POST /build/upload per file with the X-Update-Secret header |
| 4. publish | POST /build/publish with name, platform, version |
The builder image is godot-ci (headless editor and the matching export templates) with make, zip, unzip and jq added, so no step runs apt-get. It is built from builder.Dockerfile in godot-tools.
curl -X POST -H "X-Update-Secret: <SECRET>" \
"https://teletypegames.org/build/publish?name=godotdemo&platform=godot&version=1.0.0"
Web build and four desktop targets, each in its own zip, attached to the release as ReleaseAssets and downloadable from the catalog page. The public game index updates itself.