Roves

GitHub Action

roves-action — wire mach build/mach bundle into your own game's CI.

Edit on GitHub

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

NameDescription
content-dirRequired. Path to your already-built web content (e.g. a Vite/webpack dist/ folder).
artifact-nameBase 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-includeHow your content gets packed into the bundle — see Content packing.
deb / msi / dmg, package-name, package-versionBuild an installer instead of a portable bundle — see Distributing installers below.
html-fileEntry HTML file, relative to content-dir (default index.html).
window-sizeInitial window size, e.g. 1280x720 (the default).
outputWhere 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-scriptShip 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-paramsExtra launch arguments baked into the bundle, passed to the game every time it starts.

Outputs

NameDescription
bundle-dirAbsolute path to the unzipped bundle folder (named artifact-name)
archive-pathAbsolute 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 inputProduces
Windowsmsi: 'true'A real .msi (needs WiX's candle/light on PATH — this action adds it for you on windows-latest)
macOSdmg: 'true'play.app wrapped in a .dmg
Linuxdeb: '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

On this page