GitHub Action
roves-action — wire mach build/mach bundle into your own game's CI.
roves-action is a GitHub Action — a
reusable, automated step for the kind of workflow described in the accordion above. It lets
you delegate what you'd otherwise do by hand with the
Shell or
Packmaster to an online job instead — one
GitHub starts for you on a Windows, macOS, or Linux machine on demand, to generate your
package without you sitting in front of any of them.
By default it packages your already-built web content into a native bundle the same way
Packmaster does: it downloads the same
prebuilt roves_shell_<platform>[_steam].zip release asset Packmaster itself uses and packs
your content into it — nothing gets compiled, so there's no native toolchain to install at
all. See Advanced mode below for the opt-in, slower path that compiles the
engine from source instead.
The big advantage over Packmaster either way: this runs on whichever operating system you need — Windows, macOS, or Linux — as a GitHub-hosted job, without you ever installing anything on your own machine. You only ever provide your already-built web content.
Base mode (the default)
Add DRincs-Productions/roves-action@v1
as a step in your own workflow — this is the action that actually generates your game. Its
only required input is content-dir, pointing at your already-built web content; every other input
(see Inputs below) defaults sensibly, and by default it produces a portable,
no-install-step game for whichever platform the job runs on.
Triggered by pushing a version tag, a matrix starts one job per desktop platform
(windows-latest/macos-latest/ubuntu-latest) in parallel, each running this action once
and uploading its own output to a real GitHub Release created first — the same
create-then-upload shape this repo's own release workflows use:
name: Release
on:
push:
tags:
- 'v*'
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: create the GitHub Release for this tag
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release create "${{ github.ref_name }}" --title "My Game ${{ github.ref_name }}"
build-and-publish:
needs: create-release
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- platform: windows-latest
os_name: windows
- platform: macos-latest
os_name: macos
- platform: ubuntu-latest
os_name: linux
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- name: build game content
uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm install && npm run build
- name: build & bundle with Roves
id: roves
uses: DRincs-Productions/roves-action@v1
with:
content-dir: dist
artifact-name: my-game_${{ matrix.os_name }}
- name: upload to the release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload "${{ github.ref_name }}" "${{ steps.roves.outputs.archive-path }}"Inputs
| Name | Description |
|---|---|
content-dir | Required. Path to your already-built web content (e.g. a Vite/webpack dist/ folder). |
artifact-name | Base name for the output folder and zip (default roves-game). |
features | '' (default) or 'steam', for the Steam bridge. |
content-compress, content-compression-level, content-max-pack-size, content-exclude, content-boot-include | How your content gets packed into the bundle — see Content packing. |
deb / msi / dmg, package-name, package-version | Build an installer instead of a portable bundle — see Distributing installers below. |
html-file | Entry HTML file, relative to content-dir (default index.html). |
window-size | Initial window size, e.g. 1280x720 (the default). |
output | Where the bundle gets written, relative to your repo root. Usually left unset — the action picks its own path and exposes it via bundle-dir/archive-path regardless. |
diagnostic-script | Ship a diagnose.bat/diagnose.sh alongside the bundle (portable/msi/dmg, not deb) that launches the game from a console and prints its exit code plus roves.log — for testers to run when a build appears to do nothing. Off by default. |
bundle-params | Extra launch arguments baked into the bundle, passed to the game every time it starts. |
Outputs
| Name | Description |
|---|---|
bundle-dir | Absolute path to the unzipped bundle folder (named artifact-name) |
archive-path | Absolute path to <artifact-name>.zip |
Distributing installers
Each platform also has one installable input, gated to its own OS — setting one on the wrong runner is silently ignored, so a single input set (even with more than one turned on) can stay the same across a matrix:
Platform (runner.os) | Installable input | Produces |
|---|---|---|
Windows | msi: 'true' | A real .msi (needs WiX's candle/light on PATH — this action adds it for you on windows-latest) |
macOS | dmg: 'true' | play.app wrapped in a .dmg |
Linux | deb: 'true' | A real .deb |
The same matrix shape as Base mode above, with one installable input added per platform instead:
name: Release
on:
push:
tags:
- 'v*.*.*'
jobs:
create-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: create the GitHub Release for this tag
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release create "${{ github.ref_name }}" --title "My Game ${{ github.ref_name }}"
build-and-publish:
needs: create-release
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- platform: windows-latest
os_name: windows
msi: 'true'
- platform: macos-latest
os_name: macos
dmg: 'true'
- platform: ubuntu-latest
os_name: linux
deb: 'true'
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- name: build game content
uses: actions/setup-node@v4
with:
node-version: '22'
- run: npm install && npm run build
- name: build & bundle with Roves
id: roves
uses: DRincs-Productions/roves-action@v1
with:
content-dir: dist
artifact-name: my-game_${{ matrix.os_name }}
msi: ${{ matrix.msi || 'false' }}
dmg: ${{ matrix.dmg || 'false' }}
deb: ${{ matrix.deb || 'false' }}
package-name: my-game
package-version: ${{ github.ref_name }}
- name: upload to the release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload "${{ github.ref_name }}" "${{ steps.roves.outputs.archive-path }}"package-name/package-version name and version whichever installable format you asked
for — ignored entirely when none of deb/msi/dmg are set. See
the Shell section for what each format actually
wraps under the hood.
Advanced mode
Setting advanced-mode: 'true' kicks off a much slower, longer-running job: instead of using
Roves' already-built files — ready to be packed straight into your game's bundle, the default
— it compiles them itself from scratch, on the spot. That trades speed for a lot more control
over how the engine gets built, entirely at your own risk.
Setting any of the inputs below while advanced-mode is left at its default ('false') fails the run with a clear error
instead of silently ignoring it.
- name: build & bundle with Roves (advanced mode)
uses: DRincs-Productions/roves-action@v1
with:
content-dir: dist
advanced-mode: 'true'
media-stack: dummy