name: CI on: push: branches: ['**'] pull_request: permissions: contents: read concurrency: group: ci-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: backend: name: Backend runs-on: ubuntu-latest defaults: run: working-directory: backend steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v7 with: node-version: 20 cache: npm cache-dependency-path: backend/package-lock.json - run: npm ci - run: npm run typecheck - run: npm test - run: npm run build frontend: name: Frontend runs-on: ubuntu-latest defaults: run: working-directory: frontend steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v7 with: node-version: 20 cache: npm cache-dependency-path: frontend/package-lock.json - run: npm ci - run: npm run build - run: npx playwright install --with-deps chromium - run: npm run test:e2e workers-and-compose: name: Workers and Compose runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-python@v7 with: python-version: '3.12' - name: Compile Python workers run: python -m py_compile viewshed-worker/worker.py viewshed-worker/rf/*.py ml-path-learner/worker.py - name: Validate Compose configuration env: POSTGRES_PASSWORD: ci-postgres-password REDIS_PASSWORD: ci-redis-password JWT_SECRET: ci-jwt-secret OPERATOR_SITE_TOKEN: ci-operator-site-token-0123456789abcdef0123456789abcdef MQTT_PASSWORD: ci-mqtt-password ANUBIS_ED25519_PRIVATE_KEY_HEX: '0000000000000000000000000000000000000000000000000000000000000001' GRAFANA_ADMIN_PASSWORD: ci-grafana-password run: docker compose config --quiet