# Can be used to run Detox E2E tests on pull requests for the Mattermost mobile app with low bandwidth # by using 'E2E iOS tests for PR (LBW 1)' instead. name: E2E on: pull_request: branches: - main types: - labeled concurrency: group: "${{ github.workflow }}-${{ github.event.pull_request.number }}-${{ github.event.label.name }}" cancel-in-progress: true env: INTUNE_ENABLED: 'true' jobs: update-initial-status-ios: if: contains(github.event.label.name, 'E2E iOS tests for PR') runs-on: ubuntu-22.04 steps: - uses: mattermost/actions/delivery/update-commit-status@main if: contains(github.event.label.name, 'E2E iOS tests for PR') env: GITHUB_TOKEN: ${{ github.token }} with: repository_full_name: ${{ github.repository }} commit_sha: ${{ github.event.pull_request.head.sha }} context: e2e/detox-ios-tests description: Detox iOS tests for mattermost mobile app have started ... status: pending update-initial-status-android: runs-on: ubuntu-22.04 if: contains(github.event.label.name, 'E2E Android tests for PR') steps: - uses: mattermost/actions/delivery/update-commit-status@main env: GITHUB_TOKEN: ${{ github.token }} with: repository_full_name: ${{ github.repository }} commit_sha: ${{ github.event.pull_request.head.sha }} context: e2e/detox-android-tests description: Detox Android tests for mattermost mobile app have started ... status: pending build-ios-simulator: if: contains(github.event.label.name, 'E2E iOS tests for PR') runs-on: macos-26 needs: - update-initial-status-ios steps: - name: Checkout Repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Prepare iOS Build uses: ./.github/actions/prepare-ios-build with: intune-enabled: ${{ env.INTUNE_ENABLED }} intune-ssh-private-key: ${{ secrets.MM_MOBILE_INTUNE_DEPLOY_KEY }} - name: Set .env with RUNNING_E2E=true run: | echo "RUNNING_E2E=true" > .env - name: Build iOS Simulator env: TAG: "${{ github.event.pull_request.head.sha }}" GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" run: bundle exec fastlane ios simulator --env ios.simulator skip_upload_to_s3_bucket:true working-directory: ./fastlane - name: Upload iOS Simulator Build uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-*.app.zip build-android-apk: runs-on: ubuntu-latest-8-cores if: contains(github.event.label.name, 'E2E Android tests for PR') needs: - update-initial-status-android env: ORG_GRADLE_PROJECT_jvmargs: -Xmx8g steps: - name: Prune Docker to free up space run: docker system prune -af - name: Remove npm Temporary Files run: | rm -rf ~/.npm/_cacache - name: Checkout Repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Prepare Android Build uses: ./.github/actions/prepare-android-build env: STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - name: Install Dependencies run: sudo apt-get clean && sudo apt-get update && sudo apt-get install -y default-jdk - name: Detox build run: | cd detox npm install npm install -g detox-cli npm run e2e:android-inject-settings npm run e2e:android-build - name: Upload Android Build uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: android-build-files-${{ github.run_id }} path: "android/app/build/**/*" run-ios-tests-on-pr: if: contains(github.event.label.name, 'E2E iOS tests for PR') name: iOS uses: ./.github/workflows/e2e-ios-template.yml needs: - build-ios-simulator with: run-type: "PR" MOBILE_VERSION: ${{ github.event.pull_request.head.sha }} low_bandwidth_mode: ${{ contains(github.event.label.name,'LBW') && true || false }} secrets: inherit run-android-tests-on-pr: if: contains(github.event.label.name, 'E2E Android tests for PR') name: Android uses: ./.github/workflows/e2e-android-template.yml needs: - build-android-apk with: run-android-tests: true run-type: "PR" MOBILE_VERSION: ${{ github.event.pull_request.head.sha }} secrets: inherit update-final-status-ios: runs-on: ubuntu-22.04 if: contains(github.event.label.name, 'E2E iOS tests for PR') needs: - run-ios-tests-on-pr steps: - uses: mattermost/actions/delivery/update-commit-status@main env: GITHUB_TOKEN: ${{ github.token }} with: repository_full_name: ${{ github.repository }} commit_sha: ${{ github.event.pull_request.head.sha }} context: e2e/detox-ios-tests description: Completed with ${{ needs.run-ios-tests-on-pr.outputs.FAILURES }} failures status: ${{ needs.run-ios-tests-on-pr.outputs.STATUS }} target_url: ${{ needs.run-ios-tests-on-pr.outputs.TARGET_URL }} update-final-status-android: runs-on: ubuntu-22.04 if: contains(github.event.label.name, 'E2E Android tests for PR') needs: - run-android-tests-on-pr steps: - uses: mattermost/actions/delivery/update-commit-status@main env: GITHUB_TOKEN: ${{ github.token }} with: repository_full_name: ${{ github.repository }} commit_sha: ${{ github.event.pull_request.head.sha }} context: e2e/detox-android-tests description: Completed with ${{ needs.run-android-tests-on-pr.outputs.FAILURES }} failures status: ${{ needs.run-android-tests-on-pr.outputs.STATUS }} target_url: ${{ needs.run-android-tests-on-pr.outputs.TARGET_URL }} e2e-remove-ios-label: runs-on: ubuntu-22.04 needs: - run-ios-tests-on-pr steps: - name: e2e/remove-label-from-pr uses: actions/github-script@e7aeb8c663f696059ebb5f9ab1425ed2ef511bdb # v7.0.1 continue-on-error: true # Label might have been removed manually with: script: | const iosLabel = 'E2E iOS tests for PR'; context.payload.pull_request.labels.forEach(label => { if (label.name.includes(iosLabel)) { github.rest.issues.removeLabel({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, name: label.name, }); } }); e2e-remove-android-label: runs-on: ubuntu-22.04 needs: - run-android-tests-on-pr steps: - name: e2e/remove-label-from-pr uses: actions/github-script@e7aeb8c663f696059ebb5f9ab1425ed2ef511bdb # v7.0.1 continue-on-error: true # Label might have been removed manually with: script: | const androidLabel = 'E2E Android tests for PR'; context.payload.pull_request.labels.forEach(label => { if (label.name.includes(androidLabel)) { github.rest.issues.removeLabel({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, name: label.name, }); } });