name: PR tests on: pull_request: types: [opened, synchronize, edited, reopened] jobs: build-and-smoke: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Install uv uses: astral-sh/setup-uv@v5 - name: Set up Python run: uv python install with: python-version-file: "pyproject.toml" - name: Install the project dependencies run: | uv sync --all-groups uv add pip uv export --format requirements.txt -o requirements.txt # uv run python -m pip install --upgrade pip # uv run python -m pip install -r requirements.txt - name: Build image run: | docker build -t semapform-api:test-pr . - name: Start container (background) run: | docker run -d --name semapform-test -p 8001:8001 semapform-api:test-pr sleep infinity - name: Verify python module imports run: | docker exec semapform-test python -c "import api_service; print('import ok')" - name: Start server in container and smoke test HTTP env: PORT: 8001 run: | # start uvicorn inside the container (background) docker exec -d semapform-test uv run uvicorn api_service:app --host 0.0.0.0 --port $PORT # wait for up to 20s for the server to respond SECONDS=0 until curl -sS "http://localhost:${PORT}/" -o /dev/null; do sleep 1 SECONDS=$((SECONDS+1)) if [ $SECONDS -ge 20 ]; then echo "server failed to respond within timeout" >&2 docker logs semapform-test || true exit 1 fi done - name: Cleanup container if: always() run: | docker rm -f semapform-test || true