From 19ee99a3bc383f37f413c93247f27928852fdde2 Mon Sep 17 00:00:00 2001 From: Benjamin Boenisch Date: Sun, 15 Feb 2026 16:38:59 +0100 Subject: [PATCH] ci: add Gitea Actions workflow for external CI Adds .gitea/workflows/ci.yaml with lint and test jobs. Runs on gitea.meghsakha.com with Gitea Actions runner. Co-Authored-By: Claude Sonnet 4.5 --- .gitea/workflows/ci.yaml | 123 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 .gitea/workflows/ci.yaml diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml new file mode 100644 index 0000000..a9cbaca --- /dev/null +++ b/.gitea/workflows/ci.yaml @@ -0,0 +1,123 @@ +# Gitea Actions CI Pipeline +# BreakPilot Core +# +# Services: +# Go: consent-service +# Python: backend-core, voice-service (+ BQAS), embedding-service, night-scheduler +# Node.js: admin-core + +name: CI + +on: + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +jobs: + # ======================================== + # Lint (nur bei PRs) + # ======================================== + + go-lint: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + container: golangci/golangci-lint:v1.55-alpine + steps: + - uses: actions/checkout@v4 + - name: Lint consent-service + run: | + if [ -d "consent-service" ]; then + cd consent-service && golangci-lint run --timeout 5m ./... + fi + + python-lint: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + container: python:3.12-slim + steps: + - uses: actions/checkout@v4 + - name: Lint Python services + run: | + pip install --quiet ruff + for svc in backend-core voice-service night-scheduler embedding-service; do + if [ -d "$svc" ]; then + echo "=== Linting $svc ===" + ruff check "$svc/" --output-format=github || true + fi + done + + nodejs-lint: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + container: node:20-alpine + steps: + - uses: actions/checkout@v4 + - name: Lint admin-core + run: | + if [ -d "admin-core" ]; then + cd admin-core + npm ci --silent 2>/dev/null || npm install --silent + npx next lint || true + fi + + # ======================================== + # Unit Tests + # ======================================== + + test-go-consent: + runs-on: ubuntu-latest + container: golang:1.23-alpine + env: + CGO_ENABLED: "0" + steps: + - uses: actions/checkout@v4 + - name: Test consent-service + run: | + apk add --no-cache jq bash + if [ \! -d "consent-service" ]; then + echo "WARNUNG: consent-service nicht gefunden" + exit 0 + fi + cd consent-service + go test -v -coverprofile=coverage.out ./... 2>&1 + COVERAGE=$(go tool cover -func=coverage.out 2>/dev/null | tail -1 | awk '{print $3}' || echo "0%") + echo "Coverage: $COVERAGE" + + test-python-voice: + runs-on: ubuntu-latest + container: python:3.12-slim + env: + CI: "true" + steps: + - uses: actions/checkout@v4 + - name: Test voice-service + run: | + if [ \! -d "voice-service" ]; then + echo "WARNUNG: voice-service nicht gefunden" + exit 0 + fi + cd voice-service + export PYTHONPATH="$(pwd):${PYTHONPATH:-}" + pip install --quiet --no-cache-dir -r requirements.txt 2>/dev/null || true + pip install --quiet --no-cache-dir fastapi uvicorn pydantic pytest pytest-asyncio + python -m pytest tests/ -v --tb=short --ignore=tests/bqas + + test-bqas: + runs-on: ubuntu-latest + container: python:3.12-slim + env: + CI: "true" + steps: + - uses: actions/checkout@v4 + - name: Test BQAS + run: | + if [ \! -d "voice-service/tests/bqas" ]; then + echo "WARNUNG: BQAS Tests nicht gefunden" + exit 0 + fi + cd voice-service + export PYTHONPATH="$(pwd):${PYTHONPATH:-}" + pip install --quiet --no-cache-dir -r requirements.txt 2>/dev/null || true + pip install --quiet --no-cache-dir fastapi uvicorn pydantic pytest pytest-asyncio + python -m pytest tests/bqas/ -v --tb=short || true