mirror of
https://github.com/mattermost/mattermost-mobile.git
synced 2026-11-05 18:38:54 +00:00
Based on the later commits (after the earlier experimentation and reversions), the meaningful end state of the PR is: **Summary:** Improve E2E CI reliability, performance, and security by introducing robust build caching with safe fingerprinting and cache isolation, duration-based test sharding with graceful fallbacks, more reliable E2E impact detection and status handling, stronger cancellation/concurrency behavior, multiple iOS Detox stability fixes, and hardening GitHub Actions to avoid executing PR-authored code. Also includes CI fixes for iOS builds and a temporary Android E2E test skip for a known regression. --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Mattermost Build <build@mattermost.com>
148 lines
6.8 KiB
YAML
148 lines
6.8 KiB
YAML
# Detox E2E test runs — reusable workflow only.
|
|
# Called from e2e-detox-pr.yml after shared builds and server provisioning complete.
|
|
# App artifacts (ios-build-simulator-*, android-build-files-*) are uploaded by
|
|
# the parent workflow; templates download them via artifact_run_id.
|
|
name: Detox E2E
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
MOBILE_VERSION:
|
|
required: true
|
|
type: string
|
|
PLATFORM:
|
|
required: false
|
|
type: string
|
|
default: "both"
|
|
ANDROID_SITE_1_URL:
|
|
required: true
|
|
type: string
|
|
ANDROID_SITE_2_URL:
|
|
required: true
|
|
type: string
|
|
IOS_SITE_1_URL:
|
|
required: true
|
|
type: string
|
|
IOS_SITE_2_URL:
|
|
required: true
|
|
type: string
|
|
SITE_3_URL:
|
|
required: true
|
|
type: string
|
|
run_type:
|
|
required: false
|
|
type: string
|
|
default: "PR"
|
|
artifact_run_id:
|
|
description: "Run ID of the parent workflow that uploaded build artifacts"
|
|
required: true
|
|
type: string
|
|
tsio-job-configs:
|
|
description: "JSON map of per-platform TSIO configs from parent calculate-tsio-identity"
|
|
required: true
|
|
type: string
|
|
|
|
permissions:
|
|
contents: read
|
|
id-token: write
|
|
actions: read
|
|
statuses: write
|
|
# Nested template finalize reads PR labels to honour E2E/Override.
|
|
issues: read
|
|
|
|
env:
|
|
ARTIFACT_RUN_ID: ${{ inputs.artifact_run_id }}
|
|
|
|
jobs:
|
|
run-ios-tests:
|
|
if: inputs.PLATFORM == 'ios' || inputs.PLATFORM == 'both'
|
|
name: iOS
|
|
uses: ./.github/workflows/e2e-ios-template.yml
|
|
with:
|
|
run-type: ${{ inputs.run_type || 'PR' }}
|
|
tsio-config: ${{ toJSON(fromJSON(inputs.tsio-job-configs)['detox-ios']) }}
|
|
tsio-shard-name: detox-ios
|
|
durations_key: detox-ios
|
|
record_tests_in_zephyr: ${{ inputs.run_type == 'RELEASE' || inputs.run_type == 'MAIN' || inputs.run_type == 'MASTER' }}
|
|
MOBILE_VERSION: ${{ inputs.MOBILE_VERSION }}
|
|
MM_TEST_SERVER_URL: ${{ inputs.IOS_SITE_1_URL }}
|
|
MM_TEST_SERVER_URL_2: ${{ inputs.IOS_SITE_2_URL }}
|
|
MM_TEST_SERVER_URL_3: ${{ inputs.SITE_3_URL }}
|
|
artifact_run_id: ${{ inputs.artifact_run_id }}
|
|
secrets:
|
|
MM_MOBILE_E2E_ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }}
|
|
MM_MOBILE_E2E_ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }}
|
|
MM_MOBILE_E2E_ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }}
|
|
MM_MOBILE_E2E_ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }}
|
|
MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }}
|
|
MM_MOBILE_E2E_WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }}
|
|
MM_E2E_MASTER_HEALTH_WEBHOOK_URL: ${{ secrets.MM_E2E_MASTER_HEALTH_WEBHOOK_URL }}
|
|
MM_E2E_RELEASE_WEBHOOK_URL: ${{ secrets.MM_E2E_RELEASE_WEBHOOK_URL }}
|
|
MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }}
|
|
MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }}
|
|
MM_MOBILE_E2E_WEBHOOK_PUBLIC_BASE_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_PUBLIC_BASE_URL }}
|
|
MM_MOBILE_E2E_CLOUDFLARED_TUNNEL_TOKEN: ${{ secrets.MM_MOBILE_E2E_CLOUDFLARED_TUNNEL_TOKEN }}
|
|
|
|
run-android-tests:
|
|
if: inputs.PLATFORM == 'android' || inputs.PLATFORM == 'both'
|
|
name: Android
|
|
uses: ./.github/workflows/e2e-android-template.yml
|
|
with:
|
|
run-android-tests: true
|
|
run-type: ${{ inputs.run_type || 'PR' }}
|
|
tsio-config: ${{ toJSON(fromJSON(inputs.tsio-job-configs)['detox-android']) }}
|
|
tsio-shard-name: detox-android
|
|
durations_key: detox-android
|
|
record_tests_in_zephyr: ${{ inputs.run_type == 'RELEASE' || inputs.run_type == 'MAIN' || inputs.run_type == 'MASTER' }}
|
|
MOBILE_VERSION: ${{ inputs.MOBILE_VERSION }}
|
|
MM_TEST_SERVER_URL: ${{ inputs.ANDROID_SITE_1_URL }}
|
|
MM_TEST_SERVER_URL_2: ${{ inputs.ANDROID_SITE_2_URL }}
|
|
MM_TEST_SERVER_URL_3: ${{ inputs.SITE_3_URL }}
|
|
artifact_run_id: ${{ inputs.artifact_run_id }}
|
|
secrets:
|
|
MM_MOBILE_E2E_ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }}
|
|
MM_MOBILE_E2E_ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }}
|
|
MM_MOBILE_E2E_ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }}
|
|
MM_MOBILE_E2E_ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }}
|
|
MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }}
|
|
MM_MOBILE_E2E_WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }}
|
|
MM_E2E_MASTER_HEALTH_WEBHOOK_URL: ${{ secrets.MM_E2E_MASTER_HEALTH_WEBHOOK_URL }}
|
|
MM_E2E_RELEASE_WEBHOOK_URL: ${{ secrets.MM_E2E_RELEASE_WEBHOOK_URL }}
|
|
MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }}
|
|
MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }}
|
|
MM_MOBILE_E2E_WEBHOOK_PUBLIC_BASE_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_PUBLIC_BASE_URL }}
|
|
MM_MOBILE_E2E_CLOUDFLARED_TUNNEL_TOKEN: ${{ secrets.MM_MOBILE_E2E_CLOUDFLARED_TUNNEL_TOKEN }}
|
|
|
|
run-ios-ipad-tests:
|
|
if: inputs.PLATFORM == 'ios' || inputs.PLATFORM == 'both'
|
|
name: iOS iPad
|
|
uses: ./.github/workflows/e2e-ios-template.yml
|
|
with:
|
|
run-type: ${{ inputs.run_type || 'PR' }}
|
|
tsio-config: ${{ toJSON(fromJSON(inputs.tsio-job-configs)['detox-ipad']) }}
|
|
tsio-shard-name: detox-ipad
|
|
durations_key: detox-ipad
|
|
MOBILE_VERSION: ${{ inputs.MOBILE_VERSION }}
|
|
MM_TEST_SERVER_URL: ${{ inputs.IOS_SITE_1_URL }}
|
|
MM_TEST_SERVER_URL_2: ${{ inputs.IOS_SITE_2_URL }}
|
|
MM_TEST_SERVER_URL_3: ${{ inputs.SITE_3_URL }}
|
|
ios_device_name: "iPad Pro 13-inch (M5)"
|
|
ios_device_os_name: "iOS 26.2"
|
|
search_path: "detox/e2e/test/products/channels/ipad"
|
|
parallelism: "1"
|
|
detox_config: "ios.ipad.debug"
|
|
artifact_run_id: ${{ inputs.artifact_run_id }}
|
|
secrets:
|
|
MM_MOBILE_E2E_ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }}
|
|
MM_MOBILE_E2E_ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }}
|
|
MM_MOBILE_E2E_ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }}
|
|
MM_MOBILE_E2E_ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }}
|
|
MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }}
|
|
MM_MOBILE_E2E_WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }}
|
|
MM_E2E_MASTER_HEALTH_WEBHOOK_URL: ${{ secrets.MM_E2E_MASTER_HEALTH_WEBHOOK_URL }}
|
|
MM_E2E_RELEASE_WEBHOOK_URL: ${{ secrets.MM_E2E_RELEASE_WEBHOOK_URL }}
|
|
MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }}
|
|
MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }}
|
|
MM_MOBILE_E2E_WEBHOOK_PUBLIC_BASE_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_PUBLIC_BASE_URL }}
|
|
MM_MOBILE_E2E_CLOUDFLARED_TUNNEL_TOKEN: ${{ secrets.MM_MOBILE_E2E_CLOUDFLARED_TUNNEL_TOKEN }}
|