Skip to content

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

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

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

Workflow file for this run

name: "CI: E2E (Playwright)"
on:
push:
branches: [ '**' ]
paths-ignore:
- '**.md'
- 'docs/**'
- 'LICENSE'
pull_request:
branches: [ main ]
paths-ignore:
- '**.md'
- 'docs/**'
- 'LICENSE'
workflow_dispatch:
jobs:
build:
name: Build (SB${{ matrix.spring-boot-version }})
runs-on: ubuntu-latest
strategy:
matrix:
spring-boot-version: [4, 3]
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: 21
distribution: 'temurin'
cache: 'maven'
- name: Build All Modules
run: ./mvnw -B clean install -DskipTests -Dgpg.skip=true
- name: Rebuild Spring Boot samples with SB3
if: matrix.spring-boot-version == 3
run: |
SB_SAMPLES=$(ls -d samples/spring-boot-*/pom.xml | grep -v embabel | sed 's|/pom.xml||' | paste -sd, -)
./mvnw -B package -DskipTests -Dgpg.skip=true -Pspring-boot3 -pl "$SB_SAMPLES"
- name: Package build output
run: |
tar czf /tmp/build-targets-sb${{ matrix.spring-boot-version }}.tar.gz \
samples/*/target \
modules/*/target \
-C "$HOME" .m2/repository/org/atmosphere
- name: Upload build output
uses: actions/upload-artifact@v7
with:
name: build-targets-sb${{ matrix.spring-boot-version }}
path: /tmp/build-targets-sb${{ matrix.spring-boot-version }}.tar.gz
retention-days: 1
e2e:
name: E2E — ${{ matrix.group.name }} (SB${{ matrix.spring-boot-version }})
runs-on: ubuntu-latest
needs: [build]
strategy:
matrix:
spring-boot-version: [4, 3]
# Groups are sized to keep the slowest leg under ~8 min. The long
# pole historically was gap-admin (SB3) at 15.6 min — split into
# -core and -smoke. gap-protocols, ai-chat, and ai-ux similarly
# split. New 4.0.36/4.0.37 flagship specs (ai-cancel, checkpoint-
# agent, orchestration-primitives, admin-coverage) are now mapped —
# previously they lived in playwright.config.ts but were silently
# unmapped by any matrix leg, so CI never ran them.
group:
- name: core-chat
projects: "chat,spring-boot-chat,multi-client,embedded-jetty-chat"
- name: core-transports
projects: "quarkus-chat,sse-transport,long-polling-transport,transport-fallback,reconnection"
- name: ai-chat-core
projects: "ai-chat,ai-streaming-dom,ai-chat-features"
- name: ai-chat-memory
projects: "ai-memory,ai-memory-strategies"
- name: ai-ux-events
projects: "ai-identity,ai-error-recovery,ai-events,unified-console"
- name: ai-ux-flows
projects: "ai-multimodal,ai-retry-policy,ai-lifecycle-listener,ai-models"
- name: ai-tools
projects: "ai-tools,ai-session-stats,ai-tool-call-delta,ai-hitl-approval,ai-hitl-real-flow,ai-cancel"
- name: ai-advanced
projects: "rag-chat,ai-filters,ai-fanout,ai-cache,ai-budget,ai-cache-hint,ai-embedding,ai-gap-coverage"
- name: ai-routing
projects: "ai-cost-routing,ai-cache-coalescing,ai-combined-cost-cache,ai-routing,ai-classroom,spring-boot-ai-classroom"
# checkpoint-agent lives under gap-coordinator with the other
# durable-HITL specs. The previously-quarantined ai-cancel,
# admin-coverage, and orchestration-primitives specs are now
# remapped into their matching legs.
- name: protocols
projects: "mcp-server,mcp-tools,a2a-agent,a2a-discovery,agui-chat,multi-agent-startup-team,browser-agent"
- name: protocols-extra
projects: "grpc-browser,rooms-api,room-typing-direct,channels-chat"
- name: resilience
projects: "durable-sessions,durable-session-token,durable-session-identity,otel-chat,chat-observability"
- name: resilience-extra
projects: "offline-queue,history-cache,xss-protection,auth-rejection,auth-token"
- name: stress
projects: "message-ordering,large-payload,slow-consumer,connection-timeout"
- name: gap-infra
projects: "redis-clustering,kafka-clustering,kotlin-dsl,wasync-client,mcp-bidirectional,cross-transport-interop"
- name: gap-protocols-events
projects: "agui-sse-lifecycle,channel-gateway,otel-span-correlation"
- name: gap-protocols-agent
projects: "a2a-multi-hop,concurrent-protocol-access"
- name: gap-coordinator
projects: "coordinator-remote,coordinator-journal,coordinator-activity,durable-session-restart,session-token-expiry,auth-oauth-jwt,checkpoint-agent,orchestration-primitives"
- name: gap-compat
projects: "spring-boot3-parity,backpressure-bounded-queue,webtransport-raw,webtransport"
- name: gap-admin-core
projects: "admin-dashboard,admin-quarkus,admin-coverage"
- name: gap-admin-smoke
projects: "console-http-check,sample-matrix-smoke"
- name: gap-agents
projects: "dentist-agent,a2a-discovery"
- name: cli-runtime
projects: "cli-runtime"
# Cross-tab isolation regression matrix (commit 1fbb0958f0).
# ~12 sample boots in sequence within a single spec — keep this
# leg distinct so its slow per-sample JVM warm-up doesn't push
# any other leg over the 10-min budget.
- name: regression-isolation
projects: "cross-tab-isolation"
fail-fast: false
steps:
- uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: 21
distribution: 'temurin'
cache: 'maven'
- name: Download build output
uses: actions/download-artifact@v8
with:
name: build-targets-sb${{ matrix.spring-boot-version }}
- name: Restore build output
run: |
tar xzmf build-targets-sb${{ matrix.spring-boot-version }}.tar.gz
# Restore atmosphere SNAPSHOT artifacts to local Maven repo
if [ -d .m2/repository/org/atmosphere ]; then
mkdir -p ~/.m2/repository/org
cp -r .m2/repository/org/atmosphere ~/.m2/repository/org/
rm -rf .m2
fi
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: 'npm'
cache-dependency-path: modules/integration-tests/package-lock.json
# Cache key is the hash of the npm lockfile — any Playwright version
# bump (or any other dep change) invalidates the cache. Conservative
# vs parsing the version directly, but has no ordering dependency on
# npm ci and stays correct across major/minor bumps.
- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ hashFiles('modules/integration-tests/package-lock.json') }}
- name: Install npm dependencies
working-directory: modules/integration-tests
run: npm ci
- name: Install Playwright browsers
working-directory: modules/integration-tests
run: |
# On cache hit, install only system deps (apt); skip the browser
# binaries. The apt step hits packages.microsoft.com which has a
# history of 403 flakes — retry 3x with exponential backoff. On
# cache miss, install browsers + system deps with the same retry.
# Each attempt is bounded by `timeout 300`: a healthy install runs
# in well under a minute, but a stalled chromium download or apt
# mirror can hang with no exit code, which the retry loop alone
# cannot recover from (it only fires on a clean non-zero exit). The
# timeout converts a hang into exit 124 so the backoff/retry advances
# instead of pinning the leg for hours.
if [ "${{ steps.playwright-cache.outputs.cache-hit }}" = "true" ]; then
cmd="npx playwright install-deps chromium"
else
cmd="npx playwright install --with-deps chromium"
fi
for attempt in 1 2 3; do
if timeout 300 $cmd; then
break
fi
if [ "$attempt" = "3" ]; then
echo "playwright install failed after 3 attempts" >&2
exit 1
fi
echo "playwright install attempt $attempt failed, retrying in ${attempt}0s..." >&2
sleep "${attempt}0"
done
- name: Run E2E Tests
working-directory: modules/integration-tests
env:
LLM_MODE: fake
SMOKE_ONLY: ${{ github.event_name == 'pull_request' && 'true' || '' }}
INCLUDE_FLAKY: 'false'
run: |
PROJECTS=$(echo "${{ matrix.group.projects }}" | sed 's/,/ --project=/g')
# Tolerate "No tests found" when SMOKE_ONLY filters out every test in a group.
# Playwright exits 1 with stderr "Error: No tests found" — treat as success on PRs.
set +e
output=$(npx playwright test --project=$PROJECTS --reporter=list,github 2>&1)
code=$?
echo "$output"
if [ "$code" -ne 0 ] && echo "$output" | grep -q "Error: No tests found"; then
echo "::notice::Group '${{ matrix.group.name }}' has no @smoke tests — skipping (PR CI)"
exit 0
fi
exit $code
- name: Upload Playwright Report
if: failure()
uses: actions/upload-artifact@v7
with:
name: playwright-report-${{ matrix.group.name }}-sb${{ matrix.spring-boot-version }}
path: modules/integration-tests/playwright-report/
retention-days: 14