@@ -128,6 +128,103 @@ jobs:
128128 name : " test-results-node-${{ matrix.node-version }}-pg-${{ matrix.pg-version }}"
129129 path : ' src/packages/*/junit.xml'
130130
131+ - name : Create CI admin user and API key
132+ run : |
133+ cd src/packages/hub
134+ node run/test-create-admin.js > ../../api_key.txt
135+ # Validate API key was created
136+ if [ ! -s ../../api_key.txt ]; then
137+ echo "Error: API key file is empty or missing"
138+ exit 1
139+ fi
140+ API_KEY=$(cat ../../api_key.txt)
141+ if ! echo "$API_KEY" | grep -qE '^sk-[A-Za-z0-9]+$'; then
142+ echo "Error: Invalid API key format: $API_KEY"
143+ exit 1
144+ fi
145+ echo "API key created successfully"
146+ env :
147+ PGDATABASE : smc
148+ PGUSER : smc
149+ PGHOST : localhost
150+
151+ - name : Start CoCalc Hub
152+ run : |
153+ cd src/packages/hub
154+ pnpm run hub-project-dev-nobuild > hub.log 2>&1 &
155+ HUB_PID=$!
156+ echo $HUB_PID > hub.pid
157+ echo "Hub started with PID $HUB_PID"
158+ # Check if process is still running after a moment
159+ sleep 2
160+ if ! kill -0 $HUB_PID 2>/dev/null; then
161+ echo "Error: Hub process died immediately after starting"
162+ echo "Hub log:"
163+ cat hub.log
164+ exit 1
165+ fi
166+ env :
167+ PGDATABASE : smc
168+ PGUSER : smc
169+ PGHOST : localhost
170+ COCALC_MODE : single-user
171+
172+ - name : Wait for hub readiness
173+ run : |
174+ MAX_ATTEMPTS=30
175+ READY=false
176+ for i in $(seq 1 $MAX_ATTEMPTS); do
177+ if curl -f --max-time 3 http://localhost:5000/healthcheck; then
178+ echo "Hub is ready"
179+ READY=true
180+ break
181+ fi
182+ echo "Waiting for hub... ($i/$MAX_ATTEMPTS)"
183+ sleep 3
184+ done
185+ if [ "$READY" = "false" ]; then
186+ echo "Hub failed to become ready after $MAX_ATTEMPTS attempts"
187+ echo "Hub log:"
188+ cat src/packages/hub/hub.log || echo "No log file found"
189+ exit 1
190+ fi
191+
192+ - name : Install uv for cocalc-api tests
193+ run : curl -LsSf https://astral.sh/uv/install.sh | sh && echo "$HOME/.local/bin" >> $GITHUB_PATH
194+
195+ - name : Run cocalc-api tests
196+ run : |
197+ export COCALC_API_KEY=$(cat src/api_key.txt)
198+ export COCALC_HOST=http://localhost:5000
199+ cd src/python/cocalc-api && uv run pytest --junitxml=test-results.xml
200+
201+ - name : Stop CoCalc Hub
202+ if : always()
203+ run : |
204+ if [ -f src/packages/hub/hub.pid ]; then
205+ HUB_PID=$(cat src/packages/hub/hub.pid)
206+ echo "Stopping hub with PID $HUB_PID"
207+ kill $HUB_PID || true
208+ # Wait a bit for graceful shutdown
209+ sleep 2
210+ # Force kill if still running
211+ kill -9 $HUB_PID 2>/dev/null || true
212+ fi
213+
214+ - name : Upload hub logs
215+ uses : actions/upload-artifact@v4
216+ if : always()
217+ with :
218+ name : " hub-logs-node-${{ matrix.node-version }}-pg-${{ matrix.pg-version }}"
219+ path : ' src/packages/hub/hub.log'
220+
221+ - name : Upload cocalc-api test results
222+ uses : actions/upload-artifact@v4
223+ if : always()
224+ with :
225+ name : " cocalc-api-test-results-node-${{ matrix.node-version }}-pg-${{ matrix.pg-version }}"
226+ path : ' src/python/cocalc-api/test-results.xml'
227+
131228 report :
132229 runs-on : ubuntu-latest
133230
0 commit comments