name: CI on: push: branches: [main] pull_request: branches: [main] env: PYTHON_VERSION: '3.11' NODE_VERSION: '20' # Cancel in-progress runs for the same branch concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: # ============================================================================ # Backend Checks # ============================================================================ backend-lint: name: Backend Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install ruff run: pip install ruff - name: Run ruff check run: ruff check backend/ - name: Run ruff format check run: ruff format --check backend/ backend-tests: name: Backend Tests runs-on: ubuntu-latest needs: backend-lint steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ env.PYTHON_VERSION }} - name: Cache pip uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest pytest-asyncio pytest-cov - name: Run unit tests run: | cd backend python -m pytest tests/unit/ -v --tb=short -m "not slow" # ============================================================================ # Frontend Checks # ============================================================================ frontend-lint: name: Frontend Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Install dependencies working-directory: frontend run: npm ci - name: Run ESLint working-directory: frontend run: npm run lint frontend-typecheck: name: Frontend Type Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Install dependencies working-directory: frontend run: npm ci - name: Run TypeScript check working-directory: frontend run: npx tsc --noEmit frontend-tests: name: Frontend Tests runs-on: ubuntu-latest needs: [frontend-lint, frontend-typecheck] steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Install dependencies working-directory: frontend run: npm ci - name: Run tests working-directory: frontend run: npm run test:run frontend-build: name: Frontend Build runs-on: ubuntu-latest needs: [frontend-tests] steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Install dependencies working-directory: frontend run: npm ci - name: Build working-directory: frontend run: npm run build # ============================================================================ # Docker Build (optional, for release confidence) # ============================================================================ docker-build: name: Docker Build runs-on: ubuntu-latest needs: [backend-tests, frontend-build] steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image uses: docker/build-push-action@v6 with: context: . push: false tags: bambuddy:test cache-from: type=gha cache-to: type=gha,mode=max