Docs/Deployment/CI/CD Pipelines

CI/CD Pipelines

Eight GitHub Actions workflows live in .github/workflows/. Pull requests are gated by CI, whose summary job CI OK also covers the static gates, secret scan, DCO sign-off, dependency review and docs link check; CodeQL reports separately. Tagging vX.Y.Z runs Release, which publishes signed multi-arch images and Helm charts to GHCR. There is no hosted deploy pipeline in this repository: deployment is yours, using Docker Compose or the Helm charts (see the Deployment Guide).

Source of truth
Triggers and job names below were read from the workflow files. If this page and a workflow file disagree, the file wins.
Required checks
CI OK (the ci-ok job in ci.yml) and CodeQL OK (codeql.yml); see CONTRIBUTING.md
Registry
GHCR (ghcr.io/<owner>), images and OCI Helm charts, published only by release.yml
Supply chain
cosign keyless signatures, SPDX SBOM attestations, SLSA build provenance
Local equivalents
make test, make lint, make gates, make compose-validate, make helm-lint, make sbom

All workflows

FileTriggerWhat it does
ci.yml (CI)pull request; push to main; dispatchPath-filtered build and test (below). Concurrency cancels superseded runs on pull requests.
static-gates.ymlcalled by ci.yml (workflow_call); dispatchJob Static gates: Flyway migration lint (uploads the checksum lock), duplicate bean/entity name guard, entity/table/bean/path namespace lint, expired test-skip check, file-size ratchet. Job Secret scan: gitleaks over new commits.
codeql.ymlpull request; push; weekly (Monday 04:27 UTC); dispatchCodeQL SAST for java-kotlin, javascript-typescript and python, build-mode none.
scorecard.ymlweekly (Tuesday 05:41 UTC); push; dispatchOpenSSF Scorecard analysis; SARIF uploaded.
release.ymltag v*.*.*; dispatch with an existing tagPublishes images, charts, SBOMs and the source tarball (below).
e2e.ymlnightly (03:17 UTC); dispatchBuilds the compose stack from the commit (full stack + build + CI overlays with a mock OpenAI-compatible provider), waits for health, runs the Playwright suite in tests/e2e. Dispatch inputs choose compose files, profiles and specs.
labeler.ymlpull request target (opened, synchronize, reopened)Applies labels with actions/labeler.
stale.ymldaily (06:33 UTC); dispatchMarks issues and PRs stale after 60 days, closes 14 days later; exempts pinned, security, roadmap and similar labels, and draft PRs.

CI — job graph

flowchart LR
  A[changes: path filter] --> B[core / web / web-admin / python / node-services]
  A --> C[shellcheck / hadolint / compose / helm]
  A --> E[static-gates / dco / dependency-review / docs-links]
  B --> D[CI OK]
  C --> D
  E --> D
JobWhat it does
changesUses dorny/paths-filter to decide which areas changed (core, web, web-admin, python services, node services, shell, docker, compose, helm). A change to ci.yml or scripts/ci/ triggers everything.
coreMaven verify on JDK 21 against Postgres with pgvector and Apache AGE; uploads test reports.
web, web-adminNode 22: lint, typecheck, test, build.
pythonruff; sidecar pytest (CPU-only torch); code-intel script harness (not pytest).
python-extraOther Python services (app-builder, tool-sandbox, voice-agent), one matrix leg each; part of CI OK.
node-servicesmcp-stdio-runner (node:test), the home-assistant example MCP server; http-gateway is advisory.
shellcheck, hadolintShell scripts at severity error; Dockerfile lint.
composedocker compose config on the files in deploy/compose.
helmhelm lint, template and kubeconform via scripts/ci/helm-validate.sh, plus render-guard negative tests when deploy/helm/test-guards.sh exists.
static-gatesRuns static-gates.yml as a reusable workflow (static gates and gitleaks secret scan).
dco, dependency-reviewDCO sign-off check on the commits; dependency review of the pull request.
docs-linkslychee in offline mode (with fragments) over *.md, docs/**/*.md and docs/**/*.html — this handbook included.
CI OKAggregates the job results above (areas with no changes are skipped). This is the single check to require in branch protection.

Release — what a tag produces

flowchart LR
  P[prepare] --> B[build per image x arch]
  B --> M[publish: multi-arch manifest, sign, SBOM, provenance]
  P --> C[charts: package, push OCI, sign]
  M --> R[GitHub Release]
  C --> R
cosign verify ghcr.io/<owner>/core:<version> \
  --certificate-identity-regexp '^https://github.com/<owner>/<repo>/\.github/workflows/release\.yml@refs/tags/v' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
gh attestation verify oci://ghcr.io/<owner>/core:<version> --repo <owner>/<repo>

Running the same checks locally

CI jobLocal command
Static gates and secret scanmake gates (enable the pre-push hook with make hooks)
core, web, web-admin, python testsmake test (or make test-core, test-web, test-web-admin, test-python)
Lint, typecheck, ruff, shellcheckmake lint
compose validationmake compose-validate
helm validationmake helm-lint
Source SBOMmake sbom (writes dist/sbom-source.spdx.json)

Not covered by any pipeline

Related: Deployment Guide · Rollback & Recovery · Quality Gates

Evidence & references