-
Notifications
You must be signed in to change notification settings - Fork 8
232 lines (198 loc) Β· 8.53 KB
/
Copy pathagentex-tutorials-test.yml
File metadata and controls
232 lines (198 loc) Β· 8.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
name: Test Tutorial Agents
on:
workflow_dispatch:
jobs:
find-tutorials:
runs-on: ubuntu-latest
outputs:
tutorials: ${{ steps.get-tutorials.outputs.tutorials }}
steps:
- name: Checkout agentex-python repo
uses: actions/checkout@v4
- name: Find all tutorials
id: get-tutorials
run: |
cd examples/tutorials
tutorials=$(find . -name "manifest.yaml" -exec dirname {} \; | sort | sed 's|^\./||' | jq -R -s -c 'split("\n") | map(select(length > 0))')
echo "tutorials=$tutorials" >> $GITHUB_OUTPUT
echo "Found tutorials: $tutorials"
test-tutorial:
needs: find-tutorials
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
matrix:
tutorial: ${{ fromJson(needs.find-tutorials.outputs.tutorials) }}
fail-fast: false
name: test-${{ matrix.tutorial }}
steps:
- name: Checkout agentex-python repo
uses: actions/checkout@v4
- name: Install UV
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Checkout scale-agentex repo
uses: actions/checkout@v4
with:
repository: scaleapi/scale-agentex
path: scale-agentex
- name: Configure Docker Compose for host networking
run: |
cd scale-agentex/agentex
echo "π§ Configuring AgentEx container for GitHub Actions networking..."
# Install yq for YAML manipulation
sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq
# Add extra_hosts to agentex service to make host.docker.internal work
yq eval '.services.agentex.extra_hosts = ["host.docker.internal:host-gateway"]' -i docker-compose.yml
echo "β
Added extra_hosts configuration to agentex service"
- name: Start AgentEx Server
run: |
cd scale-agentex/agentex
echo "π Starting AgentEx server and dependencies..."
# Start all services
docker compose up -d
echo "β³ Waiting for dependencies to be healthy..."
# Wait for services to be healthy
for i in {1..30}; do
if docker compose ps | grep -q "healthy"; then
echo "β
Dependencies are healthy"
break
fi
echo " Attempt $i/30: Waiting for services..."
sleep 5
done
# Wait specifically for AgentEx server to be ready
echo "β³ Waiting for AgentEx server to be ready..."
for i in {1..30}; do
if curl -s --max-time 5 http://localhost:5003/health >/dev/null 2>&1; then
echo "β
AgentEx server is ready"
break
fi
echo " Attempt $i/30: Waiting for AgentEx server..."
sleep 5
done
- name: Build AgentEx SDK
run: |
echo "π¨ Building AgentEx SDK wheel..."
uv build
echo "β
SDK built successfully"
ls -la dist/
- name: Test Tutorial
working-directory: ./examples/tutorials
env:
OPENAI_API_KEY: ${{ secrets.TUTORIAL_OPENAI_API_KEY }}
HEALTH_CHECK_PORT: 8080 # Use non-privileged port for temporal worker health checks
run: |
echo "Testing tutorial: ${{ matrix.tutorial }}"
AGENTEX_API_BASE_URL="http://localhost:5003" \
./run_agent_test.sh --build-cli "${{ matrix.tutorial }}"
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-${{ replace(matrix.tutorial, '/', '-') }}
path: |
/tmp/agentex-*.log
retention-days: 1
test-summary:
if: always()
needs: [find-tutorials, test-tutorial]
runs-on: ubuntu-latest
name: Test Summary
steps:
- name: Download All Test Results
uses: actions/download-artifact@v4
with:
path: test-results
pattern: test-results-*
- name: Generate Test Summary
run: |
echo "# π§ͺ Tutorial Tests Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Get tutorial list from needs context
tutorials='${{ needs.find-tutorials.outputs.tutorials }}'
# Initialize counters
total_tutorials=0
passed_tutorials=0
failed_tutorials=0
# Arrays to track results
passed_tests=()
failed_tests=()
echo "## π Overall Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Process each tutorial result
for tutorial_dir in test-results/test-results-*/; do
if [ -d "$tutorial_dir" ]; then
# Extract sanitized name and convert back to original tutorial path
sanitized_name=$(basename "$tutorial_dir" | sed 's/test-results-//')
tutorial_name=$(echo "$sanitized_name" | sed 's/-/\//g')
total_tutorials=$((total_tutorials + 1))
# Determine success/failure based on presence of error logs or patterns
if find "$tutorial_dir" -name "*.log" -exec grep -l "FAILED\|ERROR\|Traceback" {} \; | head -1 >/dev/null; then
failed_tutorials=$((failed_tutorials + 1))
failed_tests+=("$tutorial_name")
else
passed_tutorials=$((passed_tutorials + 1))
passed_tests+=("$tutorial_name")
fi
fi
done
# Show summary stats
echo "| Status | Count |" >> $GITHUB_STEP_SUMMARY
echo "|--------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| β
**Passed** | **$passed_tutorials** |" >> $GITHUB_STEP_SUMMARY
echo "| β **Failed** | **$failed_tutorials** |" >> $GITHUB_STEP_SUMMARY
echo "| π **Total** | **$total_tutorials** |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Show passed tests
if [ $passed_tutorials -gt 0 ]; then
echo "## β
Passed Tutorials ($passed_tutorials)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
for test in "${passed_tests[@]}"; do
echo "- β
\`$test\`" >> $GITHUB_STEP_SUMMARY
done
echo "" >> $GITHUB_STEP_SUMMARY
fi
# Show failed tests with details
if [ $failed_tutorials -gt 0 ]; then
echo "## β Failed Tutorials ($failed_tutorials)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
for test in "${failed_tests[@]}"; do
echo "### π \`$test\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# Find the log file for this test (convert back to sanitized name)
sanitized_test_name=$(echo "$test" | sed 's/\//-/g')
log_file=$(find "test-results/test-results-$sanitized_test_name" -name "*.log" | head -1)
if [ -f "$log_file" ]; then
# Extract pytest failures
if grep -q "FAILED\|ERROR" "$log_file"; then
echo "**Failed Tests:**" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
grep -A 5 -B 1 "FAILED\|ERROR" "$log_file" | head -20 >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
fi
# Show any Python tracebacks
if grep -q "Traceback" "$log_file"; then
echo "**Error Details:**" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
# Get the last traceback in the file
awk '/Traceback \(most recent call last\)/{p=1} p{print} /^[^ ]/ && p && !/Traceback/{p=0}' "$log_file" | tail -20 >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
fi
else
echo "_No log file found for detailed error analysis_" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
fi
done
fi
# Set exit code based on results
if [ $failed_tutorials -gt 0 ]; then
echo "β Some tutorials failed. Check the details above." >> $GITHUB_STEP_SUMMARY
exit 1
else
echo "π All tutorials passed successfully!" >> $GITHUB_STEP_SUMMARY
fi