1212
1313env :
1414 # Tag/branch of the TCK
15- TCK_VERSION : main
16- # Tell the TCK runner to report failure if the quality tests fail
17- A2A_TCK_FAIL_ON_QUALITY : 1
18- # Tell the TCK runner to report failure if the features tests fail
19- A2A_TCK_FAIL_ON_FEATURES : 1
15+ TCK_VERSION : 1.0-dev
2016 # Tells uv to not need a venv, and instead use system
2117 UV_SYSTEM_PYTHON : 1
22- # SUT_JSONRPC_URL to use for the TCK and the server agent
23- SUT_JSONRPC_URL : http://localhost:9999
24- # Slow system on CI
25- TCK_STREAMING_TIMEOUT : 5.0
18+ SUT_URL : http://localhost:9999
2619
2720# Only run the latest job
2821concurrency :
@@ -38,138 +31,98 @@ jobs:
3831 steps :
3932 - name : Checkout a2a-java
4033 uses : actions/checkout@v6
41- - name : Checkout a2a-tck
42- uses : actions/checkout@v6
43- with :
44- repository : a2aproject/a2a-tck
45- path : tck/a2a-tck
46- ref : ${{ env.TCK_VERSION }}
4734 - name : Set up JDK ${{ matrix.java-version }}
4835 uses : actions/setup-java@v5
4936 with :
5037 java-version : ${{ matrix.java-version }}
5138 distribution : ' temurin'
5239 cache : maven
53- - name : check java_home
54- run : echo $JAVA_HOME
40+ - name : Build a2a-java SDK
41+ run : mvn -B install -DskipTests
42+ - name : Extract a2a-java version
43+ id : extract-version
44+ run : |
45+ A2A_JAVA_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
46+ echo "version=$A2A_JAVA_VERSION" >> $GITHUB_OUTPUT
47+ echo "Detected a2a-java version: $A2A_JAVA_VERSION"
48+ - name : Checkout a2a-tck
49+ uses : actions/checkout@v6
50+ with :
51+ repository : a2aproject/a2a-tck
52+ path : a2a-tck
53+ ref : ${{ env.TCK_VERSION }}
5554 - name : Set up Python
5655 uses : actions/setup-python@v5
5756 with :
58- python-version-file : " tck/ a2a-tck/pyproject.toml"
57+ python-version-file : " a2a-tck/pyproject.toml"
5958 - name : Install uv and Python dependencies
6059 run : |
6160 pip install uv
6261 uv pip install -e .
63- working-directory : tck/a2a-tck
64- - name : Build with Maven, skipping tests
65- run : mvn -B install -DskipTests
62+ working-directory : a2a-tck
63+ - name : Generate a2a-java SUT
64+ run : A2A_JAVA_SDK_VERSION=${{ steps.extract-version.outputs.version }} make codegen-a2a-java-sut
65+ working-directory : a2a-tck
6666 - name : Start SUT
67- run : SUT_GRPC_URL=${{ env.SUT_JSONRPC_URL }} SUT_REST_URL=${{ env.SUT_JSONRPC_URL }} mvn -B quarkus:dev & # SUT_JSONRPC_URL already set
68- working-directory : tck
67+ run : mvn -B quarkus:dev -Dquarkus.console.enabled=false &
68+ working-directory : a2a- tck/sut/a2a-java
6969 - name : Wait for SUT to start
7070 run : |
71- URL="${{ env.SUT_JSONRPC_URL }}/.well-known/agent-card.json"
71+ URL="${{ env.SUT_URL }}/.well-known/agent-card.json"
7272 EXPECTED_STATUS=200
7373 TIMEOUT=120
7474 RETRY_INTERVAL=2
7575 START_TIME=$(date +%s)
7676
7777 while true; do
78- # Calculate elapsed time
7978 CURRENT_TIME=$(date +%s)
8079 ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
8180
82- # Check for timeout
8381 if [ "$ELAPSED_TIME" -ge "$TIMEOUT" ]; then
84- echo "❌ Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
82+ echo "Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
8583 exit 1
8684 fi
8785
88- # Get HTTP status code. || true is to reporting a failure to connect as an error
8986 HTTP_STATUS=$(curl --output /dev/null --silent --write-out "%{http_code}" "$URL") || true
90- echo "STATUS: ${HTTP_STATUS}"
9187
92- # Check if we got the correct status code
9388 if [ "$HTTP_STATUS" -eq "$EXPECTED_STATUS" ]; then
94- echo "✅ Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
89+ echo "Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
9590 break;
9691 fi
9792
98- # Wait before retrying
99- echo "⏳ Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
93+ echo "Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
10094 sleep "$RETRY_INTERVAL"
10195 done
102-
10396 - name : Run TCK
10497 id : run-tck
10598 timeout-minutes : 5
10699 run : |
107100 set -o pipefail
108- ./run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category all --transports jsonrpc,grpc,rest --compliance-report report.json 2>&1 | tee tck-output.log
109- working-directory : tck/ a2a-tck
110- - name : Capture Diagnostics on Failure
111- if : failure()
101+ uv run ./run_tck.py --sut-host ${{ env.SUT_URL }} -v 2>&1 | tee tck-output.log
102+ working-directory : a2a-tck
103+ - name : TCK Summary
104+ if : always() && steps.run-tck.outcome != 'skipped'
112105 run : |
113- echo "=== Capturing diagnostic information ==="
114-
115- # Create diagnostics directory
116- mkdir -p tck/target/diagnostics
117-
118- # Capture process list
119- echo "📋 Capturing process list..."
120- ps auxww > tck/target/diagnostics/processes.txt
121-
122- # Find the actual Quarkus JVM (child of Maven process), not the Maven parent
123- # Look for the dev.jar process which is the actual application
124- QUARKUS_PID=$(pgrep -f "a2a-tck-server-dev.jar" || echo "")
125- if [ -n "$QUARKUS_PID" ]; then
126- echo "📊 Capturing thread dump for Quarkus JVM PID $QUARKUS_PID"
127- jstack $QUARKUS_PID > tck/target/diagnostics/thread-dump.txt || echo "Failed to capture thread dump"
128- if [ -f tck/target/diagnostics/thread-dump.txt ]; then
129- echo "✅ Thread dump captured ($(wc -l < tck/target/diagnostics/thread-dump.txt) lines)"
106+ if [ -f a2a-tck/tck-output.log ]; then
107+ # Extract everything after the first ═══ separator line
108+ SUMMARY=$(sed -n '/^═══/,$p' a2a-tck/tck-output.log)
109+ if [ -n "$SUMMARY" ]; then
110+ echo '### TCK Results (Java ${{ matrix.java-version }})' >> $GITHUB_STEP_SUMMARY
111+ echo '```' >> $GITHUB_STEP_SUMMARY
112+ echo "$SUMMARY" >> $GITHUB_STEP_SUMMARY
113+ echo '```' >> $GITHUB_STEP_SUMMARY
130114 fi
131- else
132- echo "⚠️ No Quarkus JVM process found for thread dump"
133- echo "Available Java processes:"
134- ps aux | grep java | tee -a tck/target/diagnostics/processes.txt || true
135- fi
136-
137- # Capture Quarkus application logs (if available)
138- echo "📝 Checking for Quarkus logs..."
139- if [ -f tck/target/quarkus.log ]; then
140- cp tck/target/quarkus.log tck/target/diagnostics/
141- echo "✅ Copied quarkus.log ($(wc -l < tck/target/quarkus.log) lines)"
142115 fi
143-
144- # Copy TCK server logs
145- if [ -f tck/target/tck-test.log ]; then
146- cp tck/target/tck-test.log tck/target/diagnostics/
147- echo "✅ Copied tck-test.log ($(wc -l < tck/target/tck-test.log) lines)"
148- fi
149-
150- echo ""
151- echo "=== Diagnostic capture complete ==="
152- - name : Stop Quarkus Server
116+ - name : Stop SUT
153117 if : always()
154118 run : |
155- # Find and kill the Quarkus process to ensure logs are flushed
156119 pkill -f "quarkus:dev" || true
157120 sleep 2
158- - name : Upload TCK Diagnostics
159- if : failure()
160- uses : actions/upload-artifact@v6
161- with :
162- name : tck-diagnostics-java-${{ matrix.java-version }}
163- path : |
164- tck/target/diagnostics/
165- tck/a2a-tck/tck-output.log
166- retention-days : 7
167- if-no-files-found : warn
168- - name : Upload TCK Compliance Report
121+ - name : Upload TCK Reports
169122 if : always()
170123 uses : actions/upload-artifact@v6
171124 with :
172- name : tck-compliance-report -java-${{ matrix.java-version }}
173- path : tck/ a2a-tck/report.json
125+ name : tck-reports -java-${{ matrix.java-version }}
126+ path : a2a-tck/reports/
174127 retention-days : 14
175- if-no-files-found : ignore
128+ if-no-files-found : warn
0 commit comments