Skip to content

Config — bupha.toml ​

Top level ​

fieldtyperequirednotes
reposVec<RepoEntry>requiredWatched repos — one pending slot each, one global worker. TOML-conventional singular; repos kept as alias for existing configs.
tunnelTunnelCfgoptionalHow the listener is exposed publicly (cloudflared, direct, none).
cacheCacheCfgoptionalArtifact cache backend ([cache]); runner.sccache_conf is accepted for older configs — [cache] wins.
accessAccessCfgoptionalWho may trigger ([access]). Absent = open.
telemetryTelemetryCfgoptionalPipeline observability ([telemetry]). Absent = none.
attestAttestCfgoptionalRun provenance ([attest]). Absent = none.
queueQueueCfgoptionalQueue persistence backend ([queue]). Absent = redb.
worktreeWorktreeCfgoptionalWhere detached git worktrees for runs are created.

[[repo]] ​

fieldtyperequirednotes
namestringrequiredrepository.full_name in the webhook payload ("owner/name") — also the status target repo.
dirpathrequiredClone to fetch + create detached worktrees from.
branchstringoptionalThe ref to watch (e.g. "refs/heads/main").
status_repostringoptionalStatus repo override (defaults to name).
runnerRunnerCfgoptionalPer-repo runner override — a full [repo.runner] table replaces the global [runner] for this repo.
queue`"latest""all"`optional

[trigger] ​

fieldtyperequirednotes
api_basestringoptionalForge API base — GHES ("https://ghe.acme/api/v3") or default github.com. Used by the trigger, status, and forge-admin impls.
kindstringrequired"github" today; other forges = new impl crates.
listenstringoptionalWebhook listener bind address ("127.0.0.1:9000").
secret_envstringoptionalEnv var holding the webhook secret.

[runner] ​

fieldtyperequirednotes
kindstringrequiredRunner kind: "dagger" | "shell" | "ssh" | impl crates.
token_envstringoptionalEnv var name holding the forge token (never the value).
cancel_runningbooloptionalKill an in-flight run when a newer push supersedes it. Invalid with queue = "all" (rejected at load).
extratoml::TablerequiredImpl-owned fields — the matched impl crate deserializes its own config struct from this; core knows none of them.

[status] ​

fieldtyperequirednotes
kindstringoptional"github" | "log" (stdout only) | "none".
repostringoptionalowner/repo for the commit-status API.
contextstringoptionalStatus context label (e.g. "ci/bupha").

[tunnel] ​

fieldtyperequirednotes
providerstringoptional"none" | "cloudflared" | "direct".
namestringoptionalNamed tunnel (stable URL); empty = quick tunnel.
local_urlstringoptionalLocal URL the tunnel forwards to (listener address).
public_urlstringoptionalprovider=direct: the external URL GitHub should hit.

[cache] ​

fieldtyperequirednotes
kindstringoptionalBackend id ("sccache"; "none"/empty disables).
confstringoptionalBackend conf value (sccache: "file:///dir", "s3://bucket/…").

[worktree] ​

fieldtyperequirednotes
basestringoptionalWorktree parent dir — runs land at &lt;base&gt;-&lt;repo&gt;-&lt;sha12&gt;.

[runner] — kind dagger ​

fieldtyperequirednotes
functionstringoptional—
shardsstringoptional—
jobsstringoptional—
dogfood_jobsstringoptional—
sequentialbooloptional—
sccache_confstringoptionalsccache conf passed as --sccache-conf (resolved from [cache] by the composition root).
cli_sourcestringoptional—
extra_argslistoptional—

[runner] — kind shell ​

fieldtyperequirednotes
cmdstringoptional—

[runner] — kind ssh ​

fieldtyperequirednotes
remotestringoptionalRemote host ("user@host"; ssh config resolves auth).
remote_dirstringoptionalRemote workdir the worktree syncs into.
cmdstringoptionalCommand run remotely (bash -c).

[runner] — kind container ​

fieldtyperequirednotes
imagestringrequiredImage the pipeline runs in (required).
cmdstringoptionalShell command executed inside the container.
enginestringoptionalEngine binary — "podman" (default) or "docker".
networkstringoptionalNetwork mode — "none" default (isolated); "host"/"bridge" for pipelines that genuinely need outbound.

Constraints ​

  • queue = "all" rejects cancel_running = true at load — killing a run would silently drop a promised commit.
  • runner.kind and trigger.kind/status.kind resolve to impl crates; unknown kinds fail at bupha doctor/startup.
  • deny_unknown_fields: typos in field names fail the load.