release: generate build artifacts prior to release #670
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Testing E2E iOS | |
on: | |
workflow_dispatch: | |
pull_request: | |
paths-ignore: | |
- 'docs/**' | |
- '**/*.md' | |
push: | |
branches: | |
- main | |
paths-ignore: | |
- 'docs/**' | |
- '**/*.md' | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
ios: | |
name: iOS | |
runs-on: macos-14-xlarge | |
# TODO matrix across APIs, at least 10 and 13 (lowest to highest) | |
timeout-minutes: 100 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 50 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: maxim-lobanov/setup-xcode@v1 | |
with: | |
xcode-version: 'latest-stable' | |
- name: Start Simulator | |
# The first time you try to `yarn run:ios` after xcode-select, it fails, so get it out of the way... | |
# ...also we need to directly grant notification permission | |
continue-on-error: true | |
run: xcrun simctl boot "iPhone 16" | |
# Set path variables needed for caches | |
- name: Set workflow variables | |
id: workflow-variables | |
run: | | |
echo "yarn-cache=$(yarn cache dir)" >> $GITHUB_OUTPUT | |
echo "metro-cache=$HOME/.metro" >> $GITHUB_OUTPUT | |
- uses: actions/cache@v4 | |
name: Yarn Cache | |
id: yarn-cache | |
with: | |
path: ${{ steps.workflow-variables.outputs.yarn-cache }} | |
key: ${{ runner.os }}-yarn-v1-${{ hashFiles('package.json', 'packages/react-native/package.json', 'tests_react_native/package.json') }} | |
restore-keys: ${{ runner.os }}-yarn-v1 | |
- uses: actions/cache@v4 | |
name: Cache Pods | |
with: | |
path: tests_react_native/ios/Pods | |
key: ${{ runner.os }}-pods-v2-${{ hashFiles('tests_react_native/ios/Podfile.lock') }} | |
restore-keys: ${{ runner.os }}-pods-v2 | |
- name: Setup Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
ruby-version: 3 | |
- name: Update Ruby build tools | |
uses: nick-fields/retry@v3 | |
with: | |
timeout_minutes: 2 | |
retry_wait_seconds: 60 | |
max_attempts: 3 | |
command: gem update cocoapods xcodeproj | |
- name: Yarn Install | |
uses: nick-fields/retry@v3 | |
with: | |
timeout_minutes: 15 | |
retry_wait_seconds: 60 | |
max_attempts: 4 | |
command: yarn --no-audit --prefer-offline && npm i -g cavy-cli | |
- name: Install applesimutils | |
uses: nick-fields/retry@v3 | |
with: | |
timeout_minutes: 10 | |
retry_wait_seconds: 60 | |
max_attempts: 3 | |
command: HOMEBREW_NO_AUTO_UPDATE=1 brew tap wix/brew && HOMEBREW_NO_AUTO_UPDATE=1 brew install applesimutils && applesimutils --list | |
- name: Prepare test index file | |
# For some reason, in CI, the test file is never running. So let's make all index files the test file. | |
run: cp tests_react_native/index.test.js tests_react_native/index.js | |
- name: Metro Bundler Cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ steps.workflow-variables.outputs.metro-cache }} | |
key: ${{ runner.os }}-metro-v1-${{ github.run_id }} | |
restore-keys: ${{ runner.os }}-metro-v1 | |
- name: Pre-fetch Javascript bundle | |
run: | | |
nohup sh -c "yarn tests_rn:packager > packager.log 2>&1 &" | |
printf 'Waiting for packager to come online' | |
until curl --output /dev/null --silent --head --fail http://localhost:8081/status; do | |
printf '.' | |
sleep 2 | |
done | |
echo "Packager is online! Preparing bundle..." | |
curl --output /dev/null --silent --head --fail "http://localhost:8081/index.bundle?platform=ios&dev=true&minify=false&inlineSourceMap=true" | |
echo "...javascript bundle ready" | |
- uses: hendrikmuhs/ccache-action@v1 | |
name: Xcode Compile Cache | |
with: | |
key: ${{ runner.os }}-v2 # makes a unique key w/related restore key internally | |
max-size: 400M | |
- name: Grant Notification Permission | |
run: applesimutils --booted --setPermissions notifications=YES --bundle com.notifee.testing | |
- name: Record App Video | |
# It seems to take about a minute (based on video recording) for the Simulator to be back up and stable | |
run: sleep 60 && nohup sh -c "xcrun simctl io booted recordVideo --codec=h264 -f simulator.mp4 2>&1 &" | |
- name: Create Simulator Log | |
# With a little delay, missing the first part of boot is fine, it will still capture app issues | |
run: nohup sh -c "xcrun simctl spawn booted log stream --level debug --style compact > simulator.log 2>&1 &" | |
- name: E2E Test | |
timeout-minutes: 30 | |
run: | | |
export PATH="/opt/homebrew/opt/ccache/libexec:$PATH" | |
export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros | |
export CCACHE_FILECLONE=true | |
export CCACHE_DEPEND=true | |
export CCACHE_INODECACHE=true | |
ccache -s | |
yarn tests_rn:ios:test | |
ccache -s | |
- name: Stop App Video | |
if: always() | |
run: killall -INT simctl | |
- name: Upload App Video | |
uses: actions/upload-artifact@v4 | |
continue-on-error: true | |
if: always() | |
with: | |
name: simulator_video | |
path: simulator.mp4 | |
- name: Upload Simulator Log | |
uses: actions/upload-artifact@v4 | |
continue-on-error: true | |
if: always() | |
with: | |
name: simulator_logs | |
path: simulator.log | |
- name: Upload Packager Log | |
uses: actions/upload-artifact@v4 | |
continue-on-error: true | |
if: always() | |
with: | |
name: packager_log | |
path: packager.log | |
- uses: codecov/codecov-action@v4 | |
with: | |
verbose: true |