# SPDX-FileCopyrightText: 2026 Stan Grams # # SPDX-License-Identifier: GPL-2.0-or-later # # Example act_runner config for the Docker-executor runner that lives in the # CI VM. This is NOT the SDK image — it configures the runner that launches # per-job containers (including the trx-rs SDK image referenced by the # workflow's `container:` key). Copy to the VM and pass with # `act_runner daemon --config`. log: level: info runner: file: .runner # One concurrent job. With one runner per project on a 2-vCPU VM this keeps # total CI usage at ~2 threads. capacity: 1 timeout: 3h # Docker executor: no ":host" suffix. Maps runs-on labels to base images # (the workflow overrides these per job via `container:`). labels: - "ubuntu-latest:docker://catthehacker/ubuntu:act-latest" cache: enabled: true container: # Cap every job container's CPU so CI stays within the 2-thread budget even # if capacity is raised later. The -v mount persists the sccache cache on the # host (create it first: `mkdir -p /var/cache/sccache`), matching SCCACHE_DIR # in the workflow. options: "--cpus=2 -v /var/cache/sccache:/sccache" # act_runner rejects every bind mount unless it is listed here — the default # is an empty allowlist, so the -v above is dropped with only a # "[...] is not a valid volume, will be ignored" line in the job log, and # SCCACHE_DIR then points at a directory that does not outlive the job. valid_volumes: - /var/cache/sccache # Reuse the host VM's Docker network for the built-in cache/artifact server. network: "host" # The workflow pulls the SDK image by the moving `:latest` tag. Without this # the runner logs "Image exists? true" and reuses whatever it cached the # first time, so pushing a rebuilt image has no effect until someone pulls # on the VM by hand — which looks like the image is missing a tool it in # fact has. The extra registry round-trip per job is nothing next to a build. force_pull: true