Local Run
1) With Docker (recommended)
No Node installation is required on the host.
cd <repository root>
# Run the whole pipeline (including test services)
docker compose -p iqv-ci -f ci/docker-compose.ci.yml run --rm ci-runner
# Cleanup (test data lives in tmpfs; remove volumes anyway)
docker compose -p iqv-ci -f ci/docker-compose.ci.yml down -v
Reports are written to ci/reports/.
The production
docker-compose.ymlis not affected: CI uses a separate project name (iqv-ci).
2) Without Docker
Node 22 is required (dashboard engines: >=22 <23).
cd backend && npm ci && cd ..
cd dashboard && npm ci && cd ..
node ci/scripts/run-ci.mjs
node ci/scripts/generate-ci-report.mjs
Partial runs
node ci/scripts/run-ci.mjs --only=backend # backend phases only
node ci/scripts/run-ci.mjs --only=frontend # frontend phases only
node ci/scripts/run-ci.mjs --only=backend-unit # a single phase
node ci/scripts/run-ci.mjs --skip=frontend-tests # skip one phase
To suppress the CI verdict while generating the report:
node ci/scripts/generate-ci-report.mjs --no-fail
A partial run cannot be green: if a mandatory phase never ran, the policy reports
FAILED(seequality-policy.md).
Environment variables
| Variable | Default | Purpose |
|---|---|---|
IQV_PROJECT_ROOT |
two levels above the script | repository root |
IQV_CI_PHASE_TIMEOUT_MS |
1800000 |
per-phase limit |
TEST_MONGODB_HOST/PORT |
— | real MongoDB tests |
TEST_MINIO_ENDPOINT/PORT |
— | real object storage tests |
Without these variables the corresponding tests skip themselves through their
own guards and appear as BLOCKED / skipped in the report — a mocked result
is never presented as a real integration.