Skip to content

iOS end-to-end tests #970

iOS end-to-end tests

iOS end-to-end tests #970

---
name: iOS end-to-end tests
env:
TEST_DEVICE_UDID: 00008130-0019181022F3803A
permissions:
contents: read
issues: write
pull-requests: write
on:
workflow_call:
inputs:
arg_tests_json_key:
type: string
required: false
commit_hash:
type: string
required: false
workflow_dispatch:
inputs:
user_supplied_test_name:
description: 'Only run test case/suite'
required: false
jobs:
set-up-outputs-directory:
name: Set up outputs directory
runs-on: [self-hosted, macOS, ios-test]
outputs:
job_outputs_directory: ${{ steps.set-up-job-outputs-directory.outputs.job_outputs_directory }}
steps:
- name: Set up job outputs directory
id: set-up-job-outputs-directory
run: |
job_outputs_directory="$HOME/workflow-outputs/job-outputs-${{ github.run_id }}"
echo "job_outputs_directory=$job_outputs_directory" >> "$GITHUB_OUTPUT"
mkdir -p "$job_outputs_directory"
shell: bash
build:
name: Build for end-to-end testing
runs-on: [self-hosted, macOS, ios-test]
needs: set-up-outputs-directory
timeout-minutes: 20
steps:
- name: Set commit hash or default to github.sha
id: set-commit-hash
run: |
if [ -z "${{ inputs.commit_hash }}" ]; then
echo "COMMIT_HASH=${{ github.sha }}" >> $GITHUB_ENV
else
echo "COMMIT_HASH=${{ inputs.commit_hash }}" >> $GITHUB_ENV
fi
shell: bash
- name: Create commit directory if it doesn't exist
id: create-commit-dir
run: |
COMMIT_DIR="$HOME/${{ env.COMMIT_HASH }}"
echo "COMMIT_DIR=$COMMIT_DIR"
if [ ! -d "$COMMIT_DIR" ]; then
echo "Directory $COMMIT_DIR does not exist. Creating it."
mkdir -p "$COMMIT_DIR"
else
echo "Directory $COMMIT_DIR already exists."
fi
shell: bash
- name: Checkout repository to commit directory
uses: actions/checkout@v4
with:
clean: true
fetch-depth: 1
ref: ${{ env.COMMIT_HASH }}
path: $HOME/${{ env.COMMIT_HASH }}
- name: Show checkout directory
run: |
echo "Repository checked out to: $HOME/${{ env.COMMIT_HASH }}"
ls -R $HOME/${{ env.COMMIT_HASH }} # List files to verify contents
- name: Configure Rust
uses: actions-rs/[email protected]
with:
toolchain: stable
override: true
target: aarch64-apple-ios
- name: Build iOS end-to-end tests action
uses: ./.github/actions/build-ios-e2e-tests
with:
test_name: ${{ github.event.inputs.user_supplied_test_name }}
ios_device_pin_code: ${{ secrets.IOS_DEVICE_PIN_CODE }}
test_device_identifier_uuid: ${{ secrets.IOS_TEST_DEVICE_IDENTIFIER_UUID }}
has_time_account_number: ${{ secrets.IOS_HAS_TIME_ACCOUNT_NUMBER_PRODUCTION }}
no_time_account_number: ${{ secrets.IOS_NO_TIME_ACCOUNT_NUMBER_PRODUCTION }}
test_device_udid: ${{ env.TEST_DEVICE_UDID }}
partner_api_token: ${{ secrets.STAGEMOLE_PARTNER_AUTH }}
outputs_path: ${{ needs.set-up-outputs-directory.outputs.job_outputs_directory }}
base_directory: $HOME/${{ env.COMMIT_HASH }}
- name: Debug print job output directory
run: |
echo "Job output directory: ${{ needs.set-up-outputs-directory.outputs.job_outputs_directory }}"
shell: bash
- name: Copy build output and project to output directory
run: |
JOB_OUTPUTS_DIRECTORY="${{ needs.set-up-outputs-directory.outputs.job_outputs_directory }}"
mkdir -p "$JOB_OUTPUTS_DIRECTORY/derived-data"
cp -R $HOME/${{ env.COMMIT_HASH }}/ios/derived-data "$JOB_OUTPUTS_DIRECTORY"
cp -R $HOME/${{ env.COMMIT_HASH }} "$JOB_OUTPUTS_DIRECTORY/mullvadvpn-app"
shell: bash
- name: Clean up
run: |
rm -rf $HOME/${{ env.COMMIT_HASH }}/ios/Configurations/*.xcconfig
rm -rf $HOME/${{ env.COMMIT_HASH }}/ios/derived-data
shell: bash
test:
name: Run tests
runs-on: [self-hosted, macOS, ios-test]
needs: [build, set-up-outputs-directory]
timeout-minutes: 60
steps:
- name: Run iOS end-to-end tests action
uses: ./.github/actions/run-ios-e2e-tests
with:
test_name: "MullvadVPNUITests/${{ matrix.test_suite }}"
test_device_udid: ${{ env.TEST_DEVICE_UDID }}
outputs_path: ${{ needs.set-up-outputs-directory.outputs.job_outputs_directory }}
base_directory: $HOME/${{ env.COMMIT_HASH }}
clean-up-outputs-directory:
if: always()
name: Clean up outputs directory
runs-on: [self-hosted, macOS, ios-test]
needs: [test, set-up-outputs-directory]
steps:
- name: Clean up outputs directory
run: rm -rf ${{ needs.set-up-outputs-directory.outputs.job_outputs_directory }}
shell: bash
notify-on-failure:
if: failure() && github.event_name == 'pull_request'
name: Notify team on failure (if PR related)
runs-on: [self-hosted, macOS, ios-test]
needs: test
timeout-minutes: 5
steps:
- name: Comment PR on test failure
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue_number = context.issue.number;
const run_id = context.runId;
const run_url = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${run_id}`;
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
body: `🚨 End-to-end tests failed. Please check the [failed workflow run](${run_url}).`
});