Overview
CI pipelines
perfscale runs headless by design, so it drops straight into a CI pipeline:
the run summary goes to stdout, the exit code gates the job, and
--summary-export writes a machine-readable JSON (or a Markdown table for
the job summary UI) for downstream steps.
GitHub Actions
The official composite action —
Perfscale/github-action —
installs a pinned perfscale release (checksum-verified against the release's
sha256sums.txt), runs your test, renders the metric table into the job
summary, and packs the summary + metrics into a zip artifact:
- uses: Perfscale/github-action@v1
id: loadtest
with:
file: test.yaml # native engine; or: k6 / locust / jmeter
config: config.yaml
- uses: actions/upload-artifact@v4
with:
name: perfscale-output
path: ${{ steps.loadtest.outputs.output-file }}
One input per engine — k6, locust, jmeter, or file (native) — maps to
the matching perfscale run flag. Engine binaries stay the workflow's
responsibility (the action installs perfscale itself): k6/locust are
one-package installs, JMeter needs Java (preinstalled on GitHub-hosted
runners) plus the distribution tarball — the action's README has a copy-paste
install step.
Useful outputs for gating: summary-json (requests, RPS, latency
percentiles, error rate + engine/VUs/duration metadata) and exit-code:
- name: Gate on p95
run: |
p95=$(jq '.summary.p95_ms' "${{ steps.loadtest.outputs.summary-json }}")
awk "BEGIN { exit !(${p95} < 500) }" || { echo '::error::p95 over budget'; exit 1; }
Live demo: Perfscale/perfscale-demo is a public playground repo — every push runs the native and JMeter engines against a local target and publishes the job-summary tables and artifacts, so you can see the output without setting anything up.
GitLab CI
For GitLab there is a templates repo —
Perfscale/gitlab-ci — with
ready-made .gitlab-ci.yml includes and examples for the same engines.
Any other CI
No plugin needed — install the binary and run:
curl -fsSL https://github.com/Perfscale/perfscale/releases/latest/download/perfscale-linux-amd64 \
-o perfscale && chmod +x perfscale
./perfscale run -f test.yaml -c config.yaml \
--summary-export summary.json
Exit codes mirror the CLI: 0 — the run completed (individual failed
requests/checks don't change that — gate on summary.json instead), 1 —
the run could not execute, 2 — invalid arguments. One deliberate exception:
a std/thresholds@v1 gate violated at severity: fail fails the process
after the summary export, so CI turns red on SLO breaches.