Deployment & CI/CD
SREDSimplify uses GitHub Actions for CI/CD with a single production application environment.
Release Model
mainis the integration branch and should stay releasable.- Pushes to
mainmay auto-create a semantic version tag (vX.Y.Z) only when backend deploy assets (backend/**,docker-compose.yml) change and Conventional Commits indicate a releasable change. - Production application deploys are still triggered only by semantic version tags (
vX.Y.Z). - There is no staging deployment workflow in the supported release model.
- Documentation deploys independently from
main.
Workflow: release-manager.yml
Triggered automatically on pushes to main that touch backend deploy assets (backend/**, docker-compose.yml) and manually when maintainers want to re-evaluate the current branch head.
1. Version Calculation
- Fetches full tag history.
- Scans Conventional Commits since the most recent release tag.
- Maps
feattominor,fix/refactor/perftopatch, andBREAKING CHANGEor!tomajor. - Initializes the first automated release at
v0.1.0.
2. Tag Creation
- Creates an annotated semantic version tag only when releasable commits are present.
- Uses
COPILOT_GITHUB_TOKENto push the tag so the downstream tag-triggered workflows fire normally.
3. Release Bootstrapping
- Creates a placeholder GitHub Release for the new tag.
- Leaves release-body enrichment to the release-notes automation.
Workflow: deploy.yml
Triggered automatically on semantic version tags and manually for explicit redeploys of an existing release tag.
1. Build and Push Job
- Checks out the exact tagged revision.
- Runs on GitHub-hosted
ubuntu-latest; no self-hosted runner is required. - Uses Docker Buildx to build
linux/arm64images for bothbackendandpython-service. - Optimization: The backend Dockerfile uses Spring Boot layered extraction (
layers.idx) to cache dependencies separately from application code, drastically speeding up subsequent builds. - Pushes images to the container registry (
ACR_LOGIN_SERVER) with both release-tag andlatesttags.
2. Deploy Job
- Runs on GitHub-hosted
ubuntu-latest, then deploys remotely over SSH through the configured jump host. - Connects to the production server via SSH (using a jump host).
- Pulls the tagged images.
- Refreshes
.envfrom Doppler (sred/prd). - Executes
docker compose up -d --remove-orphans. - Performs a production health check against
/actuator/health.
3. External Verification
- Runs backend external verification when
PRODUCTION_URLis configured. - Frontend production deploys are handled separately by Vercel and are not part of this workflow.
Docker Compose Setup
The production environment relies on the root docker-compose.yml file, which orchestrates:
- The Spring Boot backend container.
- The Python FastAPI container.
- Note: PostgreSQL and Redis are assumed to be managed independently or included in an extended compose file depending on the environment.
Known Limitations
- The Self-hosted Registry domain must have Cloudflare proxy disabled (DNS only) to allow for large image blob uploads, as Cloudflare's free tier imposes a strict 100MB upload limit.