Skip to content

Commit

Permalink
Update CI script
Browse files Browse the repository at this point in the history
  • Loading branch information
mojganii committed Oct 24, 2024
1 parent 1521f28 commit 0420b0a
Show file tree
Hide file tree
Showing 4 changed files with 206 additions and 179 deletions.
109 changes: 49 additions & 60 deletions .github/actions/build-ios-e2e-tests/action.yml
Original file line number Diff line number Diff line change
@@ -1,85 +1,74 @@
name: 'Build iOS end to end tests action'
description: 'Prepares and builds end to end tests on iOS device'
---
name: Build iOS end-to-end tests action
description: Prepares and builds end-to-end tests on an iOS device
inputs:
ios_device_pin_code:
description: 'iOS Device Pin Code'
description: iOS Device Pin Code
required: true
test_device_identifier_uuid:
description: 'Test Device Identifier UUID'
description: Test Device Identifier UUID
required: true
has_time_account_number:
description: 'Has Time Account Number'
description: Has Time Account Number
required: true
no_time_account_number:
description: 'No Time Account Number'
description: No Time Account Number
required: true
test_device_udid:
description: 'Test Device UDID'
description: Test Device UDID
required: true
partner_api_token:
description: 'Partner API Token'
description: Partner API Token
required: true
test_name:
description: 'Test case/suite name. Will run all tests in the test plan if not provided.'
description: Test case/suite name. Will run all tests in the test plan if not provided.
required: false
outputs_path:
description: 'Path to store outputs. This should be unique for each job run in order to avoid concurrency issues.'
description: Path to store outputs. This should be unique for each job run in order to avoid concurrency issues.
required: true
base_directory:
description: Base directory for the working paths. Defaults to the current directory (".").
required: false
default: .

