name: CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: setup-environment: name: Generate Certificates runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Generate SSL Certificates run: | sudo apt-get update && sudo apt-get install -y mkcert libnss3-tools mkdir -p certs mkcert -install mkcert -cert-file certs/localhost.pem -key-file certs/localhost-key.pem localhost 127.0.0.1 ::1 - name: Upload certificates uses: christopherHX/gitea-upload-artifact@v4 with: name: ssl-certs path: certs/ retention-days: 1 frontend: name: Frontend CI runs-on: ubuntu-latest needs: setup-environment defaults: run: working-directory: ./frontend steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 - name: Restore certificates uses: christopherHX/gitea-download-artifact@v4 with: name: ssl-certs path: certs/ - name: Install dependencies run: bun install --frozen-lockfile - name: Code Quality run: | cp ../.env.example ../.env bun run check - name: Type Check & Build run: bun run build - name: Unit Tests run: bun run test backend: name: Backend CI runs-on: ubuntu-latest needs: setup-environment services: db: image: postgres:16-alpine env: POSTGRES_DB: piku__test POSTGRES_USER: test POSTGRES_PASSWORD: password123 ports: - 5442:5432 options: --tmpfs /var/lib/postgresql/data --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 defaults: run: working-directory: ./backend steps: - uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v5 with: enable-cache: true cache-dependency-glob: "backend/uv.lock" - name: Restore certificates uses: christopherHX/gitea-download-artifact@v4 with: name: ssl-certs path: certs/ - name: Setup & Test run: | cp ../.env.example ../.env uv sync export DB_NAME="piku__test" export DB_USER="test" export DB_PASSWORD="password123" if [ "$GITEA_ACTIONS" = "true" ]; then export DB_HOST="db" export DB_PORT="5432" else export DB_HOST="127.0.0.1" export DB_PORT="5442" fi uv run ruff check uv run python manage.py test e2e: name: E2E Tests runs-on: ubuntu-latest needs: setup-environment # Skipping on Gitea pushes until cache server is configured if: github.server_url == 'https://github.com' || github.event_name == 'pull_request' steps: - uses: actions/checkout@v4 - name: Restore Certificates uses: christopherHX/gitea-download-artifact@v4 with: name: ssl-certs path: certs/ - name: Setup Tools uses: astral-sh/setup-uv@v5 - uses: oven-sh/setup-bun@v2 - name: Cache Playwright id: playwright-cache # Disable cache when not using GitHub Actions because the runner spends ~3mins trying to upload the cache and failing # TODO: setup cache server in Gitea if: github.server_url == 'https://github.com' uses: actions/cache@v3 with: path: ~/.cache/ms-playwright key: ${{ runner.os }}-playwright-${{ hashFiles('frontend/bun.lock') }} - name: Install Dependencies run: | (cd frontend && bun install) if [ "${{ steps.playwright-cache.outputs.cache-hit }}" != "true" ]; then (cd frontend && bun x playwright install --with-deps) fi - name: Run E2E run: | cp .env.e2e.example .env.e2e chmod +x ./scripts/run-e2e.sh ./scripts/run-e2e.sh env: CI: "true" - name: Upload Playwright Report if: always() uses: christopherHX/gitea-upload-artifact@v4 with: name: playwright-report path: frontend/playwright-report/ retention-days: 10 - name: Print Backend Logs on Failure if: failure() run: cat tmp/logs/backend.log || true