Skip to main content
This page is the reference for 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

  • configure stops when the runner root is already configured, or when a runner with the same name exists. Pass --replace to proceed.
  • The runner always adds the labels self-hosted, the OS (Linux or macOS), and the architecture (X64 or ARM64). 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-group is stored in the runner’s settings; it does not change the pool registration targets.
  • --work is 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 the node found on PATH. 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 --ephemeral exits 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, use Environment= 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.
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

  • --work does 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.