preloop-runner: its commands, flags, environment variables, and the files it keeps in the runner root. Each table lists the official actions/runner equivalent where one exists. preloop-runner --help and preloop-runner <command> --help show the same flags.
Commands
preloop-runner --version prints the runner version and the runner protocol version it targets.
Global flags
These flags apply to every command.configure
configurestops when the runner root is already configured, or when a runner with the same name exists. Pass--replaceto proceed.- The runner always adds the labels
self-hosted, the OS (LinuxormacOS), and the architecture (X64orARM64). Labels match case-insensitively, so duplicates are dropped. No flag removes the defaults.
Match labels the GitHub way
runs-on labels are requirements joined by AND. A runner must advertise every
requested label, and matching is case-insensitive; extra labels do not hurt.
--labels adds labels to the defaults, which are self-hosted, the host OS,
and the host architecture.
GitHub-hosted labels such as ubuntu-latest do not make a standalone host
equivalent to a GitHub-hosted image. Use labels that describe the host and its
capabilities, or change runs-on to match the labels you actually advertise.
For a control-plane-managed runner, add labels with PRELOOP_RUNNER_LABELS;
for this standalone runner, pass them to configure --labels.
--runner-groupis stored in the runner’s settings; it does not change the pool registration targets.--workis saved in.runner, but job workspaces are always created under_work/in the runner root. Changing this value does not move them.- With
--no-externals, JavaScript actions use thenodefound onPATH. Its major version must match the action’s Node version, or the action fails.
run
- Ctrl-C or SIGTERM stops the runner. A running job gets 60 seconds to wind down, then the runner stops it and reports it canceled.
- A runner configured with
--ephemeralexits after one job, the same as--once.
remove
remove deregisters the runner with the server, then deletes .runner, .credentials, and .credentials_rsaparams. It leaves _work/ and externals/ in place. If the server cannot deregister the runner, it warns and deletes the local files anyway, so remove the runner in the repository or organization settings as well.
lint
Remote reusable workflows are fetched from the GitHub API. Set
PRELOOP_GITHUB_TOKEN for private repositories, and PRELOOP_GITHUB_API_URL to use another API base. Nesting is limited to four levels.
Environment variables
Set these in the runner’s environment. For a service, useEnvironment= in the unit file.
Hook steps run even when earlier steps failed. A failing hook does not fail the job, and each hook has a 10-minute limit.
Set these in a workflow’s
env or in the runner’s environment.
If
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 and ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION are both true in the same place, the runner logs a warning and uses the default Node version.
Managed-runner environment variables
Managed-runner environment variables
These variables are used by Preloop-managed runners and are not needed for a normal GitHub self-hosted install.
Files in the runner root
The configuration files are created with
0600 permissions. Treat them as secrets. Anyone with .credentials_rsaparams can request access tokens as this runner.
Limitations
--workdoes not change where job workspaces are created.- The default labels cannot be turned off.
- The runner does not update itself. Install a newer binary to upgrade.
- Jobs run on the host, as the runner’s user, unless a step runs in a container. For isolation, use the control plane and its microVM pool.
- Windows hosts are not supported natively. Use WSL2 with the Linux binary.
