Files
plex-playlist/.pre-commit-config.yaml
Xlorep DarkHelm 549469f105
All checks were successful
CICD Start / Sanity and Base Decision (push) Successful in 24s
CI: Establish source-first quality gate and simplify pipeline flow (#71)
This PR establishes a deterministic source-level quality gate before any build promotion and removes redundant post-build quality checks.

The new flow makes local developer workflow and CI behavior align:
- Developers run pre-commit locally (with auto-fix where appropriate)
- CI runs a check-only smoke gate to validate pre-commit cleanliness
- Build/test promotion only proceeds after source checks pass

## What Changed

### 1. Added a source-first quality gate

- Added a dedicated source gate workflow:
  - `.gitea/workflows/cicd-source-checks.yaml`
- Gate now:
  - Checks out target SHA
  - Bootstraps backend/frontend toolchains
  - Installs dependencies (`backend` via `uv`, `frontend` via `yarn`)
  - Runs `pre-commit --all-files` as the quality smoke test
- Downstream build dispatch only occurs if this gate passes.

### 2. Updated pipeline routing

- `cicd-start.yaml` now dispatches the source gate first.
- `cicd-start.yaml` push trigger now includes all branches so feature branches run the same gate.
- Added explicit routing logs in dispatch steps (route decision, SHA, trace id) for easier debugging.

### 3. Removed redundant checks workflow

- Removed:
  - `.gitea/workflows/cicd-checks.yaml`
- Updated:
  - `.gitea/workflows/docker-build-main.yaml` now dispatches `cicd-tests.yaml` directly after successful main build.

### 4. CI check-only behavior vs local auto-fix behavior

Updated `.pre-commit-config.yaml` so hooks that can auto-fix behave as:

- **Local developer pre-commit**: auto-fix enabled
- **CI source gate**: check-only (no auto-fix)

Applied to:
- `ruff` / `ruff-format`
- `eslint`
- `prettier`
- `tsdoc-lint`
- `markdownlint`
- `pretty-format-toml`

This keeps CI as a true smoke validation of local pre-commit compliance.

### 5. Renovate workflow hardening

- Improved auth/token handling and diagnostics in:
  - `.gitea/workflows/renovate.yml`
- Added support for internal/self-signed TLS endpoints used by this environment.

## Why

- Faster, earlier feedback on source quality failures
- Avoid expensive build/test progression when source hygiene fails
- Align CI with developer habits for predictable outcomes
- Remove duplicated quality checks and reduce pipeline complexity

## New Effective CI Flow

1. `cicd-start.yaml`
2. `cicd-source-checks.yaml` (pre-commit smoke gate)
3. `docker-build-base.yaml` / `docker-build-main.yaml`
4. `cicd-tests.yaml`

## Acceptance Criteria Mapping (Issue #60)

- Source-level lane runs independently and consistently: **Implemented**
- Source-lane failure blocks promotion: **Implemented**
- Outputs/logging are clear and actionable: **Implemented**

## Notes

- Source gate is intentionally check-only in CI.
- Developers should continue running local pre-commit before pushing.
- Any remaining failures in source gate indicate local pre-commit was not fully clean.

Co-authored-by: copilotcoder <copilotcoder@darkhelm.org>
Reviewed-on: #71
2026-07-02 07:21:18 -04:00

117 lines
4.5 KiB
YAML

---
repos:
# General hooks for all files
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-merge-conflict
- id: check-added-large-files
- id: check-yaml
- id: check-json
- id: check-toml
- id: mixed-line-ending
# Markdown linting
- repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.45.0
hooks:
- id: markdownlint
entry: bash -c 'if [ "${CI:-}" = "true" ]; then markdownlint "$@"; else markdownlint --fix "$@"; fi' --
files: \.(md|markdown)$
# TOML linting
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
rev: v2.14.0
hooks:
- id: pretty-format-toml
entry: bash -c 'if [ "${CI:-}" = "true" ]; then pretty-format-toml "$@"; else pretty-format-toml --autofix "$@"; fi' --
# Python backend linting and formatting with ruff
- repo: local
hooks:
# Linter
- id: ruff
name: ruff-lint
entry: bash -c 'cd backend && if [ "${CI:-}" = "true" ]; then uv run ruff check . --config=pyproject.toml; else uv run ruff check --fix . --config=pyproject.toml; fi'
language: system
files: ^backend/
types: [python]
pass_filenames: false
# Formatter
- id: ruff-format
name: ruff-format
entry: bash -c 'cd backend && if [ "${CI:-}" = "true" ]; then uv run ruff format --check . --config=pyproject.toml; else uv run ruff format . --config=pyproject.toml; fi'
language: system
files: ^backend/
types: [python]
pass_filenames: false
# Python type checking with pyright
- repo: local
hooks:
- id: pyright
name: pyright
entry: bash -c 'cd backend && uv run pyright . --project=.'
language: system
files: ^backend/
types: [python]
pass_filenames: false
# Python docstring linting with pydoclint
- repo: local
hooks:
- id: pydoclint
name: pydoclint
entry: bash -c 'cd backend && uv run pydoclint --config=pyproject.toml src/'
language: system
files: ^backend/.*\.py$
types: [python]
pass_filenames: false
# Custom hook to enforce no types in docstrings
- repo: local
hooks:
- id: no-docstring-types
name: Prohibit types in docstrings
entry: python scripts/check_no_docstring_types.py
language: system
files: ^backend/.*\.py$
pass_filenames: true
# Frontend linting and formatting
- repo: local
hooks:
# ESLint with auto-fix for pre-commit (CI uses --no-fix)
- id: eslint
name: eslint
entry: bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && cd frontend && if [ "${CI:-}" = "true" ]; then corepack yarn eslint . --max-warnings=0; else corepack yarn eslint . --fix; fi'
language: system
files: ^frontend/.*\.(js|ts|vue)$
pass_filenames: false
# Prettier with auto-format for pre-commit (CI uses --check)
- id: prettier
name: prettier
entry: bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && FILES=(); for file in "$@"; do FILES+=("$(realpath "$file")"); done && if [ "${CI:-}" = "true" ]; then corepack yarn --cwd frontend prettier --check "${FILES[@]}"; else corepack yarn --cwd frontend prettier --write "${FILES[@]}"; fi' --
language: system
files: \.(js|ts|vue|json|css|scss|md|markdown)$
pass_filenames: true
# TypeScript type checking (same as CI)
- id: typescript-check
name: typescript-check
entry: bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && cd frontend && corepack yarn vue-tsc --noEmit'
language: system
files: ^frontend/.*\.(ts|vue)$
pass_filenames: false
# TSDoc linting with auto-fix for pre-commit (CI uses --no-fix)
- id: tsdoc-lint
name: tsdoc-lint
entry: bash -c 'export PATH="$HOME/.local/share/mise/shims:$HOME/.local/bin:$PATH" && cd frontend && if command -v yarn >/dev/null 2>&1; then if [ "${CI:-}" = "true" ]; then yarn eslint . --ext .ts,.vue --max-warnings=0; else yarn eslint . --ext .ts,.vue --fix; fi; else if [ "${CI:-}" = "true" ]; then corepack yarn eslint . --ext .ts,.vue --max-warnings=0; else corepack yarn eslint . --ext .ts,.vue --fix; fi; fi'
language: system
files: ^frontend/.*\.(ts|vue)$
pass_filenames: false