Ad-hoc Release Tests - Maestro Cloud #127
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release - Run E2E Maestro Tests | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| app-version: | |
| description: 'App Version for Testing' | |
| required: true | |
| default: 'PLACEHOLDER' | |
| test-tag: | |
| description: 'Maestro Tests tag to include' | |
| required: true | |
| default: 'releaseTest' | |
| env: | |
| ASANA_PAT: ${{ secrets.ASANA_ACCESS_TOKEN }} | |
| emoji_info: ":information_source:" # ℹ️ | |
| emoji_success: ":white_check_mark:" # ✅ | |
| emoji_failure: ":x:" # ❌ | |
| jobs: | |
| run-release-tests: | |
| name: Create release APK and run E2E Maestro tests | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| ref: ${{ github.event.inputs.app-version }} | |
| - name: Set up JDK version | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version-file: .github/.java-version | |
| distribution: 'adopt' | |
| - name: Create folder | |
| if: always() | |
| run: mkdir apk | |
| - name: Decode keys | |
| uses: davidSchuppa/base64Secret-toFile-action@v2 | |
| with: | |
| secret: ${{ secrets.FAKE_RELEASE_PROPERTIES }} | |
| fileName: ddg_android_build.properties | |
| destination-path: $HOME/jenkins_static/com.duckduckgo.mobile.android/ | |
| - name: Decode key file | |
| uses: davidSchuppa/base64Secret-toFile-action@v2 | |
| with: | |
| secret: ${{ secrets.FAKE_RELEASE_KEY }} | |
| fileName: android | |
| destination-path: $HOME/jenkins_static/com.duckduckgo.mobile.android/ | |
| - name: Setup Gradle | |
| uses: gradle/actions/setup-gradle@v5 | |
| with: | |
| cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} | |
| - name: Assemble release APK | |
| run: ./gradlew assemblePlayRelease -Pforce-default-variant -Pskip-onboarding | |
| - name: Move APK to new folder | |
| if: always() | |
| run: find . -name "*.apk" -exec mv '{}' apk/release.apk \; | |
| - name: Notify Mattermost of Maestro tests | |
| id: send-mm-tests-started | |
| uses: duckduckgo/native-github-asana-sync@v2.0 | |
| with: | |
| mattermost-token: ${{ secrets.MM_AUTH_TOKEN }} | |
| mattermost-team-id: ${{ secrets.MM_TEAM_ID }} | |
| mattermost-channel-name: ${{ vars.MM_RELEASE_NOTIFY_CHANNEL }} | |
| mattermost-message: ${{env.emoji_info}} Release ${{ github.event.inputs.app-version }}. Running Maestro tests for tag ${{ github.event.inputs.test-tag }} https://github.com/duckduckgo/Android/actions/runs/${{ github.run_id }} | |
| action: 'send-mattermost-message' | |
| - name: Maestro tests flows | |
| id: release-tests | |
| uses: mobile-dev-inc/action-maestro-cloud@v1.9.8 | |
| timeout-minutes: 120 | |
| with: | |
| api-key: ${{ secrets.ROBIN_API_KEY }} | |
| project-id: ${{ vars.ROBIN_ANDROID_PROJECT_ID }} | |
| timeout: ${{ vars.ROBIN_TIMEOUT_MINUTES }} | |
| app-file: apk/release.apk | |
| android-api-level: 30 | |
| workspace: .maestro | |
| include-tags: ${{ github.event.inputs.test-tag }} | |
| - name: Analyze Maestro Flow Results | |
| if: always() | |
| id: analyze-flow-results | |
| uses: ./.github/actions/maestro-flow-analyzer | |
| with: | |
| flow_results_json: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_FLOW_RESULTS }} | |
| console_url: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_CONSOLE_URL }} | |
| upload_status: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_UPLOAD_STATUS }} | |
| app_binary_id: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_APP_BINARY_ID }} | |
| - name: Access Outputs (for debugging) | |
| if: always() | |
| run: | | |
| echo "Console URL: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_CONSOLE_URL }}" | |
| echo 'Flow Results (JSON): ${{ steps.release-tests.outputs.MAESTRO_CLOUD_FLOW_RESULTS }}' | |
| echo "Release Tests Step Conclusion: ${{ steps.release-tests.conclusion }}" # From Maestro action itself | |
| echo "Analyzed Flow Summary Status: ${{ steps.analyze-flow-results.outputs.flow_summary_status }}" # From analyzer action | |
| printf "Analyzed Flow Summary Message:\n%s\n" "${{ steps.analyze-flow-results.outputs.flow_summary_message }}" | |
| - name: Notify Mattermost - Maestro Tests ALL SUCCEEDED | |
| # Condition 1: Our script says success | |
| # Condition 2: The Maestro action itself also reported overall success | |
| if: always() && steps.analyze-flow-results.outputs.flow_summary_status == 'success' && steps.release-tests.conclusion == 'success' | |
| uses: duckduckgo/native-github-asana-sync@v2.0 | |
| with: | |
| action: 'send-mattermost-message' | |
| mattermost-token: ${{ secrets.MM_AUTH_TOKEN }} | |
| mattermost-team-id: ${{ secrets.MM_TEAM_ID }} | |
| mattermost-channel-name: ${{ vars.MM_RELEASE_NOTIFY_CHANNEL }} | |
| mattermost-message: | | |
| ${{env.emoji_success}} Release ${{ github.event.inputs.app-version }}: Tests for tag ${{ github.event.inputs.test-tag }} PASSED successfully. | |
| Console: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_CONSOLE_URL }} | |
| - name: Notify Mattermost - Maestro Tests FAILURES or ISSUES DETECTED | |
| # Condition: Our script detected 'failure' OR the Maestro action itself reported failure | |
| if: always() && (steps.analyze-flow-results.outputs.flow_summary_status == 'failure' || steps.release-tests.conclusion == 'failure') | |
| uses: duckduckgo/native-github-asana-sync@v2.0 | |
| with: | |
| action: 'send-mattermost-message' | |
| mattermost-token: ${{ secrets.MM_AUTH_TOKEN }} | |
| mattermost-team-id: ${{ secrets.MM_TEAM_ID }} | |
| mattermost-channel-name: ${{ vars.MM_RELEASE_NOTIFY_CHANNEL }} | |
| mattermost-message: | | |
| ${{env.emoji_failure}} Release ${{ github.event.inputs.app-version }}: Tests for tag ${{ github.event.inputs.test-tag }} FAILED or encountered issues. | |
| Console: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_CONSOLE_URL }} | |
| - name: Notify Mattermost - Maestro Tests CANCELED Flows Present (Informational or Warning) | |
| # Condition: Our script detected 'canceled_present' AND no critical 'failure' was found | |
| # AND Maestro action itself didn't mark the whole run as a 'failure' | |
| if: always() && steps.analyze-flow-results.outputs.flow_summary_status == 'canceled_present' && steps.release-tests.conclusion != 'failure' | |
| uses: duckduckgo/native-github-asana-sync@v2.0 | |
| with: | |
| action: 'send-mattermost-message' | |
| mattermost-token: ${{ secrets.MM_AUTH_TOKEN }} | |
| mattermost-team-id: ${{ secrets.MM_TEAM_ID }} | |
| mattermost-channel-name: ${{ vars.MM_RELEASE_NOTIFY_CHANNEL }} | |
| mattermost-message: | | |
| :warning: Release ${{ github.event.inputs.app-version }}: Some tests for tag ${{ github.event.inputs.test-tag }} were CANCELED. Please review. | |
| Console: ${{ steps.release-tests.outputs.MAESTRO_CLOUD_CONSOLE_URL }} | |
| - name: Create Asana task when workflow failed | |
| if: ${{ failure() }} | |
| id: create-failure-task | |
| uses: duckduckgo/native-github-asana-sync@v2.0 | |
| with: | |
| asana-pat: ${{ secrets.ASANA_ACCESS_TOKEN }} | |
| asana-project: ${{ vars.GH_ANDROID_APP_PROJECT_ID }} | |
| asana-section: ${{ vars.GH_ANDROID_APP_INCOMING_SECTION_ID }} | |
| asana-task-name: GH Workflow Failure - Tag Android Release (Robin) | |
| asana-task-description: Run Release Tests in Maestro has failed. See https://github.com/duckduckgo/Android/actions/runs/${{ github.run_id }} | |
| action: 'create-asana-task' |