@@ -60,11 +60,19 @@ jobs:
6060 run : |
6161 echo "Pre-pulling base images to speed up builds..."
6262 docker pull python:3.12-slim &
63+ docker pull ghcr.io/astral-sh/uv:0.9.17 &
6364 docker pull alpine:latest &
6465 docker pull confluentinc/cp-kafka:7.5.0 &
6566 docker pull confluentinc/cp-zookeeper:7.5.0 &
66- docker pull mongo:7 &
67+ docker pull confluentinc/cp-schema-registry:7.5.0 &
68+ docker pull mongo:8.0 &
6769 docker pull redis:7-alpine &
70+ docker pull grafana/grafana:latest &
71+ docker pull jaegertracing/all-in-one:1.52 &
72+ docker pull victoriametrics/victoria-metrics:v1.96.0 &
73+ docker pull otel/opentelemetry-collector-contrib:0.91.0 &
74+ docker pull obsidiandynamics/kafdrop:3.31.0 &
75+ docker pull danielqsj/kafka-exporter:latest &
6876 wait
6977 echo "Base images pulled successfully"
7078
8088 yq eval '.services.backend.environment += ["MONGO_ROOT_PASSWORD=rootpassword"]' -i docker-compose.ci.yaml
8189 # Disable OpenTelemetry SDK during tests to avoid exporter retries
8290 yq eval '.services.backend.environment += ["OTEL_SDK_DISABLED=true"]' -i docker-compose.ci.yaml
91+ # Remove ./backend:/app volume mount - CI doesn't need hot-reload and it creates .venv permission conflicts
92+ yq eval '.services.backend.volumes = [.services.backend.volumes[] | select(. != "./backend:/app")]' -i docker-compose.ci.yaml
8393
8494 # MongoDB service already has defaults in docker-compose.yaml (root/rootpassword)
8595 # No need to override them
@@ -120,6 +130,8 @@ jobs:
120130 *.cache-from=type=gha,scope=buildkit-${{ github.repository }}-main
121131 *.cache-to=type=gha,mode=max,scope=buildkit-${{ github.repository }}-${{ github.ref_name }}
122132 *.pull=true
133+ env :
134+ BUILDKIT_PROGRESS : plain
123135
124136 - name : Start services
125137 run : |
@@ -130,7 +142,7 @@ jobs:
130142 docker compose -f docker-compose.ci.yaml logs
131143 exit 1
132144 )
133-
145+
134146 echo "Services started. Waiting for stabilization..."
135147 sleep 45
136148
@@ -145,7 +157,7 @@ jobs:
145157
146158 echo "Checking backend logs:"
147159 docker compose -f docker-compose.ci.yaml logs backend || echo "backend not found"
148-
160+
149161 # Explicitly check for containers that have exited
150162 if docker compose -f docker-compose.ci.yaml ps | grep -q 'Exit'; then
151163 echo "::error::One or more containers have exited unexpectedly. See logs above."
@@ -171,18 +183,17 @@ jobs:
171183 kubectl get roles -n default
172184 kubectl get rolebindings -n default
173185
174- - name : Set up Python for Tests
175- uses : actions /setup-python@v4
186+ - name : Set up uv
187+ uses : astral-sh /setup-uv@v5
176188 with :
177- python-version : ' 3.12'
189+ enable-cache : true
190+ cache-dependency-glob : " backend/uv.lock"
178191
179- - name : Install Python test dependencies
192+ - name : Install Python and dependencies
180193 run : |
181- sudo apt-get update
182- sudo apt-get install -y python3 python3-pip
183194 cd backend
184- pip3 install -r requirements.txt
185- pip3 install -r requirements-dev.txt
195+ uv python install 3.12
196+ uv sync --frozen
186197
187198 - name : Run backend tests with coverage
188199 timeout-minutes : 5
@@ -202,7 +213,7 @@ jobs:
202213 echo "Using BACKEND_BASE_URL=$BACKEND_BASE_URL"
203214 echo "Using SCHEMA_SUBJECT_PREFIX=$SCHEMA_SUBJECT_PREFIX"
204215 echo "MongoDB connection will use default CI credentials"
205- python -m pytest tests/integration tests/unit -v --cov=app --cov-branch --cov-report=xml --cov-report=term --cov-report=term-missing
216+ uv run pytest tests/integration tests/unit -v --cov=app --cov-branch --cov-report=xml --cov-report=term --cov-report=term-missing
206217
207218 - name : Upload coverage to Codecov
208219 uses : codecov/codecov-action@v5
0 commit comments