runs:
using: 'composite'
using: composite
steps:
- name: Configure Xcode project
- name: Set working-directory or default
id: set-working-directory
run: |
for file in *.xcconfig.template ; do cp $file ${file//.template/} ; done
sed -i "" "/^HAS_TIME_ACCOUNT_NUMBER/d" UITests.xcconfig
sed -i "" "/^NO_TIME_ACCOUNT_NUMBER/d" UITests.xcconfig
sed -i "" \
"/IOS_DEVICE_PIN_CODE =/ s/= .*/= $IOS_DEVICE_PIN_CODE/" \
UITests.xcconfig
sed -i "" \
"/TEST_DEVICE_IDENTIFIER_UUID =/ s/= .*/= $TEST_DEVICE_IDENTIFIER_UUID/" \
UITests.xcconfig
sed -i "" \
"s#^// PARTNER_API_TOKEN =#PARTNER_API_TOKEN =#" \
UITests.xcconfig
sed -i "" \
"/PARTNER_API_TOKEN =/ s#= .*#= $PARTNER_API_TOKEN#" \
UITests.xcconfig
sed -i "" \
"/ATTACH_APP_LOGS_ON_FAILURE =/ s#= .*#= 1#" \
UITests.xcconfig
sed -i "" \
"/TEST_DEVICE_IS_IPAD =/ s#= .*#= 0#" \
UITests.xcconfig
sed -i "" \
"/UNINSTALL_APP_IN_TEST_SUITE_TEAR_DOWN =/ s#= .*#= 0#" \
UITests.xcconfig
if [ -z "${{ inputs.base_directory }}" ]; then
echo "base_directory=." >> $GITHUB_ENV
else
echo "base_directory=${{ inputs.base_directory }}" >> $GITHUB_ENV
fi
shell: bash
working-directory: ios/Configurations
env:
IOS_DEVICE_PIN_CODE: ${{ inputs.ios_device_pin_code }}
TEST_DEVICE_IDENTIFIER_UUID: ${{ inputs.test_device_identifier_uuid }}
HAS_TIME_ACCOUNT_NUMBER: ${{ inputs.has_time_account_number }}
NO_TIME_ACCOUNT_NUMBER: ${{ inputs.no_time_account_number }}
PARTNER_API_TOKEN: ${{ inputs.partner_api_token }}

- name: Build app and tests for testing
- name: Configure Xcode project
run: |
if [ -n "$TEST_NAME" ]; then
TEST_NAME_ARGUMENT=" -only-testing $TEST_NAME"
else
TEST_NAME_ARGUMENT=""
fi
set -o pipefail && env NSUnbufferedIO=YES xcodebuild \
-project MullvadVPN.xcodeproj \
-scheme MullvadVPNUITests \
-testPlan MullvadVPNUITestsAll $TEST_NAME_ARGUMENT \
-destination "platform=iOS,id=$TEST_DEVICE_UDID" \
-derivedDataPath derived-data \
clean build-for-testing 2>&1
for file in *.xcconfig.template; do cp $file ${file//.template/}; done
sed -i "" "/^HAS_TIME_ACCOUNT_NUMBER/d" UITests.xcconfig
sed -i "" "/^NO_TIME_ACCOUNT_NUMBER/d" UITests.xcconfig
sed -i "" \
"/IOS_DEVICE_PIN_CODE =/ s/= .*/= $IOS_DEVICE_PIN_CODE/" \
UITests.xcconfig
sed -i "" \
"/TEST_DEVICE_IDENTIFIER_UUID =/ s/= .*/= $TEST_DEVICE_IDENTIFIER_UUID/" \
UITests.xcconfig
sed -i "" \
"s#^// PARTNER_API_TOKEN =#PARTNER_API_TOKEN =#" \
UITests.xcconfig
sed -i "" \
"/PARTNER_API_TOKEN =/ s#= .*#= $PARTNER_API_TOKEN#" \
UITests.xcconfig
sed -i "" \
"/ATTACH_APP_LOGS_ON_FAILURE =/ s#= .*#= 1#" \
UITests.xcconfig
sed -i "" \
"/TEST_DEVICE_IS_IPAD =/ s#= .*#= 0#" \
UITests.xcconfig
sed -i "" \
"/UNINSTALL_APP_IN_TEST_SUITE_TEAR_DOWN =/ s#= .*#= 0#" \
UITests.xcconfig
shell: bash
working-directory: ios/
env:
TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}
TEST_NAME: ${{ inputs.test_name }}
working-directory: ${{ env.base_directory }}/ios/
52 changes: 36 additions & 16 deletions .github/actions/run-ios-e2e-tests/action.yml
Original file line number Diff line number Diff line change
@@ -1,36 +1,51 @@
name: 'Run iOS end to end tests action'
description: 'Runs end to end tests on iOS device'
---
name: Run iOS end-to-end tests action
description: Runs end-to-end tests on iOS device
inputs:
test_name:
description: 'Test case/suite name. Will run all tests in the test plan if not provided.'
description: Test case/suite name. Will run all tests in the test plan if not provided.
required: false
test_device_udid:
description: 'Test Device UDID'
description: Test Device UDID
required: true
outputs_path:
description: >
Path to where outputs are stored - both build outputs and outputs from running tests.
This should be unique for each job run in order to avoid concurrency issues.
Path to where outputs are stored - both build outputs and outputs
from running tests. This should be unique for each job run in order to
avoid concurrency issues.
required: true
base_directory:
description: Base directory for the working paths.
required: false
default: .

runs:
using: 'composite'
using: composite
steps:
# Set up a unique output directory
- name: Set base directory or default
id: set-base-directory
run: |
if [ -z "${{ inputs.base_directory }}" ]; then
echo "base_directory=." >> $GITHUB_ENV
else
echo "base_directory=${{ inputs.base_directory }}" >> $GITHUB_ENV
fi
shell: bash

- name: Set up outputs directory
run: |
# Forcing the filesystem buffers to be flushed to ensure the
# directory tree is updated
sync
if [ -n "$TEST_NAME" ]; then
# Strip slashes to avoid creating subdirectories
test_name_sanitized=$(printf "$TEST_NAME" | sed 's/\//_/g')
echo "Setting output directory tests-output-test-name-sanitized"
echo "$test_name_sanitized"
test_output_directory="${{ env.OUTPUTS_PATH }}/tests-output-$test_name_sanitized"
echo "Setting output directory: tests-output-$test_name_sanitized"
test_output_directory="${{ inputs.outputs_path }}/tests-output-$test_name_sanitized"
else
echo "Setting output directory output"
test_output_directory="${{ env.OUTPUTS_PATH }}/tests-output"
echo "Setting output directory: tests-output"
test_output_directory="${{ inputs.outputs_path }}/tests-output"
fi
echo "TEST_OUTPUT_DIRECTORY=$test_output_directory" >> $GITHUB_ENV
Expand All @@ -41,21 +56,26 @@ runs:
OUTPUTS_PATH: ${{ inputs.outputs_path }}

- name: Uninstall app
run: ios-deploy --id $TEST_DEVICE_UDID --uninstall_only --bundle_id net.mullvad.MullvadVPN
run: |
echo "Uninstalling app from device with UDID: $TEST_DEVICE_UDID"
ios-deploy --id $TEST_DEVICE_UDID --uninstall_only --bundle_id net.mullvad.MullvadVPN
shell: bash
env:
TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}

