Skip to content

Commit 4f3c24b

Browse files
authored
ci(trader): add Docker smoke test (#38)
1 parent 94b6401 commit 4f3c24b

2 files changed

Lines changed: 114 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
name: Trader Docker Smoke
2+
3+
on:
4+
pull_request:
5+
paths:
6+
- "apps/trader/**"
7+
- "packages/schemas-python/**"
8+
- "packages/calibration-python/**"
9+
- "pyproject.toml"
10+
- "uv.lock"
11+
- ".dockerignore"
12+
- "scripts/smoke-trader-docker.sh"
13+
- ".github/workflows/trader-docker-smoke.yml"
14+
push:
15+
branches: [main]
16+
paths:
17+
- "apps/trader/**"
18+
- "packages/schemas-python/**"
19+
- "packages/calibration-python/**"
20+
- "pyproject.toml"
21+
- "uv.lock"
22+
- ".dockerignore"
23+
- "scripts/smoke-trader-docker.sh"
24+
- ".github/workflows/trader-docker-smoke.yml"
25+
workflow_dispatch:
26+
27+
permissions:
28+
contents: read
29+
30+
jobs:
31+
trader-docker-smoke:
32+
name: Build and boot prism-trader image
33+
runs-on: ubuntu-latest
34+
timeout-minutes: 10
35+
env:
36+
DOCKER_BUILDKIT: "1"
37+
steps:
38+
- name: Checkout
39+
uses: actions/checkout@v4
40+
41+
- name: Smoke test trader Docker image
42+
run: scripts/smoke-trader-docker.sh

scripts/smoke-trader-docker.sh

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
ROOT="${1:-}"
5+
if [[ -z "$ROOT" ]]; then
6+
if git_root="$(git rev-parse --show-toplevel 2>/dev/null)"; then
7+
ROOT="$git_root"
8+
else
9+
ROOT="$(pwd)"
10+
fi
11+
fi
12+
ROOT="$(cd "$ROOT" && pwd)"
13+
14+
IMAGE="${IMAGE:-prism-trader-smoke:${GITHUB_SHA:-local}}"
15+
CONTAINER="prism-trader-smoke-${RANDOM}-$$"
16+
LOG_FILE="$(mktemp)"
17+
HEALTH_FILE="$(mktemp)"
18+
19+
cleanup() {
20+
docker rm -f "$CONTAINER" >/dev/null 2>&1 || true
21+
rm -f "$LOG_FILE" "$HEALTH_FILE"
22+
}
23+
trap cleanup EXIT
24+
25+
echo "Building $IMAGE from $ROOT/apps/trader/Dockerfile"
26+
docker build -f "$ROOT/apps/trader/Dockerfile" -t "$IMAGE" "$ROOT"
27+
28+
echo "Starting $CONTAINER"
29+
docker run -d --name "$CONTAINER" \
30+
-e DATABASE_URL="postgresql://prism:prism@127.0.0.1:1/prism?connect_timeout=1" \
31+
-e CIRCLE_API_KEY="dummy-circle-api-key" \
32+
-e CIRCLE_ENTITY_SECRET="dummy-circle-entity-secret" \
33+
-e CIRCLE_WALLET_SET_ID="dummy-wallet-set" \
34+
-e PINATA_JWT="dummy-pinata-jwt" \
35+
-e ARC_RPC_URL="http://127.0.0.1:8545" \
36+
-e ANTHROPIC_API_KEY="dummy-anthropic-api-key" \
37+
-e CIRCLE_WALLET_TRADER_ID="dummy-trader-wallet" \
38+
-e CIRCLE_WALLET_TRADER_ADDRESS="0x0000000000000000000000000000000000000001" \
39+
-e TRADER_MODEL="claude-sonnet-4-20250514" \
40+
-e LOCALE="EE" \
41+
-e PRISM_TRADE_MODE="paper" \
42+
-p 127.0.0.1::3201 \
43+
"$IMAGE" >/dev/null
44+
45+
for _ in {1..40}; do
46+
docker logs "$CONTAINER" >"$LOG_FILE" 2>&1 || true
47+
48+
if grep -Fq 'workspace in `tool.uv.sources`' "$LOG_FILE" \
49+
|| grep -Fq 'Failed to parse entry: `prism-sentinel`' "$LOG_FILE"; then
50+
echo "::error::Trader container hit the uv workspace parsing failure."
51+
cat "$LOG_FILE"
52+
exit 1
53+
fi
54+
55+
port="$(docker port "$CONTAINER" 3201/tcp 2>/dev/null | awk -F: '/127[.]0[.]0[.]1/ {print $NF; exit}')"
56+
if [[ -n "$port" ]] && curl -fsS "http://127.0.0.1:$port/health" >"$HEALTH_FILE" 2>/dev/null; then
57+
echo "Trader Docker smoke passed: $(cat "$HEALTH_FILE")"
58+
exit 0
59+
fi
60+
61+
if ! docker ps --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
62+
echo "::error::Trader container exited before /health became available."
63+
cat "$LOG_FILE"
64+
exit 1
65+
fi
66+
67+
sleep 1
68+
done
69+
70+
echo "::error::Timed out waiting for trader /health."
71+
cat "$LOG_FILE"
72+
exit 1

0 commit comments

Comments
 (0)