name: CI on: push: branches: [master] pull_request: branches: [master] jobs: backend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install uv run: | curl -LsSf https://astral.sh/uv/install.sh | sh echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Sync dependencies working-directory: backend run: uv sync - name: Run tests working-directory: backend run: uv run pytest -v frontend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' cache-dependency-path: frontend/package-lock.json - name: Install dependencies working-directory: frontend run: npm ci - name: Lint (if configured) working-directory: frontend run: | if [ -f eslint.config.js ] || [ -f .eslintrc.json ] || [ -f .eslintrc.js ]; then npm run lint else echo "No ESLint config found, skipping lint" fi - name: Build working-directory: frontend run: npm run build - name: Test working-directory: frontend run: npm test docker: runs-on: ubuntu-latest needs: [backend, frontend] steps: - uses: actions/checkout@v4 - name: Build Docker image run: docker build -t life-towers:${{ github.sha }} . - name: Push to registry if: github.event_name == 'push' && github.ref == 'refs/heads/master' env: REGISTRY_URL: ${{ secrets.REGISTRY_URL }} REGISTRY_USER: ${{ secrets.REGISTRY_USER }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} run: | if [ -z "$REGISTRY_URL" ] || [ -z "$REGISTRY_USER" ] || [ -z "$REGISTRY_PASSWORD" ]; then echo "Registry secrets not configured, skipping push" exit 0 fi echo "$REGISTRY_PASSWORD" | docker login "$REGISTRY_URL" -u "$REGISTRY_USER" --password-stdin docker tag life-towers:${{ github.sha }} "$REGISTRY_URL/life-towers:${{ github.sha }}" docker tag life-towers:${{ github.sha }} "$REGISTRY_URL/life-towers:latest" docker push "$REGISTRY_URL/life-towers:${{ github.sha }}" docker push "$REGISTRY_URL/life-towers:latest"