11name : Run TCK
22
33on :
4- # Handle all branches for now
54 push :
65 branches :
76 - main
1211
1312env :
1413 # 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
14+ TCK_VERSION : 1.0-dev
2015 # Tells uv to not need a venv, and instead use system
2116 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
17+ SUT_URL : http://localhost:9999
2618
2719# Only run the latest job
2820concurrency :
@@ -34,142 +26,102 @@ jobs:
3426 runs-on : ubuntu-latest
3527 strategy :
3628 matrix :
37- java-version : [17, 21, 25 ]
29+ java-version : [17]
3830 steps :
3931 - name : Checkout a2a-java
4032 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 }}
4733 - name : Set up JDK ${{ matrix.java-version }}
4834 uses : actions/setup-java@v5
4935 with :
5036 java-version : ${{ matrix.java-version }}
5137 distribution : ' temurin'
5238 cache : maven
53- - name : check java_home
54- run : echo $JAVA_HOME
39+ - name : Build a2a-java SDK
40+ run : mvn -B install -DskipTests
41+ - name : Extract a2a-java version
42+ id : extract-version
43+ run : |
44+ A2A_JAVA_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
45+ echo "version=$A2A_JAVA_VERSION" >> $GITHUB_OUTPUT
46+ echo "Detected a2a-java version: $A2A_JAVA_VERSION"
47+ - name : Checkout a2a-tck
48+ uses : actions/checkout@v6
49+ with :
50+ repository : a2aproject/a2a-tck
51+ path : a2a-tck
52+ ref : ${{ env.TCK_VERSION }}
5553 - name : Set up Python
56- uses : actions/setup-python@v5
54+ uses : actions/setup-python@v6
5755 with :
58- python-version-file : " tck/ a2a-tck/pyproject.toml"
56+ python-version-file : " a2a-tck/pyproject.toml"
5957 - name : Install uv and Python dependencies
6058 run : |
6159 pip install uv
6260 uv pip install -e .
63- working-directory : tck/a2a-tck
64- - name : Build with Maven, skipping tests
65- run : mvn -B install -DskipTests
61+ working-directory : a2a-tck
62+ - name : Generate a2a-java SUT
63+ run : A2A_JAVA_SDK_VERSION=${{ steps.extract-version.outputs.version }} make codegen-a2a-java-sut
64+ working-directory : a2a-tck
6665 - 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
66+ run : mvn -B quarkus:dev -Dquarkus.console.enabled=false &
67+ working-directory : a2a- tck/sut/a2a-java
6968 - name : Wait for SUT to start
7069 run : |
71- URL="${{ env.SUT_JSONRPC_URL }}/.well-known/agent-card.json"
70+ URL="${{ env.SUT_URL }}/.well-known/agent-card.json"
7271 EXPECTED_STATUS=200
7372 TIMEOUT=120
7473 RETRY_INTERVAL=2
7574 START_TIME=$(date +%s)
7675
7776 while true; do
78- # Calculate elapsed time
7977 CURRENT_TIME=$(date +%s)
8078 ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
8179
82- # Check for timeout
8380 if [ "$ELAPSED_TIME" -ge "$TIMEOUT" ]; then
84- echo "❌ Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
81+ echo "Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
8582 exit 1
8683 fi
8784
88- # Get HTTP status code. || true is to reporting a failure to connect as an error
8985 HTTP_STATUS=$(curl --output /dev/null --silent --write-out "%{http_code}" "$URL") || true
90- echo "STATUS: ${HTTP_STATUS}"
9186
92- # Check if we got the correct status code
9387 if [ "$HTTP_STATUS" -eq "$EXPECTED_STATUS" ]; then
94- echo "✅ Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
88+ echo "Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
9589 break;
9690 fi
9791
98- # Wait before retrying
99- echo "⏳ Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
92+ echo "Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
10093 sleep "$RETRY_INTERVAL"
10194 done
102-
10395 - name : Run TCK
10496 id : run-tck
10597 timeout-minutes : 5
10698 run : |
10799 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()
100+ uv run ./run_tck.py --sut-host ${{ env.SUT_URL }} -v 2>&1 | tee tck-output.log
101+ working-directory : a2a-tck
102+ - name : TCK Summary
103+ if : always() && steps.run-tck.outcome != 'skipped'
112104 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)"
105+ if [ -f a2a-tck/tck-output.log ]; then
106+ # Extract everything after the first ═══ separator line
107+ SUMMARY=$(sed -n '/^═══/,$p' a2a-tck/tck-output.log)
108+ if [ -n "$SUMMARY" ]; then
109+ echo '### TCK Results (Java ${{ matrix.java-version }})' >> $GITHUB_STEP_SUMMARY
110+ echo '```' >> $GITHUB_STEP_SUMMARY
111+ echo "$SUMMARY" >> $GITHUB_STEP_SUMMARY
112+ echo '```' >> $GITHUB_STEP_SUMMARY
130113 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)"
142114 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
115+ - name : Stop SUT
153116 if : always()
154117 run : |
155- # Find and kill the Quarkus process to ensure logs are flushed
156118 pkill -f "quarkus:dev" || true
157119 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
120+ - name : Upload TCK Reports
169121 if : always()
170122 uses : actions/upload-artifact@v6
171123 with :
172- name : tck-compliance-report -java-${{ matrix.java-version }}
173- path : tck/ a2a-tck/report.json
124+ name : tck-reports -java-${{ matrix.java-version }}
125+ path : a2a-tck/reports/
174126 retention-days : 14
175- if-no-files-found : ignore
127+ if-no-files-found : warn
0 commit comments