CI/CD
Administrator documentation for the Vetrix CI/CD subsystem: the instance-wide settings that govern whether and how jobs run, and the deployment wiring a runner or containerized worker needs before jobs can launch containers, receive per-branch variables, and hand artifacts back. Use the instance-configuration pages for policy questions ("what caps a job?") and the runner and worker pages for deployment questions ("why did every job fail at once?").
Instance configuration
- CI/CD Configuration — The instance-level
ci.*runtime settings (ci.enabled,ci.max_job_timeout,ci.max_concurrency, theci.allowed_imagesimage prefix allowlist, andci.artifact_retention_days), the admin runner registration and deletion endpoints, blob-directory artifact storage and manual purge, queue depth via the admin health endpoint, and how to pause dispatch without removing runners. - Pipeline Variables — Per-branch variables set from
Pipelines → Environment configuration: AES-256-GCM encrypted at rest, write-only
through the UI and API, excluded from fork-originated PR runs, always masked in job logs,
and audited on each decrypt. Also covers the worker-side prerequisites (a wired resolver
plus a
SECRET_ENC_KEYmatching the server's), the fail-open behaviour when the key is absent, and the resolution precedence in which a branch variable overrides committedvetrix-ci.yml.
Runner and worker deployment
- CI Runners — Registering a runner and its one-time token, starting
vetrix-runnerby flag, environment variable, orvetrix-runner.toml, theoffline/idle/busylifecycle and its 30-second heartbeat and 60-second offline threshold, the default Docker executor and itsprivilegedsetting, a systemd unit template, and how to scale by concurrency or additional runners. - Worker Docker-Socket Access — Why the containerized worker
must carry the socket's numeric owning GID as a supplementary group via
group_add, how to read that GID from the host, and why theuser:pin must not be removed to work around the permission error. Diagnoses the case where every job — including a trivialhello-world— fails within a second atexit_code=126with a Docker socket permission denial, and distinguishes it from jobs that never leavepending. - Runner Artifact Collection — Why declared
artifacts.pathscollect zero files when the worker has no host-side per-job workspace, how to wireRUNNER_WORKSPACE_DIRplus a writable bind mount owned by the worker's runtime identity, the three collection WARN lines in the worker error log and what each one means, that globs resolve relative to the workspace root and directories are skipped, and the end-to-end verification that an artifact becomes retrievable.