name: CI on: pull_request: types: [opened, synchronize, reopened] permissions: contents: read concurrency: group: ci-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: frontend: name: Frontend tests and lint if: github.event.pull_request.head.repo.full_name != github.repository runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 22 cache: npm - name: Install JavaScript dependencies run: npm ci - name: Run JavaScript tests run: npm test - name: Run ESLint run: npm run lint backend: name: Python tests and static checks if: github.event.pull_request.head.repo.full_name != github.repository runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v6 with: python-version: "3.10" cache: pip - name: Install Python dependencies run: python -m pip install --upgrade pip && python -m pip install -e ".[dev]" - name: Run Python tests with workflow coverage run: >- python -m pytest -q --cov=core.workflow --cov-report=term-missing --cov-report=xml:coverage-workflow.xml --cov-fail-under=75 - name: Upload workflow coverage report uses: actions/upload-artifact@v4 with: name: workflow-coverage path: coverage-workflow.xml if-no-files-found: error - name: Run Ruff run: python -m ruff check __init__.py core - name: Check Python syntax run: python -m compileall -q __init__.py core