Volunteer dash #125
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Backend CI | |
| on: | |
| push: | |
| branches: [ main, develop ] | |
| paths: | |
| - 'backend/**' | |
| - '.github/workflows/backend-ci.yml' | |
| pull_request: | |
| branches: [ main, develop ] | |
| paths: | |
| - 'backend/**' | |
| - '.github/workflows/backend-ci.yml' | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| env: | |
| POSTGRES_TEST_DATABASE_URL: postgresql://testuser:testpassword@localhost:5432/llsc_test | |
| strategy: | |
| matrix: | |
| python-version: [3.12] | |
| services: | |
| postgres: | |
| image: postgres:15 | |
| env: | |
| POSTGRES_PASSWORD: testpassword | |
| POSTGRES_USER: testuser | |
| POSTGRES_DB: llsc_test | |
| options: >- | |
| --health-cmd pg_isready | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install PDM | |
| run: | | |
| pip install pdm | |
| - name: Cache PDM dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pdm | |
| key: ${{ runner.os }}-pdm-${{ hashFiles('backend/pdm.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pdm- | |
| - name: Install dependencies | |
| working-directory: ./backend | |
| run: | | |
| pdm sync --group test --group lint --group dev | |
| - name: Set up environment variables | |
| working-directory: ./backend | |
| run: | | |
| echo "POSTGRES_TEST_DATABASE_URL=postgresql://testuser:testpassword@localhost:5432/llsc_test" >> .env | |
| echo "POSTGRES_DATABASE_URL=postgresql://testuser:testpassword@localhost:5432/llsc_test" >> .env | |
| echo "SECRET_KEY=test-secret-key-for-ci" >> .env | |
| echo "ENVIRONMENT=test" >> .env | |
| - name: Run database migrations | |
| working-directory: ./backend | |
| run: | | |
| export POSTGRES_DATABASE_URL="$POSTGRES_TEST_DATABASE_URL" | |
| pdm run alembic upgrade heads | |
| - name: Seed database with reference data | |
| working-directory: ./backend | |
| run: | | |
| export POSTGRES_DATABASE_URL="$POSTGRES_TEST_DATABASE_URL" | |
| pdm run seed | |
| - name: Run linting | |
| working-directory: ./backend | |
| run: | | |
| pdm run ruff check . | |
| pdm run ruff format --check . | |
| # TODO: Re-enable mypy when type annotations are improved | |
| # - name: Run type checking | |
| # working-directory: ./backend | |
| # run: | | |
| # pdm run mypy app/ --ignore-missing-imports | |
| - name: Run unit tests | |
| working-directory: ./backend | |
| run: | | |
| pdm run python -m pytest tests/unit/ -v --cov=app --cov-report=xml --cov-report=term-missing | |
| # Skipping functional tests for now; no active tests in tests/functional | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v4 | |
| with: | |
| file: ./backend/coverage.xml | |
| directory: ./backend | |
| flags: backend | |
| name: backend-coverage | |
| - name: Run security scan | |
| working-directory: ./backend | |
| run: | | |
| pdm run bandit -r app/ -f json -o security-report.json || true | |
| - name: Upload security report | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: security-report | |
| path: backend/security-report.json | |
| e2e-tests: | |
| if: ${{ false }} # Temporarily disabled until real E2E tests exist | |
| runs-on: ubuntu-latest | |
| needs: test | |
| env: | |
| POSTGRES_TEST_DATABASE_URL: postgresql://testuser:testpassword@localhost:5432/llsc_test | |
| services: | |
| postgres: | |
| image: postgres:15 | |
| env: | |
| POSTGRES_PASSWORD: testpassword | |
| POSTGRES_USER: testuser | |
| POSTGRES_DB: llsc_test | |
| options: >- | |
| --health-cmd pg_isready | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python 3.12 | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: 3.12 | |
| - name: Install PDM | |
| run: | | |
| pip install pdm | |
| - name: Install dependencies | |
| working-directory: ./backend | |
| run: | | |
| pdm sync --group test --group lint --group dev | |
| - name: Set up environment variables | |
| working-directory: ./backend | |
| run: | | |
| echo "POSTGRES_TEST_DATABASE_URL=postgresql://testuser:testpassword@localhost:5432/llsc_test" >> .env | |
| echo "POSTGRES_DATABASE_URL=postgresql://testuser:testpassword@localhost:5432/llsc_test" >> .env | |
| echo "SECRET_KEY=test-secret-key-for-ci" >> .env | |
| echo "ENVIRONMENT=test" >> .env | |
| echo "TEST_SCRIPT_BACKEND_URL=http://localhost:8000" >> .env | |
| echo "[email protected]" >> .env | |
| echo "TEST_SCRIPT_PASSWORD=testpassword" >> .env | |
| - name: Run database migrations | |
| working-directory: ./backend | |
| run: | | |
| export POSTGRES_DATABASE_URL="$POSTGRES_TEST_DATABASE_URL" | |
| pdm run alembic upgrade heads | |
| - name: Seed database with reference data | |
| working-directory: ./backend | |
| run: | | |
| export POSTGRES_DATABASE_URL="$POSTGRES_TEST_DATABASE_URL" | |
| pdm run seed | |
| - name: Start backend server | |
| working-directory: ./backend | |
| run: | | |
| pdm run uvicorn app.server:app --host 0.0.0.0 --port 8000 & | |
| sleep 10 # Wait for server to start | |
| - name: Run E2E tests | |
| working-directory: ./ | |
| run: | | |
| pdm run python -m pytest e2e-tests/ -v --tb=short | |
| docker-build: | |
| runs-on: ubuntu-latest | |
| needs: test | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Build Docker image | |
| working-directory: ./backend | |
| run: | | |
| docker build -t llsc-backend:latest . | |
| - name: Test Docker image | |
| run: | | |
| docker run --rm llsc-backend:latest python --version | |
| notify: | |
| runs-on: ubuntu-latest | |
| needs: [test, e2e-tests] | |
| if: always() | |
| steps: | |
| - name: Notify on success | |
| if: needs.test.result == 'success' && needs.e2e-tests.result == 'success' | |
| run: | | |
| echo "✅ All tests passed! Backend is ready for deployment." | |
| - name: Notify on failure | |
| if: needs.test.result == 'failure' || needs.e2e-tests.result == 'failure' | |
| run: | | |
| echo "❌ Tests failed! Please check the logs." | |
| exit 1 |