Export Center CI Contract
Audience: DevOps engineers maintaining the Export Center build pipeline. Tracking:
DEVOPS-EXPORT-35-001. Related: Console CI contract · DevOps overview.
Goal: deterministic, offline-friendly CI for the Stella Ops Export Center services (WebService + Worker) with storage fixtures, smoke/perf gates, and observability artefacts.
Pipeline stages
- Setup
- .NET SDK 10.x (cached); Node 20.x only if UI assets present.
- Restore NuGet from
local-nugets/+ cache; fail on external fetch (configureRestoreDisableParalleland source mapping). - Spin up MinIO (
minio/minio:RELEASE.2024-10-08T09-56-18Z) via docker-compose fixtureops/devops/export/minio-compose.ymlwith deterministic credentials (exportci/exportci123).
- Build & lint
dotnet format --verify-no-changesonsrc/ExportCenter/**.dotnet build src/ExportCenter/StellaOps.ExportCenter.WebService/StellaOps.ExportCenter.WebService.csproj -c Release /p:ContinuousIntegrationBuild=true.
- Unit/integration tests
dotnet test src/ExportCenter/__Tests/StellaOps.ExportCenter.Tests/StellaOps.ExportCenter.Tests.csproj -c Release --logger "trx;LogFileName=export-tests.trx"- Tests must use the MinIO fixture with bucket
export-ciand deterministic seed objects (see Fixtures).
- Perf/smoke (optional, gated)
dotnet test ... --filter Category=Smokeagainst live MinIO; cap runtime < 90 s.
- Artifacts
- Publish TRX to
.artifacts/export-tests.trx. - Collect coverage to
.artifacts/coverage(coverlet; lcov + summary). - Export the appsettings used for the run to
.artifacts/appsettings.ci.json. - Syft SBOM:
syft dir:./src/ExportCenter -o spdx-json=.artifacts/exportcenter.spdx.json.
- Publish TRX to
- Dashboards (seed)
- Produce starter Grafana JSON covering request rate, p95 latency, MinIO error rate, queue depth, and export-job duration histogram. Store under
.artifacts/grafana/export-center-ci.jsonfor import.
- Produce starter Grafana JSON covering request rate, p95 latency, MinIO error rate, queue depth, and export-job duration histogram. Store under
Fixtures
- MinIO compose file:
ops/devops/export/minio-compose.yml(add if missing) with:- Access key:
exportci - Secret key:
exportci123 - Bucket:
export-ci
- Access key:
- Seed object script:
ops/devops/export/seed-minio.shto create bucket and upload deterministic sample (sample-export.ndjson).
Determinism & Offline
- No external network after restore; MinIO uses local image tag pinned above.
- All timestamps emitted as UTC and tests assert deterministic ordering.
- Coverage, SBOM, Grafana seed stored under
.artifacts/and uploaded.
Acceptance criteria
- CI run passes on a clean runner with the network blocked after restore.
- Artifacts (
.trx, coverage, SBOM, Grafana JSON) are uploaded and the MinIO fixture is exercised in tests. - The smoke/perf subset completes in under 90 s.
