name: Tests on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] jobs: test: name: Test runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.10' - name: Cache pip packages uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('backend/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip cd backend pip install -r requirements.txt - name: Run tests with coverage run: | cd backend pytest --cov=app --cov-report=xml --cov-report=term-missing - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: file: ./backend/coverage.xml flags: unittests name: codecov-umbrella fail_ci_if_error: false lint: name: Lint and Format Check runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.10' - name: Install linting tools run: | python -m pip install --upgrade pip pip install pylint black flake8 isort mypy cd backend && pip install -r requirements.txt - name: Run Black (format check) run: | black --check backend/app - name: Run isort (import order check) run: | isort --check-only backend/app - name: Run Flake8 run: | flake8 backend/app --max-line-length=100 --extend-ignore=E203,W503,E501 - name: Run Pylint run: | pylint backend/app --max-line-length=100 --disable=C0111,R0903 continue-on-error: true docker: name: Docker Build & Publish runs-on: ubuntu-latest needs: [test, lint] if: github.event_name == 'push' && github.ref == 'refs/heads/main' permissions: contents: read packages: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata for Docker id: meta uses: docker/metadata-action@v5 with: images: ghcr.io/${{ github.repository }} tags: | type=ref,event=branch type=sha,prefix= type=raw,value=latest,enable={{is_default_branch}} - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: ./backend file: ./backend/Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max