diff --git a/.github/workflows/android-cpp-ci.yml b/.github/workflows/android-cpp-ci.yml index 3cc56b452..ef9daf2a7 100644 --- a/.github/workflows/android-cpp-ci.yml +++ b/.github/workflows/android-cpp-ci.yml @@ -7,16 +7,10 @@ name: Android C++ CI on: pull_request: - branches: - - main - - 'sdk-*' paths: - 'android-cpp/**' - '.github/workflows/android-cpp-ci.yml' push: - branches: - - main - - 'sdk-*' paths: - 'android-cpp/**' - '.github/workflows/android-cpp-ci.yml' @@ -130,7 +124,7 @@ jobs: android-cpp/QuickStartTasksCPP/app/build/outputs/apk/release/app-release-unsigned.apk retention-days: 1 - browserstack-appium-test: + browserstack: name: BrowserStack Device Testing runs-on: ubuntu-latest needs: [build] @@ -160,13 +154,18 @@ jobs: distribution: 'temurin' java-version: '17' + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Android C++' - name: Upload APK to BrowserStack id: upload run: | - CREDS="${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" - - APP_RESPONSE=$(curl -u "$CREDS" \ + APP_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/upload" \ -F "file=@android-cpp/QuickStartTasksCPP/app/build/outputs/apk/release/app-release-unsigned.apk" \ -F "custom_id=ditto-android-cpp-appium-app") @@ -182,13 +181,10 @@ jobs: - name: Execute Appium tests on BrowserStack id: test working-directory: android-cpp/QuickStartTasksCPP/appium-test - run: | - export BROWSERSTACK_USERNAME="${{ secrets.BROWSERSTACK_USERNAME }}" - export BROWSERSTACK_ACCESS_KEY="${{ secrets.BROWSERSTACK_ACCESS_KEY }}" - export BROWSERSTACK_APP_URL="${{ steps.upload.outputs.app_url }}" - export GITHUB_TEST_DOC_ID="${{ steps.seed_task.outputs.document-title }}" - - ../gradlew test --console=plain --no-daemon + env: + BROWSERSTACK_APP_URL: ${{ steps.upload.outputs.app_url }} + GITHUB_TEST_DOC_ID: ${{ steps.seed_task.outputs.document-title }} + run: ../gradlew test --console=plain --no-daemon - name: Upload test artifacts if: always() @@ -202,7 +198,7 @@ jobs: summary: name: CI Report runs-on: ubuntu-latest - needs: [browserstack-appium-test] + needs: [browserstack] if: always() steps: @@ -214,7 +210,7 @@ jobs: # Overall status if [[ "${{ needs.lint.result }}" == "success" && \ "${{ needs.build.result }}" == "success" && \ - "${{ needs.browserstack-appium-test.result }}" == "success" ]]; then + "${{ needs.browserstack.result }}" == "success" ]]; then echo "**Overall Status:** ✅ All checks passed" >> $GITHUB_STEP_SUMMARY else echo "**Overall Status:** ❌ Failed" >> $GITHUB_STEP_SUMMARY @@ -225,14 +221,14 @@ jobs: echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY echo "| Lint | ${{ needs.lint.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "| Build | ${{ needs.build.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| BrowserStack Tests | ${{ needs.browserstack-appium-test.result == 'success' && '✅ Passed' || (needs.browserstack-appium-test.result == 'skipped' && '⏭️ Skipped') || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY + echo "| BrowserStack Tests | ${{ needs.browserstack.result == 'success' && '✅ Passed' || (needs.browserstack.result == 'skipped' && '⏭️ Skipped') || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY # BrowserStack link - if [[ "${{ needs.browserstack-appium-test.result }}" != "skipped" ]]; then + if [[ "${{ needs.browserstack.result }}" != "skipped" ]]; then echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=Ditto+Android+C%2B%2B&build=Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=QuickStart+Android+C%2B%2B&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Tested Device:**" >> $GITHUB_STEP_SUMMARY echo "- Google Pixel 7 (Android 13.0)" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/android-java-ci.yml b/.github/workflows/android-java-ci.yml index dc5e9c87d..b35292e39 100644 --- a/.github/workflows/android-java-ci.yml +++ b/.github/workflows/android-java-ci.yml @@ -2,12 +2,10 @@ name: Android Java CI on: push: - branches: [ main ] - paths: + paths: - 'android-java/**' - '.github/workflows/android-java-ci.yml' pull_request: - branches: [ main ] paths: - 'android-java/**' - '.github/workflows/android-java-ci.yml' @@ -105,7 +103,7 @@ jobs: android-java/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk retention-days: 1 - browserstack-test: + browserstack: name: BrowserStack Device Testing runs-on: ubuntu-latest needs: [build] @@ -128,11 +126,19 @@ jobs: with: name: android-apks-${{ github.run_number }} path: android-java/app/build/outputs/apk/ - + + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Android Java' + - name: Upload APKs to BrowserStack id: upload run: | - CREDS="${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" + CREDS="$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" # Upload app APK echo "📱 Uploading app APK to BrowserStack..." @@ -191,7 +197,7 @@ jobs: # Create test execution request TITLE="${{ steps.seed_task.outputs.document-title }}" - BUILD_RESPONSE=$(curl -s -u '${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}' \ + BUILD_RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST 'https://api-cloud.browserstack.com/app-automate/espresso/v2/build' \ -H 'Content-Type: application/json' \ -d '{ @@ -203,8 +209,8 @@ jobs: "Google Pixel 6-12.0", "OnePlus 9-11.0" ], - "project": "Ditto Android Java", - "buildName": "Build #${{ github.run_number }}", + "project": "QuickStart Android Java", + "buildName": "CI Build #${{ github.run_number }}", "buildTag": "${{ github.ref_name }}", "deviceLogs": true, "video": true, @@ -242,7 +248,7 @@ jobs: echo "⏳ Waiting for test execution to complete..." while [ $ELAPSED -lt $MAX_WAIT_TIME ]; do - RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds/$BUILD_ID") STATUS=$(echo "$RESPONSE" | jq -r .status) @@ -267,7 +273,7 @@ jobs: done # Get final results - FINAL_RESULT=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + FINAL_RESULT=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds/$BUILD_ID") echo "📋 Final results:" @@ -304,7 +310,7 @@ jobs: summary: name: CI Report runs-on: ubuntu-latest - needs: [browserstack-test] + needs: [browserstack] if: always() steps: @@ -316,7 +322,7 @@ jobs: # Overall status if [[ "${{ needs.lint.result }}" == "success" && \ "${{ needs.build.result }}" == "success" && \ - "${{ needs.browserstack-test.result }}" == "success" ]]; then + "${{ needs.browserstack.result }}" == "success" ]]; then echo "**Overall Status:** ✅ All checks passed" >> $GITHUB_STEP_SUMMARY else echo "**Overall Status:** ❌ Failed" >> $GITHUB_STEP_SUMMARY @@ -331,10 +337,10 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY # BrowserStack link - if [[ "${{ needs.browserstack-test.result }}" != "skipped" ]]; then + if [[ "${{ needs.browserstack.result }}" != "skipped" ]]; then echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=Ditto+Android+Java&build=Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=QuickStart+Android+Java&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Tested Devices:**" >> $GITHUB_STEP_SUMMARY echo "- Google Pixel 8 (Android 14)" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/android-kotlin-ci.yml b/.github/workflows/android-kotlin-ci.yml index 5a721579d..3ca36e8bb 100644 --- a/.github/workflows/android-kotlin-ci.yml +++ b/.github/workflows/android-kotlin-ci.yml @@ -2,12 +2,10 @@ name: Android Kotlin CI on: push: - branches: [ main ] - paths: + paths: - 'android-kotlin/**' - '.github/workflows/android-kotlin-ci.yml' pull_request: - branches: [ main ] paths: - 'android-kotlin/**' - '.github/workflows/android-kotlin-ci.yml' @@ -120,7 +118,7 @@ jobs: path: android-kotlin/QuickStartTasks/app/build/reports/ retention-days: 1 - browserstack-test: + browserstack: name: BrowserStack Device Testing runs-on: ubuntu-latest needs: [build] @@ -143,14 +141,20 @@ jobs: with: name: android-apks-${{ github.run_number }} path: android-kotlin/QuickStartTasks/app/build/outputs/apk/ - + + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Android Kotlin' + - name: Upload APKs to BrowserStack id: upload run: | - CREDS="${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" - # 1. Upload AUT (app-debug.apk) - APP_UPLOAD_RESPONSE=$(curl -u "$CREDS" \ + APP_UPLOAD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/app" \ -F "file=@android-kotlin/QuickStartTasks/app/build/outputs/apk/debug/app-debug.apk" \ -F "custom_id=ditto-android-kotlin-app") @@ -158,7 +162,7 @@ jobs: echo "app_url=$APP_URL" >> "$GITHUB_OUTPUT" # 2. Upload Espresso test-suite (app-debug-androidTest.apk) - TEST_UPLOAD_RESPONSE=$(curl -u "$CREDS" \ + TEST_UPLOAD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/test-suite" \ -F "file=@android-kotlin/QuickStartTasks/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk" \ -F "custom_id=ditto-android-kotlin-test") @@ -188,7 +192,7 @@ jobs: # Create test execution request with instrumentationOptions (correct approach for Android) TITLE="${{ steps.seed_task.outputs.document-title }}" - BUILD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/build" \ -H "Content-Type: application/json" \ -d "{ @@ -200,8 +204,8 @@ jobs: \"Google Pixel 6-12.0\", \"OnePlus 9-11.0\" ], - \"project\": \"Ditto Android Kotlin\", - \"buildName\": \"Build #${{ github.run_number }}\", + \"project\": \"QuickStart Android Kotlin\", + \"buildName\": \"CI Build #${{ github.run_number }}\", \"buildTag\": \"${{ github.ref_name }}\", \"deviceLogs\": true, \"video\": true, @@ -240,9 +244,9 @@ jobs: MAX_WAIT_TIME=1800 # 30 minutes CHECK_INTERVAL=30 # Check every 30 seconds ELAPSED=0 - + while [ $ELAPSED -lt $MAX_WAIT_TIME ]; do - BUILD_STATUS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_STATUS_RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds/$BUILD_ID") BUILD_STATUS=$(echo "$BUILD_STATUS_RESPONSE" | jq -r .status) @@ -267,9 +271,9 @@ jobs: sleep $CHECK_INTERVAL ELAPSED=$((ELAPSED + CHECK_INTERVAL)) done - + # Get final results - FINAL_RESULT=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + FINAL_RESULT=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds/$BUILD_ID") echo "Final build result:" @@ -301,7 +305,7 @@ jobs: summary: name: CI Report runs-on: ubuntu-latest - needs: [browserstack-test] + needs: [browserstack] if: always() steps: @@ -313,7 +317,7 @@ jobs: # Overall status if [[ "${{ needs.lint.result }}" == "success" && \ "${{ needs.build.result }}" == "success" && \ - "${{ needs.browserstack-test.result }}" == "success" ]]; then + "${{ needs.browserstack.result }}" == "success" ]]; then echo "**Overall Status:** ✅ All checks passed" >> $GITHUB_STEP_SUMMARY else echo "**Overall Status:** ❌ Failed" >> $GITHUB_STEP_SUMMARY @@ -324,14 +328,14 @@ jobs: echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY echo "| Lint | ${{ needs.lint.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "| Build and Test | ${{ needs.build.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| BrowserStack Tests | ${{ needs.browserstack-test.result == 'success' && '✅ Passed' || (needs.browserstack-test.result == 'skipped' && '⏭️ Skipped') || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY + echo "| BrowserStack Tests | ${{ needs.browserstack.result == 'success' && '✅ Passed' || (needs.browserstack.result == 'skipped' && '⏭️ Skipped') || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY # BrowserStack link - if [[ "${{ needs.browserstack-test.result }}" != "skipped" ]]; then + if [[ "${{ needs.browserstack.result }}" != "skipped" ]]; then echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=Ditto+Android+Kotlin&build=Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "🤖 [View Test Results](https://app-automate.browserstack.com/builds?project=QuickStart+Android+Kotlin&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Tested Devices:**" >> $GITHUB_STEP_SUMMARY echo "- Google Pixel 8 (Android 14)" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/dotnet-maui-ci.yml b/.github/workflows/dotnet-maui-ci.yml index 65638a202..4d1419782 100644 --- a/.github/workflows/dotnet-maui-ci.yml +++ b/.github/workflows/dotnet-maui-ci.yml @@ -2,12 +2,10 @@ name: .NET MAUI CI on: push: - branches: [main] paths: - 'dotnet-maui/**' - '.github/workflows/dotnet-maui-ci.yml' pull_request: - branches: [main] paths: - 'dotnet-maui/**' - '.github/workflows/dotnet-maui-ci.yml' @@ -179,6 +177,14 @@ jobs: name: android-apk path: ./android-artifact + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart .NET MAUI' + - name: Upload Android APK to BrowserStack id: upload-android run: | @@ -191,7 +197,7 @@ jobs: exit 1 fi - UPLOAD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + UPLOAD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/upload" \ -F "file=@$APK_PATH" \ -F "custom_id=ditto-dotnet-maui-android") @@ -211,8 +217,8 @@ jobs: working-directory: dotnet-maui/UITests.Android run: | dotnet restore - BROWSERSTACK_USERNAME="${{ secrets.BROWSERSTACK_USERNAME }}" \ - BROWSERSTACK_ACCESS_KEY="${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BROWSERSTACK_USERNAME="$BROWSERSTACK_USERNAME" \ + BROWSERSTACK_ACCESS_KEY="$BROWSERSTACK_ACCESS_KEY" \ BROWSERSTACK_APP_ID="${{ steps.upload-android.outputs.app_url }}" \ EXPECTED_TASK_TITLE="${{ steps.seed_task.outputs.document-title }}" \ BUILD_NAME="CI Build #${{ github.run_number }}" \ @@ -248,6 +254,14 @@ jobs: name: ios-ipa path: ./ios-artifact + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart .NET MAUI' + - name: Upload iOS IPA to BrowserStack id: upload-ios run: | @@ -260,7 +274,7 @@ jobs: exit 1 fi - UPLOAD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + UPLOAD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/upload" \ -F "file=@$IPA_PATH" \ -F "custom_id=ditto-dotnet-maui-ios") @@ -280,8 +294,8 @@ jobs: working-directory: dotnet-maui/UITests.iOS run: | dotnet restore - BROWSERSTACK_USERNAME="${{ secrets.BROWSERSTACK_USERNAME }}" \ - BROWSERSTACK_ACCESS_KEY="${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BROWSERSTACK_USERNAME="$BROWSERSTACK_USERNAME" \ + BROWSERSTACK_ACCESS_KEY="$BROWSERSTACK_ACCESS_KEY" \ BROWSERSTACK_APP_ID="${{ steps.upload-ios.outputs.app_url }}" \ EXPECTED_TASK_TITLE="${{ steps.seed_task.outputs.document-title }}" \ BUILD_NAME="CI Build #${{ github.run_number }}" \ @@ -326,13 +340,13 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY if [[ "${{ needs.browserstack-android.result }}" != "skipped" ]]; then - echo "🤖 [Android Test Session](https://app-automate.browserstack.com/builds?project=Ditto+.NET+MAUI&build=CI+Build+%23${{ github.run_number }}&filter_duration=1&filter_test_status=ALL&filter_test_status=done&filter_test_status=error&filter_test_status=failed&filter_test_status=passed&filter_test_status=queued&filter_test_status=running&filter_test_status=skipped&filter_test_status=timedout&filter_test_status=undefined&filter_test_status=unknown&product=app-automate&sort_test_duration=-1&sort_test_status=-1&filter_device_name=Google+Pixel+7)" >> $GITHUB_STEP_SUMMARY + echo "🤖 [Android Test Session](https://app-automate.browserstack.com/builds?project=QuickStart+.NET+MAUI&build=CI+Build+%23${{ github.run_number }}&filter_duration=1&filter_test_status=ALL&filter_test_status=done&filter_test_status=error&filter_test_status=failed&filter_test_status=passed&filter_test_status=queued&filter_test_status=running&filter_test_status=skipped&filter_test_status=timedout&filter_test_status=undefined&filter_test_status=unknown&product=app-automate&sort_test_duration=-1&sort_test_status=-1&filter_device_name=Google+Pixel+7)" >> $GITHUB_STEP_SUMMARY fi if [[ "${{ needs.browserstack-ios.result }}" != "skipped" ]]; then - echo "🍎 [iOS Test Session](https://app-automate.browserstack.com/builds?project=Ditto+.NET+MAUI&build=CI+Build+%23${{ github.run_number }}&filter_duration=1&filter_test_status=ALL&filter_test_status=done&filter_test_status=error&filter_test_status=failed&filter_test_status=passed&filter_test_status=queued&filter_test_status=running&filter_test_status=skipped&filter_test_status=timedout&filter_test_status=undefined&filter_test_status=unknown&product=app-automate&sort_test_duration=-1&sort_test_status=-1&filter_device_name=iPhone+15)" >> $GITHUB_STEP_SUMMARY + echo "🍎 [iOS Test Session](https://app-automate.browserstack.com/builds?project=QuickStart+.NET+MAUI&build=CI+Build+%23${{ github.run_number }}&filter_duration=1&filter_test_status=ALL&filter_test_status=done&filter_test_status=error&filter_test_status=failed&filter_test_status=passed&filter_test_status=queued&filter_test_status=running&filter_test_status=skipped&filter_test_status=timedout&filter_test_status=undefined&filter_test_status=unknown&product=app-automate&sort_test_duration=-1&sort_test_status=-1&filter_device_name=iPhone+15)" >> $GITHUB_STEP_SUMMARY fi echo "" >> $GITHUB_STEP_SUMMARY - echo "[View All Sessions](https://app-automate.browserstack.com/builds?project=Ditto+.NET+MAUI&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "[View All Sessions](https://app-automate.browserstack.com/builds?project=QuickStart+.NET+MAUI&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY fi \ No newline at end of file diff --git a/.github/workflows/flutter-ci.yml b/.github/workflows/flutter-ci.yml index ee30c3faa..aef03d055 100644 --- a/.github/workflows/flutter-ci.yml +++ b/.github/workflows/flutter-ci.yml @@ -2,12 +2,10 @@ name: Flutter CI on: push: - branches: [main] paths: - 'flutter_app/**' - '.github/workflows/flutter-ci.yml' pull_request: - branches: [main] paths: - 'flutter_app/**' - '.github/workflows/flutter-ci.yml' @@ -428,6 +426,14 @@ jobs: working-directory: flutter_app run: flutter pub get + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Flutter' + - name: Build Android debug APKs with seeded task title working-directory: flutter_app/android run: | @@ -449,7 +455,7 @@ jobs: id: upload run: | echo "📤 Uploading app APK to BrowserStack..." - APP_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + APP_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/android/app" \ -F "file=@flutter_app/build/app/outputs/apk/debug/app-debug.apk") @@ -468,7 +474,7 @@ jobs: id: upload_test run: | echo "📤 Uploading test suite APK to BrowserStack..." - TEST_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + TEST_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/android/test-suite" \ -F "file=@flutter_app/build/app/outputs/apk/androidTest/debug/app-debug-androidTest.apk") @@ -504,7 +510,7 @@ jobs: fi # Create test execution request - BUILD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/android/build" \ -H "Content-Type: application/json" \ -d "{ @@ -515,8 +521,8 @@ jobs: \"Samsung Galaxy S23-13.0\", \"Google Pixel 6-12.0\" ], - \"project\": \"Ditto Flutter\", - \"buildName\": \"Android Build #${{ github.run_number }}\", + \"project\": \"QuickStart Flutter\", + \"buildName\": \"CI Build #${{ github.run_number }}\", \"buildTag\": \"${{ github.ref_name }}\", \"deviceLogs\": true, \"video\": true, @@ -553,7 +559,7 @@ jobs: echo "⏳ Waiting for test execution to complete..." while [ $ELAPSED -lt $MAX_WAIT_TIME ]; do - RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/android/builds/$BUILD_ID") STATUS=$(echo "$RESPONSE" | jq -r .status) @@ -578,7 +584,7 @@ jobs: done # Get final results - FINAL_RESULT=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + FINAL_RESULT=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/android/builds/$BUILD_ID") echo "📋 Final results:" @@ -668,6 +674,14 @@ jobs: working-directory: flutter_app/ios run: pod install || pod install --repo-update + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Flutter' + - name: Build iOS integration test package with seeded task title working-directory: flutter_app run: | @@ -708,7 +722,7 @@ jobs: id: upload-app run: | echo "📤 Uploading iOS app to BrowserStack..." - APP_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + APP_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/upload" \ -F "file=@ios-artifacts/Runner-unsigned.ipa") @@ -721,7 +735,7 @@ jobs: id: upload run: | echo "📤 Uploading iOS test package to BrowserStack..." - RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/ios/test-package" \ -F "file=@flutter_app/build/ios_integration/Build/Products/ios_test_package.zip") @@ -751,7 +765,7 @@ jobs: # Create test execution request # NOTE: Flutter testing framework requires iOS 15+ due to _backtrace_async symbol # See: https://developer.apple.com/documentation/os/backtrace_async - BUILD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/ios/build" \ -H "Content-Type: application/json" \ -d "{ @@ -761,8 +775,8 @@ jobs: \"iPhone 14-16\", \"iPhone 12-17\" ], - \"project\": \"Ditto Flutter\", - \"buildName\": \"iOS Build #${{ github.run_number }}\", + \"project\": \"QuickStart Flutter\", + \"buildName\": \"CI Build #${{ github.run_number }}\", \"buildTag\": \"${{ github.ref_name }}\", \"deviceLogs\": true, \"networkLogs\": true @@ -798,7 +812,7 @@ jobs: echo "⏳ Waiting for test execution to complete..." while [ $ELAPSED -lt $MAX_WAIT_TIME ]; do - RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/ios/builds/$BUILD_ID") STATUS=$(echo "$RESPONSE" | jq -r .status) @@ -823,7 +837,7 @@ jobs: done # Get final results - FINAL_RESULT=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + FINAL_RESULT=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/flutter-integration-tests/v2/ios/builds/$BUILD_ID") echo "📋 Final results:" diff --git a/.github/workflows/java-spring-ci.yml b/.github/workflows/java-spring-ci.yml index 5398a3030..8b6afeecb 100644 --- a/.github/workflows/java-spring-ci.yml +++ b/.github/workflows/java-spring-ci.yml @@ -7,12 +7,10 @@ name: Java Spring CI on: push: - branches: [ main ] - paths: + paths: - 'java-spring/**' - '.github/workflows/java-spring-ci.yml' pull_request: - branches: [ main ] paths: - 'java-spring/**' - '.github/workflows/java-spring-ci.yml' @@ -94,7 +92,7 @@ jobs: path: java-spring/build/libs/*.jar retention-days: 1 - browserstack-test: + browserstack: name: BrowserStack Device Testing (macos-latest) runs-on: macos-latest needs: [build] @@ -134,39 +132,19 @@ jobs: echo "DITTO_AUTH_URL=${{ secrets.DITTO_AUTH_URL }}" >> .env echo "DITTO_WEBSOCKET_URL=${{ secrets.DITTO_WEBSOCKET_URL }}" >> .env - - name: Install BrowserStack Local binary - run: | - curl -O "https://www.browserstack.com/browserstack-local/BrowserStackLocal-darwin-x64.zip" - unzip BrowserStackLocal-darwin-x64.zip - chmod +x BrowserStackLocal + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Java Spring' - - name: Start BrowserStack Local tunnel - run: | - echo "Starting BrowserStack Local tunnel..." - nohup ./BrowserStackLocal --key "${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ - --daemon-mode > browserstack-local.log 2>&1 & - - # Wait for tunnel to establish - TIMEOUT=60 - ELAPSED=0 - - while [ $ELAPSED -lt $TIMEOUT ]; do - if [ -f browserstack-local.log ] && grep -q "You can now access your local server(s) in our remote browser" browserstack-local.log; then - echo "BrowserStack Local tunnel established" - exit 0 - fi - if [ -f browserstack-local.log ] && grep -q -i "error\|failed\|unable" browserstack-local.log; then - echo "BrowserStack Local tunnel failed:" - cat browserstack-local.log - exit 1 - fi - sleep 5 - ELAPSED=$((ELAPSED + 5)) - done - - echo "BrowserStack Local tunnel timeout after ${TIMEOUT}s" - [ -f browserstack-local.log ] && cat browserstack-local.log - exit 1 + - name: BrowserStackLocal Setup + uses: 'browserstack/github-actions/setup-local@master' + with: + local-testing: start + local-identifier: random - name: Create BrowserStack config working-directory: java-spring @@ -241,9 +219,11 @@ jobs: rm app.pid fi - - name: Stop BrowserStack Local tunnel + - name: BrowserStackLocal Stop if: always() - run: pkill -f "BrowserStackLocal" || true + uses: 'browserstack/github-actions/setup-local@master' + with: + local-testing: stop - name: Upload test reports if: always() @@ -258,15 +238,13 @@ jobs: uses: actions/upload-artifact@v4 with: name: spring-boot-logs-${{ github.run_number }} - path: | - java-spring/app.log - browserstack-local.log + path: java-spring/app.log retention-days: 1 summary: name: CI Report runs-on: ubuntu-latest - needs: [browserstack-test] + needs: [browserstack] if: always() steps: @@ -278,7 +256,7 @@ jobs: # Overall status if [[ "${{ needs.lint.result }}" == "success" && \ "${{ needs.build.result }}" == "success" && \ - "${{ needs.browserstack-test.result }}" == "success" ]]; then + "${{ needs.browserstack.result }}" == "success" ]]; then echo "**Overall Status:** ✅ All checks passed" >> $GITHUB_STEP_SUMMARY else echo "**Overall Status:** ❌ Failed" >> $GITHUB_STEP_SUMMARY @@ -289,14 +267,14 @@ jobs: echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY echo "| Lint | ${{ needs.lint.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "| Build | ${{ needs.build.result == 'success' && '✅ Passed' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY - echo "| BrowserStack Tests | ${{ needs.browserstack-test.result == 'success' && '✅ Passed' || (needs.browserstack-test.result == 'skipped' && '⏭️ Skipped') || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY + echo "| BrowserStack Tests | ${{ needs.browserstack.result == 'success' && '✅ Passed' || (needs.browserstack.result == 'skipped' && '⏭️ Skipped') || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY # BrowserStack link - if [[ "${{ needs.browserstack-test.result }}" != "skipped" ]]; then + if [[ "${{ needs.browserstack.result }}" != "skipped" ]]; then echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "🔗 [View Test Results](https://automate.browserstack.com/builds?project=Ditto+Java+Spring+Tasks&build=Java+Spring+Selenium+Tests+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "🔗 [View Test Results](https://automate.browserstack.com/builds?project=QuickStart+Java+Spring&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Tested Browser:**" >> $GITHUB_STEP_SUMMARY echo "- Chrome Latest (Windows 11)" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/javascript-web-ci.yml b/.github/workflows/javascript-web-ci.yml index 649096226..04db54a13 100644 --- a/.github/workflows/javascript-web-ci.yml +++ b/.github/workflows/javascript-web-ci.yml @@ -2,19 +2,13 @@ name: javascript-web-browserstack on: pull_request: - branches: - - main - - 'sdk-*' paths: - 'javascript-web/**' - - '.github/workflows/javascript-web-browserstack.yml' + - '.github/workflows/javascript-web-ci.yml' push: - branches: - - main - - 'sdk-*' paths: - 'javascript-web/**' - - '.github/workflows/javascript-web-browserstack.yml' + - '.github/workflows/javascript-web-ci.yml' workflow_dispatch: concurrency: @@ -78,19 +72,19 @@ jobs: curl -f http://localhost:3000/ || (echo "Server failed to start" && cat server.log && exit 1) echo "Web server started on http://localhost:3000" - - name: Install BrowserStack Local binary - run: | - wget "https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-x64.zip" - unzip BrowserStackLocal-linux-x64.zip - chmod +x BrowserStackLocal - - # Create config file with restricted permissions - echo "key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}" > browserstack.yml - chmod 600 browserstack.yml + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart JavaScript Web' - nohup ./BrowserStackLocal --config-file ./browserstack.yml --daemon start & - sleep 10 - echo "BrowserStack Local tunnel established" + - name: BrowserStackLocal Setup + uses: 'browserstack/github-actions/setup-local@master' + with: + local-testing: start + local-identifier: random - name: Make test script executable run: chmod +x .github/scripts/browserstack-test.py @@ -109,9 +103,11 @@ jobs: # Run the test script python3 .github/scripts/browserstack-test.py - - name: Stop BrowserStack Local tunnel + - name: BrowserStackLocal Stop if: always() - run: ./BrowserStackLocal --key "${{ secrets.BROWSERSTACK_ACCESS_KEY }}" --daemon stop || true + uses: 'browserstack/github-actions/setup-local@master' + with: + local-testing: stop - name: Generate test report if: always() diff --git a/.github/workflows/kotlin-multiplatform-ci.yml b/.github/workflows/kotlin-multiplatform-ci.yml index 845e1456b..eebfdbd07 100644 --- a/.github/workflows/kotlin-multiplatform-ci.yml +++ b/.github/workflows/kotlin-multiplatform-ci.yml @@ -2,12 +2,10 @@ name: Kotlin Multiplatform CI on: push: - branches: [ main ] paths: - 'kotlin-multiplatform/**' - '.github/workflows/kotlin-multiplatform-ci.yml' pull_request: - branches: [ main ] paths: - 'kotlin-multiplatform/**' - '.github/workflows/kotlin-multiplatform-ci.yml' @@ -325,13 +323,19 @@ jobs: name: android-kmp-apks-${{ github.run_number }} path: kotlin-multiplatform/composeApp/build/outputs/apk/ + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Kotlin Multiplatform' + - name: Upload APKs to BrowserStack id: upload run: | - CREDS="${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" - # 1. Upload AUT (composeApp-debug.apk) - APP_UPLOAD_RESPONSE=$(curl -u "$CREDS" \ + APP_UPLOAD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/app" \ -F "file=@kotlin-multiplatform/composeApp/build/outputs/apk/debug/composeApp-debug.apk" \ -F "custom_id=ditto-kotlin-multiplatform-app") @@ -339,7 +343,7 @@ jobs: echo "app_url=$APP_URL" >> "$GITHUB_OUTPUT" # 2. Upload Espresso test-suite (composeApp-debug-androidTest.apk) - TEST_UPLOAD_RESPONSE=$(curl -u "$CREDS" \ + TEST_UPLOAD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/test-suite" \ -F "file=@kotlin-multiplatform/composeApp/build/outputs/apk/androidTest/debug/composeApp-debug-androidTest.apk" \ -F "custom_id=ditto-kotlin-multiplatform-test") @@ -369,7 +373,7 @@ jobs: # Create test execution request with instrumentationOptions TITLE="${{ steps.seed_task.outputs.document-title }}" - BUILD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/espresso/v2/build" \ -H "Content-Type: application/json" \ -d "{ @@ -380,8 +384,8 @@ jobs: \"Samsung Galaxy S23-13.0\", \"Google Pixel 6-12.0\" ], - \"project\": \"Ditto Kotlin Multiplatform\", - \"buildName\": \"Build #${{ github.run_number }}\", + \"project\": \"QuickStart Kotlin Multiplatform\", + \"buildName\": \"CI Build #${{ github.run_number }}\", \"buildTag\": \"${{ github.ref_name }}\", \"deviceLogs\": true, \"video\": true, @@ -424,7 +428,7 @@ jobs: ELAPSED=0 while [ $ELAPSED -lt $MAX_WAIT_TIME ]; do - BUILD_STATUS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_STATUS_RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds/$BUILD_ID") BUILD_STATUS=$(echo "$BUILD_STATUS_RESPONSE" | jq -r .status) @@ -448,9 +452,9 @@ jobs: sleep $CHECK_INTERVAL ELAPSED=$((ELAPSED + CHECK_INTERVAL)) done - + # Get final results - FINAL_RESULT=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + FINAL_RESULT=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/espresso/v2/builds/$BUILD_ID") echo "Final build result:" @@ -475,7 +479,7 @@ jobs: # FIXME: Accessibility tags were not working to detect labels on BrowserStack at time of commenting # browserstack-ios job removed for now - build-summary: + summary: name: Build Summary runs-on: ubuntu-latest needs: [lint, build-android, build-ios, build-desktop, browserstack-android] @@ -520,5 +524,5 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "🤖 [View Android Test Results](https://app-automate.browserstack.com/builds?project=Ditto+Kotlin+Multiplatform&build=Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "🤖 [View Android Test Results](https://app-automate.browserstack.com/builds?project=QuickStart+Kotlin+Multiplatform&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY fi \ No newline at end of file diff --git a/.github/workflows/react-native-ci.yml b/.github/workflows/react-native-ci.yml index 0a951c010..0932d8d89 100644 --- a/.github/workflows/react-native-ci.yml +++ b/.github/workflows/react-native-ci.yml @@ -2,15 +2,9 @@ name: React Native CI on: pull_request: - branches: - - main - - 'sdk-*' paths: - 'react-native/**' push: - branches: - - main - - 'sdk-*' paths: - 'react-native/**' workflow_dispatch: @@ -222,7 +216,7 @@ jobs: ditto-api-key: ${{ secrets.DITTO_API_KEY }} ditto-api-url: ${{ secrets.DITTO_API_URL }} app-name: 'react-native' - test-android-maestro: + browserstack-android: name: Test Android - BrowserStack Maestro runs-on: ubuntu-latest needs: [build-android, seed-ditto-cloud] @@ -243,10 +237,18 @@ jobs: name: android-apk-${{ github.run_number }} path: ./artifacts/ + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart React Native' + - name: Upload APK to BrowserStack id: upload-apk run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/app" \ -F "file=@./artifacts/app-release.apk" \ -F "custom_id=ReactNative-Android-${{ github.run_id }}") @@ -283,9 +285,6 @@ jobs: - name: Upload Maestro test suite to BrowserStack id: upload-tests - env: - BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} - BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} run: | set -euo pipefail test -f react-native/maestro-tests.zip @@ -298,14 +297,14 @@ jobs: - name: Execute Maestro tests on BrowserStack (Parallel) id: execute-tests run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/android/build" \ -H "Content-Type: application/json" \ -d '{ "app": "${{ steps.upload-apk.outputs.app_url }}", "testSuite": "${{ steps.upload-tests.outputs.test_suite_url }}", - "project": "Ditto React Native", - "buildName": "Build #${{ github.run_number }}", + "project": "QuickStart React Native", + "buildName": "CI Build #${{ github.run_number }}", "buildTag": "${{ github.ref_name }}", "devices": [ "Samsung Galaxy S22-12.0", @@ -328,7 +327,7 @@ jobs: # Wait for tests to complete (max 20 minutes) for i in {1..120}; do - response=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id") status=$(echo $response | jq -r '.status') @@ -351,7 +350,7 @@ jobs: echo $response | jq -r '.devices[]?.sessions[]?.id' 2>/dev/null | while read sid; do if [ -n "$sid" ]; then echo "Session $sid details:" - curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id/sessions/$sid" | jq '.' fi done @@ -366,7 +365,7 @@ jobs: exit 1 fi - test-ios-maestro: + browserstack-ios: name: Test iOS - BrowserStack Maestro runs-on: ubuntu-latest needs: [build-ios, seed-ditto-cloud] @@ -384,10 +383,18 @@ jobs: name: ios-ipa-${{ github.run_number }} path: ./artifacts/ + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart React Native' + - name: Upload IPA to BrowserStack id: upload-ipa run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/app" \ -F "file=@./artifacts/DittoReactNativeSampleApp-unsigned.ipa" \ -F "custom_id=ReactNative-iOS-${{ github.run_id }}") @@ -424,7 +431,7 @@ jobs: - name: Upload Maestro test suite to BrowserStack id: upload-tests run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/test-suite" \ -F "file=@react-native/maestro-tests.zip" \ -F "custom_id=ReactNative-iOS-Tests-${{ github.run_id }}") @@ -435,14 +442,14 @@ jobs: - name: Execute Maestro tests on BrowserStack (Parallel) id: execute-tests run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/ios/build" \ -H "Content-Type: application/json" \ -d '{ "app": "${{ steps.upload-ipa.outputs.app_url }}", "testSuite": "${{ steps.upload-tests.outputs.test_suite_url }}", - "project": "Ditto React Native", - "buildName": "Build #${{ github.run_number }}", + "project": "QuickStart React Native", + "buildName": "CI Build #${{ github.run_number }}", "buildTag": "${{ github.ref_name }}", "devices": [ "iPhone 15-17.0", @@ -468,7 +475,7 @@ jobs: # Wait for tests to complete (max 20 minutes) for i in {1..120}; do - response=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id") status=$(echo $response | jq -r '.status') @@ -491,7 +498,7 @@ jobs: echo $response | jq -r '.devices[]?.sessions[]?.id' 2>/dev/null | while read sid; do if [ -n "$sid" ]; then echo "Session $sid details:" - curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id/sessions/$sid" | jq '.' fi done @@ -506,10 +513,10 @@ jobs: exit 1 fi - report-results: + summary: name: Report BrowserStack Results runs-on: ubuntu-latest - needs: [test-android-maestro, test-ios-maestro] + needs: [browserstack-android, browserstack-ios] if: always() steps: @@ -520,8 +527,8 @@ jobs: # Android results echo "### Android Tests" >> $GITHUB_STEP_SUMMARY - ANDROID_BUILD_ID="${{ needs.test-android-maestro.outputs.build_id }}" - ANDROID_STATUS="${{ needs.test-android-maestro.outputs.status }}" + ANDROID_BUILD_ID="${{ needs.browserstack-android.outputs.build_id }}" + ANDROID_STATUS="${{ needs.browserstack-android.outputs.status }}" if [ -n "$ANDROID_BUILD_ID" ] && [ "$ANDROID_BUILD_ID" != "null" ]; then if [ "$ANDROID_STATUS" = "success" ]; then @@ -539,8 +546,8 @@ jobs: # iOS results echo "### iOS Tests" >> $GITHUB_STEP_SUMMARY - IOS_BUILD_ID="${{ needs.test-ios-maestro.outputs.build_id }}" - IOS_STATUS="${{ needs.test-ios-maestro.outputs.status }}" + IOS_BUILD_ID="${{ needs.browserstack-ios.outputs.build_id }}" + IOS_STATUS="${{ needs.browserstack-ios.outputs.status }}" if [ -n "$IOS_BUILD_ID" ] && [ "$IOS_BUILD_ID" != "null" ]; then if [ "$IOS_STATUS" = "success" ]; then diff --git a/.github/workflows/react-native-expo-ci.yml b/.github/workflows/react-native-expo-ci.yml index 0b4d5a8b1..dfa8ac06b 100644 --- a/.github/workflows/react-native-expo-ci.yml +++ b/.github/workflows/react-native-expo-ci.yml @@ -2,15 +2,9 @@ name: React Native Expo CI on: push: - branches: - - main - - 'sdk-*' paths: - 'react-native-expo/**' pull_request: - branches: - - main - - 'sdk-*' paths: - 'react-native-expo/**' workflow_dispatch: @@ -226,7 +220,7 @@ jobs: ditto-api-url: ${{ secrets.DITTO_API_URL }} app-name: 'react-native-expo' - test-android-maestro: + browserstack-android: name: Test Android - BrowserStack Maestro runs-on: ubuntu-latest needs: [build-android, seed-ditto-cloud] @@ -247,10 +241,18 @@ jobs: name: expo-android-apk-${{ github.run_number }} path: ./artifacts/ + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart React Native Expo' + - name: Upload APK to BrowserStack id: upload-apk run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/app" \ -F "file=@./artifacts/app-release.apk" \ -F "custom_id=ReactNative-Expo-Android-${{ github.run_id }}") @@ -288,7 +290,7 @@ jobs: - name: Upload Maestro test suite to BrowserStack id: upload-tests run: | - response=$(curl --fail-with-body -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl --fail-with-body -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/test-suite" \ -F "file=@react-native-expo/maestro-tests.zip" \ -F "custom_id=ReactNative-Expo-Tests-${{ github.run_id }}") @@ -308,14 +310,14 @@ jobs: - name: Execute Maestro tests on BrowserStack (Parallel) id: execute-tests run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/android/build" \ -H "Content-Type: application/json" \ -d '{ "app": "${{ steps.upload-apk.outputs.app_url }}", "testSuite": "${{ steps.upload-tests.outputs.test_suite_url }}", - "project": "Ditto React Native Expo", - "buildName": "Build #${{ github.run_number }}", + "project": "QuickStart React Native Expo", + "buildName": "CI Build #${{ github.run_number }}", "buildTag": "${{ github.ref_name }}", "devices": [ "Samsung Galaxy S22-12.0", @@ -338,7 +340,7 @@ jobs: # Wait for tests to complete (max 20 minutes) for i in {1..120}; do - response=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id") status=$(echo $response | jq -r '.status') @@ -361,7 +363,7 @@ jobs: echo $response | jq -r '.devices[]?.sessions[]?.id' 2>/dev/null | while read sid; do if [ -n "$sid" ]; then echo "Session $sid details:" - curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id/sessions/$sid" | jq '.' fi done @@ -376,7 +378,7 @@ jobs: exit 1 fi - test-ios-maestro: + browserstack-ios: name: Test iOS - BrowserStack Maestro runs-on: ubuntu-latest needs: [build-ios, seed-ditto-cloud] @@ -396,10 +398,18 @@ jobs: name: expo-ios-ipa-${{ github.run_number }} path: ./artifacts/ + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart React Native Expo' + - name: Upload IPA to BrowserStack id: upload-ipa run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/app" \ -F "file=@./artifacts/reactnativeexpo-unsigned.ipa" \ -F "custom_id=ReactNative-Expo-iOS-${{ github.run_id }}") @@ -436,7 +446,7 @@ jobs: - name: Upload Maestro test suite to BrowserStack id: upload-tests run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/test-suite" \ -F "file=@react-native-expo/maestro-tests.zip" \ -F "custom_id=ReactNative-Expo-iOS-Tests-${{ github.run_id }}") @@ -447,14 +457,14 @@ jobs: - name: Execute Maestro tests on BrowserStack (Parallel) id: execute-tests run: | - response=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/maestro/v2/ios/build" \ -H "Content-Type: application/json" \ -d '{ "app": "${{ steps.upload-ipa.outputs.app_url }}", "testSuite": "${{ steps.upload-tests.outputs.test_suite_url }}", - "project": "Ditto React Native Expo", - "buildName": "Build #${{ github.run_number }}", + "project": "QuickStart React Native Expo", + "buildName": "CI Build #${{ github.run_number }}", "buildTag": "${{ github.ref_name }}", "devices": [ "iPhone 15-17.0", @@ -480,7 +490,7 @@ jobs: # Wait for tests to complete (max 20 minutes) for i in {1..120}; do - response=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + response=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id") status=$(echo $response | jq -r '.status') @@ -503,7 +513,7 @@ jobs: echo $response | jq -r '.devices[]?.sessions[]?.id' 2>/dev/null | while read sid; do if [ -n "$sid" ]; then echo "Session $sid details:" - curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/maestro/v2/builds/$build_id/sessions/$sid" | jq '.' fi done @@ -518,10 +528,10 @@ jobs: exit 1 fi - report-results: + summary: name: Report BrowserStack Results runs-on: ubuntu-latest - needs: [test-android-maestro, test-ios-maestro] + needs: [browserstack-android, browserstack-ios] if: always() steps: @@ -532,8 +542,8 @@ jobs: # Android results echo "### Android Tests" >> $GITHUB_STEP_SUMMARY - ANDROID_BUILD_ID="${{ needs.test-android-maestro.outputs.build_id }}" - ANDROID_STATUS="${{ needs.test-android-maestro.outputs.status }}" + ANDROID_BUILD_ID="${{ needs.browserstack-android.outputs.build_id }}" + ANDROID_STATUS="${{ needs.browserstack-android.outputs.status }}" if [ -n "$ANDROID_BUILD_ID" ] && [ "$ANDROID_BUILD_ID" != "null" ]; then if [ "$ANDROID_STATUS" = "success" ]; then @@ -551,8 +561,8 @@ jobs: # iOS results echo "### iOS Tests" >> $GITHUB_STEP_SUMMARY - IOS_BUILD_ID="${{ needs.test-ios-maestro.outputs.build_id }}" - IOS_STATUS="${{ needs.test-ios-maestro.outputs.status }}" + IOS_BUILD_ID="${{ needs.browserstack-ios.outputs.build_id }}" + IOS_STATUS="${{ needs.browserstack-ios.outputs.status }}" if [ -n "$IOS_BUILD_ID" ] && [ "$IOS_BUILD_ID" != "null" ]; then if [ "$IOS_STATUS" = "success" ]; then diff --git a/.github/workflows/swift-ci.yml b/.github/workflows/swift-ci.yml index 8bdb4532f..dc6dab729 100644 --- a/.github/workflows/swift-ci.yml +++ b/.github/workflows/swift-ci.yml @@ -2,12 +2,10 @@ name: Swift on: pull_request: - branches: [main, 'sdk-*'] paths: - 'swift/**' - '.github/workflows/swift-ci.yml' push: - branches: [main, 'sdk-*'] paths: - 'swift/**' - '.github/workflows/swift-ci.yml' @@ -320,31 +318,39 @@ jobs: echo "GITHUB_TEST_DOC_ID=${{ steps.seed_task.outputs.document-title }}" >> $GITHUB_ENV echo "GITHUB_TEST_DOC_TITLE=${{ steps.seed_task.outputs.document-title }}" >> $GITHUB_ENV + - name: BrowserStack Env Setup + uses: 'browserstack/github-actions/setup-env@master' + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + build-name: 'CI Build #${{ github.run_number }}' + project-name: 'QuickStart Swift' + - name: Upload App and Test Bundle to BrowserStack id: upload run: | echo "📤 Uploading iOS app and XCUITest bundle to BrowserStack..." - + IPA_FILE="$(pwd)/Tasks-unsigned.ipa" TEST_BUNDLE="${{ steps.build_test_bundle.outputs.test_bundle_path }}" - + echo "📱 App file: $IPA_FILE" echo "🧪 Test bundle: $TEST_BUNDLE" - + # Validate both files exist if [ ! -f "$IPA_FILE" ]; then echo "❌ IPA file not found: $IPA_FILE" exit 1 fi - + if [ ! -f "$TEST_BUNDLE" ]; then echo "❌ Test bundle not found: $TEST_BUNDLE" exit 1 fi - + # Upload app to BrowserStack XCUITest v2 API echo "📱 Uploading app..." - APP_UPLOAD_RESPONSE=$(curl --fail --silent --show-error -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + APP_UPLOAD_RESPONSE=$(curl --fail --silent --show-error -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/app" \ -F "file=@$IPA_FILE" \ -F "custom_id=ditto-swift-app") @@ -362,9 +368,9 @@ jobs: echo "🧪 Uploading test bundle..." echo "Debug: Test bundle path: $TEST_BUNDLE" ls -la "$TEST_BUNDLE" || echo "Test bundle file not found!" - + # Upload with better error handling to see 422 details - TEST_UPLOAD_RESPONSE=$(curl -s -w "\n%{http_code}" -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + TEST_UPLOAD_RESPONSE=$(curl -s -w "\n%{http_code}" -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/test-suite" \ -F "file=@$TEST_BUNDLE") @@ -414,17 +420,17 @@ jobs: echo "build_id=" >> $GITHUB_OUTPUT exit 0 fi - + # Create XCUITest execution request using v2 API with setEnvVariables - BUILD_RESPONSE=$(curl -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_RESPONSE=$(curl -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ -X POST "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/build" \ -H "Content-Type: application/json" \ -d "{ \"app\": \"$APP_URL\", \"testSuite\": \"$TEST_URL\", \"devices\": [\"iPhone 15 Pro-17\"], - \"project\": \"Ditto Swift\", - \"buildName\": \"Build #${{ github.run_number }}\", + \"project\": \"QuickStart Swift\", + \"buildName\": \"CI Build #${{ github.run_number }}\", \"buildTag\": \"${{ github.ref_name }}\", \"deviceLogs\": true, \"video\": true, @@ -465,7 +471,7 @@ jobs: ELAPSED=0 while [ $ELAPSED -lt $MAX_WAIT_TIME ]; do - BUILD_STATUS_RESPONSE=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + BUILD_STATUS_RESPONSE=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/builds/$BUILD_ID") BUILD_STATUS=$(echo "$BUILD_STATUS_RESPONSE" | jq -r .status) @@ -487,9 +493,9 @@ jobs: sleep $CHECK_INTERVAL ELAPSED=$((ELAPSED + CHECK_INTERVAL)) done - + # Get final results - FINAL_RESULT=$(curl -s -u "${{ secrets.BROWSERSTACK_USERNAME }}:${{ secrets.BROWSERSTACK_ACCESS_KEY }}" \ + FINAL_RESULT=$(curl -s -u "$BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY" \ "https://api-cloud.browserstack.com/app-automate/xcuitest/v2/builds/$BUILD_ID") echo "Final build result:" @@ -539,7 +545,7 @@ jobs: if [[ "${{ needs.browserstack.result }}" != "skipped" ]]; then echo "### BrowserStack Session" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "🍎 [View Test Results](https://app-automate.browserstack.com/builds?project=Ditto+Swift&build=Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY + echo "🍎 [View Test Results](https://app-automate.browserstack.com/builds?project=QuickStart+Swift&build=CI+Build+%23${{ github.run_number }})" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Tested Device:**" >> $GITHUB_STEP_SUMMARY echo "- iPhone 15 Pro (iOS 17)" >> $GITHUB_STEP_SUMMARY diff --git a/android-kotlin/QuickStartTasks/app/src/main/java/live/ditto/quickstart/tasks/TasksApplication.kt b/android-kotlin/QuickStartTasks/app/src/main/java/live/ditto/quickstart/tasks/TasksApplication.kt index 803a91f25..a05cae2f5 100644 --- a/android-kotlin/QuickStartTasks/app/src/main/java/live/ditto/quickstart/tasks/TasksApplication.kt +++ b/android-kotlin/QuickStartTasks/app/src/main/java/live/ditto/quickstart/tasks/TasksApplication.kt @@ -8,15 +8,11 @@ import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import live.ditto.Ditto import live.ditto.DittoIdentity -import live.ditto.DittoLogLevel -import live.ditto.DittoLogger import live.ditto.android.DefaultAndroidDittoDependencies import live.ditto.quickstart.tasks.DittoHandler.Companion.ditto -import live.ditto.transports.DittoTransportConfig class TasksApplication : Application() { - // Create a CoroutineScope // Use SupervisorJob so if one coroutine launched in this scope fails, it doesn't cancel the scope // @@ -36,7 +32,7 @@ class TasksApplication : Application() { init { instance = this } - + override fun onCreate() { super.onCreate() ioScope.launch {