Skip to content

build(deps): bump the maven group across 11 directories with 1 update #455

build(deps): bump the maven group across 11 directories with 1 update

build(deps): bump the maven group across 11 directories with 1 update #455

name: "CI: Foundation E2E"
# Runs the Playwright suite under /e2e (the foundation proof
# samples). Separate workflow from e2e.yml so it doesn't compete with
# the integration-tests matrix for runners; it boots personal-assistant
# and coding-agent samples via `./mvnw spring-boot:run` (no fat-jar
# prebuild, no shell curl for readiness — the /actuator/health endpoint
# is the standard Spring Boot liveness probe).
#
# Specs that require a live LLM (schedule/research/draft) are skipped
# when no LLM_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY is set — they
# still run nightly in e2e-real-llm.yml.
on:
push:
branches: ['**']
paths:
- 'modules/**'
- 'samples/spring-boot-personal-assistant/**'
- 'samples/spring-boot-coding-agent/**'
- 'samples/spring-boot-reattach-harness/**'
- 'e2e/**'
- '.mvn/**'
- 'pom.xml'
- '.github/workflows/foundation-e2e.yml'
pull_request:
branches: [main]
workflow_dispatch:
concurrency:
group: foundation-e2e-${{ github.ref }}
cancel-in-progress: true
jobs:
foundation-e2e:
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: 21
distribution: temurin
cache: maven
- name: Use Node 20
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install framework modules into local Maven repo
# spring-boot:run needs the framework deps on the classpath but does
# not produce a fat jar; install the reactor once so all three
# samples can resolve them at run-time.
run: |
./mvnw install -Pfastinstall -DskipTests \
-pl samples/spring-boot-personal-assistant,samples/spring-boot-coding-agent,samples/spring-boot-reattach-harness \
-am -q
- name: Install Playwright deps
working-directory: e2e
run: |
npm ci
npx playwright install --with-deps chromium
- name: Type-check Playwright specs
working-directory: e2e
run: npx tsc --noEmit
# ── Personal-assistant sample ─────────────────────────────────
- name: Start personal-assistant sample
run: |
# Boot via Spring Boot Maven plugin — no fat-jar repackage step,
# no custom classpath assembly. The JVM process backgrounds here
# and tears down via PID file after the specs run.
nohup ./mvnw -pl samples/spring-boot-personal-assistant -q \
spring-boot:run \
-Dspring-boot.run.arguments='--server.port=8080' \
> /tmp/pa-run.log 2>&1 &
echo $! > /tmp/pa.pid
- name: Wait for personal-assistant /actuator/health
# actuator/health is the standard Spring Boot readiness probe.
# Replaces the old curl-the-console loop — status UP guarantees
# the Atmosphere framework finished init, not just Tomcat.
run: npx --yes wait-on --timeout 180000 http://localhost:8080/actuator/health
- name: Run personal-assistant specs
working-directory: e2e
env:
ATMO_E2E_BASE_URL: http://localhost:8080
run: npx playwright test tests/personal-assistant.spec.ts --reporter=list
- name: Stop personal-assistant
if: always()
run: |
if [ -f /tmp/pa.pid ]; then
kill "$(cat /tmp/pa.pid)" 2>/dev/null || true
fi
# Kill any leftover maven/spring-boot child java process on 8080.
pkill -f "spring-boot-personal-assistant" 2>/dev/null || true
sleep 2
# ── Coding-agent sample ───────────────────────────────────────
- name: Verify Docker available for sandbox spec
# ubuntu-latest ships with Docker; the clone/read spec needs the
# DockerSandboxProvider. Fail early here if the runner changed.
run: docker version --format '{{.Server.Version}}'
- name: Start coding-agent sample
run: |
nohup ./mvnw -pl samples/spring-boot-coding-agent -q \
spring-boot:run \
-Dspring-boot.run.arguments='--server.port=8080' \
> /tmp/ca-run.log 2>&1 &
echo $! > /tmp/ca.pid
- name: Wait for coding-agent /actuator/health
run: npx --yes wait-on --timeout 180000 http://localhost:8080/actuator/health
- name: Run coding-agent specs
working-directory: e2e
env:
ATMO_E2E_BASE_URL: http://localhost:8080
run: |
# Full spec set including the Docker sandbox clone+read regression
# — the surface where the argv-form exec + strict URL allowlist
# live. SKIP_SANDBOX_E2E is deliberately NOT set.
npx playwright test tests/coding-agent.spec.ts --reporter=list
- name: Stop coding-agent
if: always()
run: |
if [ -f /tmp/ca.pid ]; then
kill "$(cat /tmp/ca.pid)" 2>/dev/null || true
fi
pkill -f "spring-boot-coding-agent" 2>/dev/null || true
# ── Reattach-harness sample ───────────────────────────────────
# Deterministic harness for the mid-stream reattach wire. Runs on
# port 8096 so it can coexist with the personal-assistant/coding-agent
# stops above (those used 8080). The sample has no LLM dispatch —
# just a slow-emit @AiEndpoint plus a REST surface that pre-populates
# the RunRegistry so the Playwright spec can drive the HTTP →
# reattachPendingRun → replayPendingRun wire without timing flake.
- name: Start reattach-harness sample
run: |
nohup ./mvnw -pl samples/spring-boot-reattach-harness -q \
spring-boot:run \
-Dspring-boot.run.arguments='--server.port=8096' \
> /tmp/rh-run.log 2>&1 &
echo $! > /tmp/rh.pid
- name: Wait for reattach-harness readiness
# The harness exposes the AI endpoint only; /actuator isn't wired.
# A successful GET against the endpoint root means the framework
# + @AiEndpoint registrar are up.
run: npx --yes wait-on --timeout 120000 http://localhost:8096/atmosphere/agent/harness/
- name: Run reattach spec
working-directory: e2e
env:
ATMO_E2E_BASE_URL: http://localhost:8096
run: npx playwright test tests/reattach.spec.ts --reporter=list
- name: Stop reattach-harness
if: always()
run: |
if [ -f /tmp/rh.pid ]; then
kill "$(cat /tmp/rh.pid)" 2>/dev/null || true
fi
- name: Dump sample logs on failure
if: failure()
run: |
echo '=== pa-run.log ==='
cat /tmp/pa-run.log || true
echo '=== ca-run.log ==='
cat /tmp/ca-run.log || true
echo '=== rh-run.log ==='
cat /tmp/rh-run.log || true