## Summary This PR simplifies the CICD workflow by merging related lanes, reducing duplicated script logic, and keeping the same overall pipeline behavior and gates. It also updates CI documentation to match the new job topology. ## What Changed ### Workflow consolidation - Merged base and complete CICD image publication into one producer job: - Build and Push CICD Images - Merged dependency audits into one informational lane: - Dependency Audits (Informational) - Merged runtime image build lanes into one release producer: - Build Release Images - Merged tester image build lanes into one tester producer: - Build Tester Images ### Dependency/gate rewiring - Updated downstream needs to consume merged producers. - Kept output contracts for deployable and tester image references. - Updated production and postmortem gates to the new job IDs. ### Cleanup/simplification - Removed duplicate helper-function definition(s) in CICD scripts. - Replaced a manual docker login retry loop with existing retry helper usage. - Removed redundant shell option declarations where behavior was unchanged. - Removed one unused E2E environment variable. ### Documentation alignment - Updated CI architecture documentation to reflect merged workflow lanes. - Updated troubleshooting guidance to reference current job sequencing. ## Why - Reduce job startup overhead on self-hosted runners. - Keep behavior consistent while lowering workflow complexity. - Improve maintainability by removing duplicated/unused script fragments. - Keep docs in sync with operational workflow reality. ## Validation - Workflow file checks passed with pre-commit. - Documentation checks passed with pre-commit (including markdownlint/prettier). - No diagnostics/errors reported for updated workflow/docs files. ## Risk and Impact - Low-to-medium operational risk due to job-ID/needs rewiring. - Mitigated by preserving output keys consumed by integration and e2e lanes. - Audit lane remains informational-only (non-blocking), same intent as before. Co-authored-by: copilotcoder <copilotcoder@darkhelm.org> Reviewed-on: #86
Plex Playlist Project
A full-stack application for managing Plex playlists with a FastAPI backend and Vue.js frontend.
Architecture
- Backend: Python 3.14 + FastAPI + uv + ruff
- Frontend: TypeScript + Vue.js + Vite
- Database: PostgreSQL 16
- Containerization: Docker + Docker Compose
Deployable Runtime Contract
Deployable image requirements are defined in:
These documents define backend/frontend runtime boundaries, startup and health behavior expectations, environment contracts, and disallowed non-runtime tooling classes in deployable artifacts.
Development Setup
Prerequisites
- Docker and Docker Compose
- Git
- pre-commit (for development)
Code Quality Tools
This project uses comprehensive linting and formatting:
Backend (Python):
ruff- Fast Python linter and formatterpyright- Type checkingpydoclint- Docstring linting (Google style)
Frontend (TypeScript/Vue):
eslint- Linting with Vue and TypeScript supportprettier- Code formattingvue-tsc- Vue TypeScript checkingeslint-plugin-tsdoc- TSDoc documentation linting
Task Runner:
poethepoet- Unified task runner for development workflows
General:
pre-commit- Git hooks for automated quality checks- TOML formatting and validation
Unified Development with Poe
This project uses Poe the Poet for streamlined development:
# Complete setup (installs deps, starts dev environment)
poe setup
# Code quality (format, lint, type-check all code)
poe ci-quick
# Run all tests
poe test-all
# See all available tasks
poe --help
Manual Setup (Alternative)
pip install pre-commit
pre-commit install
Quick Start
Clone the repository, then choose one of these startup paths.
Unified Development
# Complete setup and start development environment
poe setup
# Or manually:
cd backend
pip install -e .
poe dev-env-start
Traditional Setup
# Backend development
cd backend
pip install -e .
# Frontend development
cd frontend
npm install
npm run dev
Docker Development
# Using Poe (recommended)
poe docker-dev-up
# Or directly
docker compose -f compose.dev.yml up --build
Production Build
poe docker-prod-up
# Or: docker compose up --build
Running in Production Mode
docker compose up --build -d
This will start:
- PostgreSQL database on port 5432
- FastAPI backend on port 8000
- Vue.js frontend on port 80
Project Structure
plex-playlist/
├── backend/ # FastAPI backend
├── frontend/ # Vue.js frontend
│ └── nginx.conf # Nginx configuration
├── Dockerfile.backend # Backend Docker image
├── Dockerfile.frontend # Frontend Docker image
├── compose.yml # Production Docker Compose
├── compose.dev.yml # Development Docker Compose override
└── README.md
CI Operations
For Gitea Actions runner image mirror maintenance, use:
source scripts/gitea-actions/repair_runner_mirror.xshsource scripts/gitea-actions/check_runner_images.xsh(checks ubuntu:22.04, GHCR act image, local mirror, and Renovate image)source scripts/gitea-actions/collect_runner_diagnostics.xsh [since] [trace_id]
For setup-stage failures with sparse logs, use:
source scripts/gitea-actions/runner-prechange-capture.xsh [tail_lines]source scripts/gitea-actions/diagnose_runner_startup.xsh
For full troubleshooting context, see docs/GITEA_ACTIONS_TROUBLESHOOTING.md.
Environment Variables
Backend
DATABASE_URL: PostgreSQL connection stringBACKEND_REQUIRED_PYTHON: Runtime policy baseline (3.14default)ENVIRONMENT:developmentorproductionRELOAD: Enable uvicorn auto-reload (development only)
Frontend
- No required runtime environment variables for production nginx serving
Database
The PostgreSQL database is configured with:
- Database:
plex_playlist - User:
plex_user - Password:
plex_password
Development Workflow
- Make changes to your code
- The development containers will automatically reload:
- Backend: uvicorn with
--reloadflag - Frontend: Vite dev server with hot module replacement
- Backend: uvicorn with
API Documentation
When running, the FastAPI automatic documentation is available at:
- Development: http://localhost:8001/docs
- Production: http://localhost:8000/docs
Manual Setup (if not using Docker)
Backend Setup (FastAPI, Python 3.14, uv, ruff, pyright)
1. Create and activate the uv virtual environment
cd backend
uv venv .venv
source .venv/bin/activate
2. Install dependencies
uv sync --all-groups
3. Install dev tools
uv run poe format
uv run poe lint
uv run poe test
4. Project structure
src/backend/- FastAPI application codetests/- Test suitepyrightconfig.json- Pyright type checking configpyproject.toml- Ruff, pytest, and task configuration
5. Run the development server
uv run uvicorn backend.main:app --reload --app-dir src
Frontend Setup (Vue 3, Vite, TypeScript)
1. Create the project
cd frontend
npm create vite@latest . -- --template vue-ts
npm install
2. Recommended: Enable strictest TypeScript settings
Edit tsconfig.json and set:
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
}
}
3. Run the frontend
npm run dev
Documentation
Development & Workflow
- Development Environment Setup
- Comprehensive guide for setting up your development environment, git workflow, pre-commit hooks, manual tool usage, and CI/CD pipeline understanding
- Poe Task Reference
- Complete guide to unified development tasks and workflows using Poe the Poet
- Deployable Runtime Contract
- Canonical backend/frontend deployable runtime image requirements and exclusions
- ADR003: Deployable Runtime Image Contract Boundaries
- Architectural decision that locks deployable image boundary policy
Architecture & CI/CD
- CI/CD Multi-stage Build
- Docker multi-stage build strategy, architecture decisions, and performance optimizations
- CI/CD Troubleshooting Guide
- Comprehensive troubleshooting, optimization decisions, and performance monitoring for Docker builds and E2E testing
- CI/CD Success Summary
- Complete validation results and performance metrics for the optimized pipeline
Dependency Management & Automation
- Renovate Bot Setup
- Automated dependency updates with Renovate for Python, Node.js, and Docker dependencies
Operations & Troubleshooting
- Gitea Actions Troubleshooting
- Solutions for CI/CD pipeline issues, including the critical "jobs waiting forever" problem
- Secure Docker CI/CD
- Security considerations and setup for Docker-based CI/CD pipelines
See the backend/ and frontend/ folders for more details.