OfflineKit Export CI Contract
Currency check 2026-10-07: owner paths/source placement verified against
3238bd511a37e199ae99d4f17be2f13eabec8dd7. The supported boundary issrc/OfflineKit(src/OfflineKit/StellaOps.OfflineKit.Worker/Program.cs). Re-verify the host mount and owning endpoint extension together. This is source verification; deployment and broader audit coverage are separate evidence. Other dated findings retain their stated dates. Re-verify:rg -n "MapGroup|Map.*Endpoints|AddHostedService" src/OfflineKit/StellaOps.OfflineKit.Worker/Program.cs, then inspect the endpoint extension or library pointer cited at the operation.
Supported implementation
The deployable family is src/OfflineKit/: web and worker hosts plus owned libraries and tests. The predecessor ExportCenter build commands and MinIO pipeline specification below are historical design, not a declared running CI pipeline. This document does not establish completed CI liveness.
Build/test the current projects using the repository’s configured restore sources and targeted test wrapper:
dotnet build src/OfflineKit/StellaOps.OfflineKit.WebService/StellaOps.OfflineKit.WebService.csproj -c Release
dotnet build src/OfflineKit/StellaOps.OfflineKit.Worker/StellaOps.OfflineKit.Worker.csproj -c Release
pwsh -NoProfile -File tools/scripts/test-targeted-xunit.ps1 -Project src/OfflineKit/__Tests/StellaOps.ExportCenter.Tests/StellaOps.ExportCenter.Tests.csproj -All
Host-composition and persistence suites use PostgreSQL/Testcontainers; provision Docker and obey the disk-floor gate before invoking them. Use the actual projects under src/OfflineKit/__Tests/, rather than the historical MinIO fixture.
Checked-in assembly/federation-contract definitions are .gitea/workflows/offline-kit-assembly.yml and .gitea/workflows/airgap-federation-e2e.yml. Definition presence establishes source configuration only. Completed push-to-main evidence is required before claiming that a CI lane ran or passed.
Operator references
Historical Predecessor ExportCenter CI design 2026-05-30 (superseded 2026-09-14)
The remainder records the predecessor implementation or unlanded design at the dates stated in its text. All routes, host names, source paths, DTOs, metrics and examples in this section are historical comparison, including sentences that originally said “current” or “today”. They are not instructions for the consolidated estate. The supported section and owner source above supersede them. Do not rebuild or deploy a predecessor from these examples.
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.
