CI/CD

Every flow, load test, and assertion you built in the app runs unchanged in your pipeline. Install-free via npx, exit-code gated, reports shipped as artifacts. GitHub Actions, GitLab CI, Windows runners, anywhere a shell runs.

Exit Code Is Your Deploy Gate

Every assertion and every threshold rolls up into a single exit code. 0 ships,1 blocks. No log scraping, no custom scripts to decide if the run passed.

Install-Free with npx

npx --yes @atrahasis/cli in any Node-capable runner — no setup step, no cache warmup, no waiting for a brew tap.

Reports as Artifacts

Your After All script ships HTML, PDF, or OpenTelemetry JSON to S3, Slack, email, or your artifact store. Every CI run ends with a report your reviewers can open.

Drop This Into Your Pipeline

Copy, paste, done. The CLI binary is available on every major platform, and npx keeps the install optional when a Node runtime is already around.

GitHub Actionsyaml
- name: API Health Check
  run: |
    curl -sSL https://cli.atrahasis.dev | sh
    atra GET https://api.example.com \
      -a "status eq 200" \
      -a "response_time lt 2000"
GitHub Actions · npx (no install)yaml
- name: API Health Check
  run: npx --yes @atrahasis/cli GET https://api.example.com \
    -a "status eq 200"
GitHub Actions · Windowsyaml
- name: API Health Check
  shell: pwsh
  run: |
    irm https://cli.atrahasis.dev | iex
    atra GET https://api.example.com -a "status eq 200"
GitLab CIyaml
api-test:
  script:
    - curl -sSL https://cli.atrahasis.dev | sh
    - atra GET https://api.example.com -a "status eq 200"
Flow Runner in CIyaml
- name: Run API Flow Tests
  run: |
    curl -sSL https://cli.atrahasis.dev | sh
    atra run ./tests -f smoke-test -e ci
Load Test · Gate Release on Thresholdsyaml
- name: Load Test
  run: |
    curl -sSL https://cli.atrahasis.dev | sh
    atra run ./load-tests -s checkout-api -t load -e prod

Exit Code Is Your Deploy Gate

Every assertion, every threshold verdict, every step result collapses into a single exit code. Pipelines read it and decide — no extra parsing, no custom glue.

All passed · Exit 0
Running checkout-api...
✓ status eq 200           (125ms)
✓ response_time lt 1000   (125ms)
✓ $.orderId exists        (125ms)

All 3 assertions passed.
Exit code: 0
Failure · Exit 1
Running checkout-api...
✗ status eq 200           — expected 200, got 500
  response_time lt 1000   — passed (125ms)

1 assertion failed.
Exit code: 1

HTTP Assertions

Status, response time, headers, body, and JSON path gates — any failure flips exit to 1.

Flow Runner

Step failure, assertion failure, or pre/post-script error → non-zero exit. Stop-on-failure ends the run immediately on the first broken step.

Load Test Thresholds

Set P95, P99, throughput, or error-rate gates. Any missed threshold fails the run — a real pass/fail signal, not a number to eyeball.

Secrets From the Shell

The desktop app keeps secrets in the OS keychain; the CLI reads the same variables from the shell. Export your CI secrets as env vars and your flow resolves the exact same {{ENV_VAR}} references it did on your laptop.

Vault connections follow the same rule — a desktop connection named prod-vault expects VAULT_AUTH_PROD_VAULT on the CI runner.

See Environments & Secrets
GitHub Actions · Secrets to Shell
- name: Run Flow Against Prod
  env:
    API_TOKEN: ${{ secrets.API_TOKEN }}
    VAULT_AUTH_PROD_VAULT: ${{ secrets.VAULT_TOKEN }}
  run: |
    curl -sSL https://cli.atrahasis.dev | sh
    atra run ./tests -f user-journey -e prod
After All · Ship the PDF to S3
// Runs at the end of every CI invocation
const pdf = await at.export.pdf();

await fetch(at.environment.get("S3_UPLOAD_URL"), {
  method: "PUT",
  headers: { "Content-Type": "application/pdf" },
  body: pdf,
});

// Notify the team
await fetch(at.environment.get("SLACK_WEBHOOK"), {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    text: "Load test finished — report at ${report_url}"
  }),
});

Reports as Artifacts

The same After All script you wrote on your desktop ships the HTML, PDF, or OpenTelemetry JSON from the CI runner. Upload to S3, attach to Slack, forward to an OTLP collector — no extra workflow step, no custom uploader.

Reviewers click straight from the PR into the report that CI just produced.

See Reporting

Works Everywhere a Shell Runs

Native binaries for macOS (Apple Silicon and Intel), Linux (arm64 and x86_64), and Windows (x86_64). Install via npm, Homebrew, curl, wget, or PowerShell — or skip the install entirely with npx.

See the full CLI

Ready to gate your deploys with real tests?

Copy one of the blocks above into your workflow file and your next push becomes a verified release candidate.