Skip to content

Ad-hoc Release Tests - Maestro Cloud #127

Ad-hoc Release Tests - Maestro Cloud

Ad-hoc Release Tests - Maestro Cloud #127

Workflow file for this run

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'