- name: Run end-to-end-tests
- name: Run end-to-end tests
run: |
# Forcing the filesystem buffers to be flushed to ensure the
# directory tree is updated
sync
if [ -n "$TEST_NAME" ]; then
TEST_NAME_ARGUMENT=" -only-testing $TEST_NAME"
else
TEST_NAME_ARGUMENT=""
fi
echo "Running end-to-end tests in directory: ${{ env.base_directory }}/mullvadvpn-app/ios"
set -o pipefail && env NSUnbufferedIO=YES xcodebuild \
-project MullvadVPN.xcodeproj \
-scheme MullvadVPNUITests \
Expand All @@ -66,7 +86,7 @@ runs:
test-without-building 2>&1 | xcbeautify --report junit \
--report-path ${{ env.TEST_OUTPUT_DIRECTORY }}/junit-test-report
shell: bash
working-directory: ${{ inputs.outputs_path }}/mullvadvpn-app/ios
working-directory: ${{ env.base_directory }}/mullvadvpn-app/ios
env:
TEST_NAME: ${{ inputs.test_name }}
TEST_DEVICE_UDID: ${{ inputs.test_device_udid }}
Expand Down
50 changes: 27 additions & 23 deletions .github/workflows/ios-end-to-end-tests-settings-migration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,88 +3,92 @@ name: iOS settings migration tests
concurrency:
group: ios-end-to-end-tests
cancel-in-progress: false

permissions:
contents: read
issues: write
pull-requests: write

on:
workflow_dispatch:
workflow_dispatch: {}
schedule:
# At midnight every day.
# Notifications for scheduled workflows are sent to the user who last modified the cron
# syntax in the workflow file. If you update this you must have notifications for
# Github Actions enabled, so these don't go unnoticed.
# https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/notifications-for-workflow-runs
- cron: '0 0 * * *'
- cron: '0 0 * * *' # At midnight every day.

env:
TEST_DEVICE_UDID: 00008130-0019181022F3803A
OLD_APP_COMMIT_HASH: 895b7d98825e678f5d7023d5ea3c9b7beee89280
OLD_APP_COMMIT_HASH: f82b90126441e9f8afa8c820faa0e5b2c99ecc3e

jobs:
checkout_old_version:
name: Checkout Old Repository Version
checkout_version:
name: Checkout Current Repository Version
runs-on:
- self-hosted
- macOS
- ios-test
steps:
- name: Checkout old repository version
- name: Checkout current repository
uses: actions/checkout@v4
with:
ref: ${{ env.OLD_APP_COMMIT_HASH }}

configure_rust:
name: Configure Rust
runs-on:
- self-hosted
- macOS
- ios-test
needs: checkout_old_version
needs: checkout_version
steps:
- name: Configure Rust
uses: actions-rs/[email protected]
with:
toolchain: stable
override: true
target: aarch64-apple-ios

uninstall_app:
name: Uninstall Old App
name: Uninstall App
runs-on:
- self-hosted
- macOS
- ios-test
needs: checkout_old_version
needs: checkout_version
steps:
- name: Uninstall old app
timeout-minutes: 5
run: ios-deploy --id ${{ env.TEST_DEVICE_UDID }} --uninstall_only --bundle_id
net.mullvad.MullvadVPN
run: ios-deploy --id ${{ env.TEST_DEVICE_UDID }} --uninstall_only --bundle_id net.mullvad.MullvadVPN

change_dns_settings:
name: Change DNS Settings on Old App Version
needs:
- checkout_old_version
- checkout_version
- configure_rust
- uninstall_app
uses: mullvad/mullvadvpn-app/.github/workflows/ios-end-to-end-tests.yml@main
uses: ./.github/workflows/ios-end-to-end-tests.yml
with:
arg_tests_json_key: "MullvadVPNUITestsChangeDNSSettings"
commit_hash: ${{ env.OLD_APP_COMMIT_HASH }}
secrets: inherit

verify_dns_settings:
name: Verify DNS Settings Still Changed on Current App Version
needs: change_dns_settings
uses: mullvad/mullvadvpn-app/.github/workflows/ios-end-to-end-tests.yml@main
uses: ./.github/workflows/ios-end-to-end-tests.yml
with:
arg_tests_json_key: "MullvadVPNUITestsVerifyDNSSettingsChanged"
secrets: inherit

change_other_settings:
name: Change All Other Settings on Old App Version
needs: verify_dns_settings
uses: mullvad/mullvadvpn-app/.github/workflows/ios-end-to-end-tests.yml@main
uses: ./.github/workflows/ios-end-to-end-tests.yml
with:
arg_tests_json_key: "MullvadVPNUITestsChangeSettings"
commit_hash: ${{ env.OLD_APP_COMMIT_HASH }}
secrets: inherit

verify_other_settings:
name: Verify All Other Settings Still Changed on Current App Version
needs: change_other_settings
uses: mullvad/mullvadvpn-app/.github/workflows/ios-end-to-end-tests.yml@main
uses: ./.github/workflows/ios-end-to-end-tests.yml
with:
arg_tests_json_key: "MullvadVPNUITestsVerifySettingsChanged"
secrets: inherit
Loading

0 comments on commit 0420b0a

Please sign in to comment.