name: Prebuild CI & Docker Test Build on: workflow_dispatch: push: branches: - prebuild pull_request: branches: - prebuild jobs: frontend-test-build: name: Frontend (Test & Build) runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: "20" cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Install dependencies working-directory: ./frontend run: npm ci - name: Run frontend tests working-directory: ./frontend run: npm test -- --watchAll=false - name: Build React app working-directory: ./frontend run: npm run build backend-mypy: name: Backend Lint (mypy) runs-on: ubuntu-latest continue-on-error: true steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip cache-dependency-path: app/requirements.txt - name: Install dependencies run: | pip install mypy pip install -r app/requirements.txt - name: Run mypy run: mypy --ignore-missing-imports ./app backend-pytest: name: Backend Tests (pytest) runs-on: ubuntu-latest env: MONGO_HOST: "127.0.0.1" MONGO_PORT: ${{ secrets.MONGO_PORT || '27017' }} MONGO_USER: ${{ secrets.MONGO_USER || 'admin' }} MONGO_PASS: ${{ secrets.MONGO_PASS || 'secret' }} RABBIT_HOST: "127.0.0.1" RABBIT_PORT: ${{ secrets.RABBIT_PORT || '5672' }} RABBIT_USER: ${{ secrets.RABBIT_USER || 'guest' }} RABBIT_PASS: ${{ secrets.RABBIT_PASS || 'guest' }} DEV_MODE: ${{ secrets.DEV_MODE || 'true' }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip cache-dependency-path: app/requirements.txt - name: Start MongoDB run: | docker run -d --name mongodb \ -p "${MONGO_PORT}:27017" \ -e "MONGO_INITDB_ROOT_USERNAME=${MONGO_USER}" \ -e "MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASS}" \ mongodb/mongodb-community-server for i in $(seq 1 30); do docker exec mongodb mongosh \ --username "${MONGO_USER}" --password "${MONGO_PASS}" \ --eval "db.runCommand({ping:1})" && break sleep 1 done - name: Start RabbitMQ run: | docker run -d --name rabbitmq \ -p "${RABBIT_PORT}:5672" \ -e "RABBITMQ_DEFAULT_USER=${RABBIT_USER}" \ -e "RABBITMQ_DEFAULT_PASS=${RABBIT_PASS}" \ rabbitmq:3.13-alpine for i in $(seq 1 30); do docker exec rabbitmq rabbitmq-diagnostics -q ping && break sleep 1 done - name: Install dependencies run: | python -m pip install --upgrade pip pip install pytest==8.3.4 pytest-asyncio==0.25.3 httpx==0.28.1 pip install -r app/requirements.txt - name: Setup moderated base cards working-directory: ./app/tools run: python3 _add_base_cards.py -a 2 -f data/base_cards.json - name: Run pytest run: pytest -vs docker-test-build: name: Docker Images Test Build (No Push) runs-on: ubuntu-latest needs: [frontend-test-build, backend-mypy, backend-pytest] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Build Docker images (dry-run test via docker compose) run: docker compose build