Skip to content

Commit e744da2

Browse files
Teodor Ciuraruclaude
andcommitted
feat(ci): add BUILD_ID extraction to all BrowserStack workflows
Added BUILD_ID extraction by querying BrowserStack API after tests complete for 4 workflows that use SDK/WebDriver (android-cpp, dotnet-maui, java-spring, javascript-web). All 11 BrowserStack workflows now use direct BUILD_ID links in summaries with fallback to project filter for reliability. Changes: - Query BrowserStack API after tests to get build_id - Add job outputs for build_id - Update summary links to use BUILD_ID with fallback logic - Use correct API endpoints (app-automate vs automate) Result: All BrowserStack summary links now route directly to specific build sessions for maximum accuracy. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 48a2ad7 commit e744da2

4 files changed

Lines changed: 109 additions & 5 deletions

File tree

.github/workflows/android-cpp-ci.yml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ jobs:
126126
needs: [build]
127127
if: github.event_name == 'push' || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
128128
timeout-minutes: 150
129+
outputs:
130+
build_id: ${{ steps.test.outputs.build_id }}
129131

130132
steps:
131133
- uses: actions/checkout@v4
@@ -222,6 +224,20 @@ jobs:
222224
223225
../gradlew test --console=plain --no-daemon
224226
227+
# Query BrowserStack API to get the build ID
228+
echo "Fetching build ID from BrowserStack..."
229+
BUILDS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \
230+
"https://api-cloud.browserstack.com/app-automate/builds.json?limit=1")
231+
232+
BUILD_ID=$(echo "$BUILDS_RESPONSE" | yq eval '.[0].hashed_id' -)
233+
234+
if [ "$BUILD_ID" != "null" ] && [ -n "$BUILD_ID" ]; then
235+
echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT
236+
echo "✅ Build ID: $BUILD_ID"
237+
else
238+
echo "⚠️ Could not retrieve build ID from BrowserStack API"
239+
fi
240+
225241
- name: Upload test artifacts
226242
if: always()
227243
uses: actions/upload-artifact@v4
@@ -264,7 +280,11 @@ jobs:
264280
if [[ "${{ needs.browserstack-android.result }}" != "skipped" ]]; then
265281
echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY
266282
echo "" >> $GITHUB_STEP_SUMMARY
267-
echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=quickstart+-+Android+CPP)" >> $GITHUB_STEP_SUMMARY
283+
if [ -n "${{ needs.browserstack-android.outputs.build_id }}" ]; then
284+
echo "🤖 [View Test Results](https://app-automate.browserstack.com/dashboard/v2/builds/${{ needs.browserstack-android.outputs.build_id }})" >> $GITHUB_STEP_SUMMARY
285+
else
286+
echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=quickstart+-+Android+CPP)" >> $GITHUB_STEP_SUMMARY
287+
fi
268288
echo "" >> $GITHUB_STEP_SUMMARY
269289
echo "**Tested Device:**" >> $GITHUB_STEP_SUMMARY
270290
echo "- Google Pixel 7 (Android 13.0)" >> $GITHUB_STEP_SUMMARY

.github/workflows/dotnet-maui-ci.yml

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ jobs:
149149
needs: [build-android]
150150
timeout-minutes: 150
151151
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
152+
outputs:
153+
build_id: ${{ steps.test.outputs.build_id }}
152154

153155
steps:
154156
- name: Checkout code
@@ -199,6 +201,7 @@ jobs:
199201
commit-max-length: '130'
200202

201203
- name: Seed and execute Android tests on BrowserStack
204+
id: test
202205
uses: nick-fields/retry@v3
203206
with:
204207
max_attempts: 5
@@ -253,12 +256,28 @@ jobs:
253256
BUILD_NAME="${{ steps.build-info-android.outputs.build-name }}" \
254257
dotnet run
255258
259+
# Query BrowserStack API to get the build ID
260+
echo "Fetching build ID from BrowserStack..."
261+
BUILDS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \
262+
"https://api-cloud.browserstack.com/app-automate/builds.json?limit=1")
263+
264+
BUILD_ID=$(echo "$BUILDS_RESPONSE" | yq eval '.[0].hashed_id' -)
265+
266+
if [ "$BUILD_ID" != "null" ] && [ -n "$BUILD_ID" ]; then
267+
echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT
268+
echo "✅ Build ID: $BUILD_ID"
269+
else
270+
echo "⚠️ Could not retrieve build ID from BrowserStack API"
271+
fi
272+
256273
browserstack-ios:
257274
name: BrowserStack iOS Tests
258275
runs-on: macos-latest
259276
needs: [build-ios]
260277
timeout-minutes: 150
261278
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
279+
outputs:
280+
build_id: ${{ steps.test.outputs.build_id }}
262281

