name: Backend CI on: push: branches: [ main, develop ] paths: - 'backend/**' - '.github/workflows/backend.yml' pull_request: branches: [ main, develop ] paths: - 'backend/**' - '.github/workflows/backend.yml' jobs: backend-test: runs-on: [docker] env: UNIQUE_DB: test_db_${{ github.run_id }} services: postgres: image: postgres:15-alpine env: POSTGRES_USER: test POSTGRES_PASSWORD: test POSTGRES_DB: test_db_${{ github.run_id }}_${{ github.run_attempt }} options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 container: image: nikolaik/python-nodejs:python3.12-nodejs24-alpine options: --volume forgejo-pip-cache:/tmp/pip-cache steps: - uses: actions/checkout@v6 - name: Set up Python run: | python --version - name: Install dependencies run: | cd backend python -m pip install --upgrade pip pip install --cache-dir /tmp/pip-cache -r requirements/dev.txt - name: Create Unique Test Database env: DATABASE_URL: postgresql://test:test@postgres:5432/postgres run: | # Install postgresql-client if not present in the alpine image to run psql # Or use python to create the db cd backend python -c " import os from sqlalchemy import create_engine, text db_url = os.environ['DATABASE_URL'] engine = create_engine(db_url) new_db = os.environ['UNIQUE_DB'] # Connect to default 'postgres' db to create the new one with engine.connect() as conn: conn.execute(text('COMMIT')) # Close any open transactions conn.execute(text(f'DROP DATABASE IF EXISTS {new_db}')) conn.execute(text(f'CREATE DATABASE {new_db}')) print(f'Created database: {new_db}') " - name: Debug cache run: | echo "Listing PIP cache files:" pip cache dir ls -la /tmp/pip-cache 2>/dev/null || echo "Cache dir empty or missing" - name: Lint with flake8 run: | cd backend flake8 app tests --count --max-complexity=10 --max-line-length=127 --statistics --show-source - name: Run tests env: TEST_DATABASE_URL: postgresql://test:test@postgres:5432/${{ env.UNIQUE_DB }} DATABASE_URL: postgresql://test:test@postgres:5432/${{ env.UNIQUE_DB }} SECRET_KEY: test-secret-key JWT_SECRET_KEY: test-jwt-secret FLASK_ENV: test run: | cd backend pytest --cov=app --cov-report=xml --cov-report=term