263282
steps:
264283
- name: Checkout code
@@ -309,6 +328,7 @@ jobs:
309328
commit-max-length: '130'
310329

311330
- name: Seed and execute iOS tests on BrowserStack
331+
id: test
312332
uses: nick-fields/retry@v3
313333
with:
314334
max_attempts: 5
@@ -363,6 +383,20 @@ jobs:
363383
BUILD_NAME="${{ steps.build-info-ios.outputs.build-name }}" \
364384
dotnet run
365385
386+
# Query BrowserStack API to get the build ID
387+
echo "Fetching build ID from BrowserStack..."
388+
BUILDS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \
389+
"https://api-cloud.browserstack.com/app-automate/builds.json?limit=1")
390+
391+
BUILD_ID=$(echo "$BUILDS_RESPONSE" | yq eval '.[0].hashed_id' -)
392+
393+
if [ "$BUILD_ID" != "null" ] && [ -n "$BUILD_ID" ]; then
394+
echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT
395+
echo "✅ Build ID: $BUILD_ID"
396+
else
397+
echo "⚠️ Could not retrieve build ID from BrowserStack API"
398+
fi
399+
366400
summary:
367401
name: CI Report
368402
runs-on: ubuntu-latest
@@ -402,11 +436,19 @@ jobs:
402436
echo "" >> $GITHUB_STEP_SUMMARY
403437
404438
if [[ "${{ needs.browserstack-android.result }}" != "skipped" ]]; then
405-
echo "🤖 [Android Test Session](https://app-automate.browserstack.com/builds?project=quickstart+-+.NET+MAUI&filter_device_name=Google+Pixel+7)" >> $GITHUB_STEP_SUMMARY
439+
if [ -n "${{ needs.browserstack-android.outputs.build_id }}" ]; then
440+
echo "🤖 [Android Test Session](https://app-automate.browserstack.com/dashboard/v2/builds/${{ needs.browserstack-android.outputs.build_id }})" >> $GITHUB_STEP_SUMMARY
441+
else
442+
echo "🤖 [Android Test Session](https://app-automate.browserstack.com/builds?project=quickstart+-+.NET+MAUI&filter_device_name=Google+Pixel+7)" >> $GITHUB_STEP_SUMMARY
443+
fi
406444
fi
407445
408446
if [[ "${{ needs.browserstack-ios.result }}" != "skipped" ]]; then
409-
echo "🍎 [iOS Test Session](https://app-automate.browserstack.com/builds?project=quickstart+-+.NET+MAUI&filter_device_name=iPhone+15)" >> $GITHUB_STEP_SUMMARY
447+
if [ -n "${{ needs.browserstack-ios.outputs.build_id }}" ]; then
448+
echo "🍎 [iOS Test Session](https://app-automate.browserstack.com/dashboard/v2/builds/${{ needs.browserstack-ios.outputs.build_id }})" >> $GITHUB_STEP_SUMMARY
449+
else
450+
echo "🍎 [iOS Test Session](https://app-automate.browserstack.com/builds?project=quickstart+-+.NET+MAUI&filter_device_name=iPhone+15)" >> $GITHUB_STEP_SUMMARY
451+
fi
410452
fi
411453
412454
echo "" >> $GITHUB_STEP_SUMMARY

.github/workflows/java-spring-ci.yml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ jobs:
9292
needs: [build]
9393
if: github.event_name == 'push' || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
9494
timeout-minutes: 150
95+
outputs:
96+
build_id: ${{ steps.test.outputs.build_id }}
9597

9698
steps:
9799
- uses: actions/checkout@v4
@@ -202,6 +204,7 @@ jobs:
202204
done
203205
204206
- name: Seed and execute Selenium tests on BrowserStack cloud browsers
207+
id: test
205208
uses: nick-fields/retry@v3
206209
env:
207210
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
@@ -257,6 +260,20 @@ jobs:
257260
-DDITTO_CLOUD_TASK_TITLE="$TASK_TITLE" \
258261
--info
259262
263+
# Query BrowserStack API to get the build ID
264+
echo "Fetching build ID from BrowserStack..."
265+
BUILDS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \
266+
"https://api.browserstack.com/automate/builds.json?limit=1")
267+
268+
BUILD_ID=$(echo "$BUILDS_RESPONSE" | yq eval '.[0].hashed_id' -)
269+
270+
if [ "$BUILD_ID" != "null" ] && [ -n "$BUILD_ID" ]; then
271+
echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT
272+
echo "✅ Build ID: $BUILD_ID"
273+
else
274+
echo "⚠️ Could not retrieve build ID from BrowserStack API"
275+
fi
276+
260277
- name: Stop Spring Boot app
261278
if: always()
262279
working-directory: java-spring
@@ -321,7 +338,11 @@ jobs:
321338
if [[ "${{ needs.browserstack-test.result }}" != "skipped" ]]; then
322339
echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY
323340
echo "" >> $GITHUB_STEP_SUMMARY
324-
echo "🔗 [View Test Results](https://automate.browserstack.com/builds?project=quickstart+-+Java+Spring)" >> $GITHUB_STEP_SUMMARY
341+
if [ -n "${{ needs.browserstack-test.outputs.build_id }}" ]; then
342+
echo "🔗 [View Test Results](https://automate.browserstack.com/dashboard/v2/builds/${{ needs.browserstack-test.outputs.build_id }})" >> $GITHUB_STEP_SUMMARY
343+
else
344+
echo "🔗 [View Test Results](https://automate.browserstack.com/builds?project=quickstart+-+Java+Spring)" >> $GITHUB_STEP_SUMMARY
345+
fi
325346
echo "" >> $GITHUB_STEP_SUMMARY
326347
echo "**Tested Browser:**" >> $GITHUB_STEP_SUMMARY
327348
echo "- Chrome Latest (Windows 11)" >> $GITHUB_STEP_SUMMARY

.github/workflows/javascript-web-ci.yml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ jobs:
8080
runs-on: ubuntu-latest
8181
needs: build
8282
timeout-minutes: 150
83+
outputs:
84+
build_id: ${{ steps.test.outputs.build_id }}
8385

8486
steps:
8587
- name: Checkout code
@@ -125,6 +127,7 @@ jobs:
125127
run: chmod +x .github/scripts/browserstack-test.py
126128

127129
- name: Seed and execute tests on BrowserStack
130+
id: test
128131
uses: nick-fields/retry@v3
129132
env:
130133
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
@@ -180,6 +183,20 @@ jobs:
180183
# Run the test script
181184
python3 .github/scripts/browserstack-test.py
182185
186+
# Query BrowserStack API to get the build ID
187+
echo "Fetching build ID from BrowserStack..."
188+
BUILDS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \
189+
"https://api.browserstack.com/automate/builds.json?limit=1")
190+
191+
BUILD_ID=$(echo "$BUILDS_RESPONSE" | yq eval '.[0].hashed_id' -)
192+
193+
if [ "$BUILD_ID" != "null" ] && [ -n "$BUILD_ID" ]; then
194+
echo "build_id=$BUILD_ID" >> $GITHUB_OUTPUT
195+
echo "✅ Build ID: $BUILD_ID"
196+
else
197+
echo "⚠️ Could not retrieve build ID from BrowserStack API"
198+
fi
199+
183200
- name: Stop BrowserStack Local tunnel
184201
if: always()
185202
run: ./BrowserStackLocal --key "${{ secrets.BROWSERSTACK_ACCESS_KEY }}" --daemon stop || true
@@ -226,7 +243,11 @@ jobs:
226243
# BrowserStack info
227244
echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY
228245
echo "" >> $GITHUB_STEP_SUMMARY
229-
echo "🔗 [View Test Results](https://automate.browserstack.com/builds?project=quickstart+-+JavaScript+Web)" >> $GITHUB_STEP_SUMMARY
246+
if [ -n "${{ needs.browserstack-web.outputs.build_id }}" ]; then
247+
echo "🔗 [View Test Results](https://automate.browserstack.com/dashboard/v2/builds/${{ needs.browserstack-web.outputs.build_id }})" >> $GITHUB_STEP_SUMMARY
248+
else
249+
echo "🔗 [View Test Results](https://automate.browserstack.com/builds?project=quickstart+-+JavaScript+Web)" >> $GITHUB_STEP_SUMMARY
250+
fi
230251
echo "" >> $GITHUB_STEP_SUMMARY
231252
echo "**Tested Browsers:**" >> $GITHUB_STEP_SUMMARY
232253
echo "- Chrome 120.0 (Windows 11)" >> $GITHUB_STEP_SUMMARY

0 commit comments

Comments
 (0)