Skip to content

feat: migrate KeyboardStickyView to reanimated (#1307) #2118

feat: migrate KeyboardStickyView to reanimated (#1307)

feat: migrate KeyboardStickyView to reanimated (#1307) #2118

Workflow file for this run

name: 🛠 iOS e2e tests
on:
pull_request:
paths:
- ".github/workflows/ios-e2e-test.yml"
- "react-native-keyboard-controller.podspec"
- "package.json"
- "ios/**"
- "example/**"
- "e2e/**"
- "src/**"
push:
branches:
- main
paths:
- ".github/workflows/ios-e2e-test.yml"
- "react-native-keyboard-controller.podspec"
- "package.json"
- "ios/**"
- "example/**"
- "e2e/**"
- "src/**"
concurrency:
group: ios-e2e-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: 🏗️ Build E2E ipa (Xcode ${{ matrix.config.xcode }})
runs-on: macos-${{ matrix.config.macos }}
timeout-minutes: 60
env:
WORKING_DIRECTORY: example
strategy:
matrix:
config: [{ xcode: "16.4", macos: 15 }, { xcode: "26.1", macos: 26 }]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20.x
cache: "yarn"
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ matrix.config.xcode }}
- name: Get Xcode version
run: xcodebuild -version
- name: Save yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Restore node_modules from cache
uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install root dependencies
run: yarn install
- name: Install example project dependencies
working-directory: ${{ env.WORKING_DIRECTORY }}
run: yarn
- name: Install e2e dependencies
run: yarn install --cwd e2e
- name: Install Ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
max-size: 1.5G
key: ${{ runner.os }}-xcode-${{ matrix.config.xcode }}-ccache-e2e-ios
create-symlink: true
- name: Setup ccache behavior
run: |
echo "CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros" >> $GITHUB_ENV
echo "CCACHE_FILECLONE=true" >> $GITHUB_ENV
echo "CCACHE_DEPEND=true" >> $GITHUB_ENV
echo "CCACHE_INODECACHE=true" >> $GITHUB_ENV
- name: Restore Pods cache
uses: actions/cache@v4
with:
path: |
example/ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods
key: ${{ runner.os }}-xcode-${{ matrix.config.xcode }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-xcode-${{ matrix.config.xcode }}-pods-
- name: Install pods
working-directory: ${{ env.WORKING_DIRECTORY }}/ios
run: export USE_CCACHE=1 && pod install || pod update --repo-update
- name: Restore DerivedData cache
uses: actions/cache@v5
with:
path: example/ios/build
key: ${{ runner.os }}-e2e-derived-data-xcode-${{ matrix.config.xcode }}-${{ hashFiles('**/Podfile.lock', '**/Gemfile.lock', '**/package.json', '**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-e2e-derived-data-xcode-${{ matrix.config.xcode }}-
- name: Build app
working-directory: e2e
run: yarn build-example:ios
- uses: actions/upload-artifact@v4
with:
name: ios-e2e-ipa-xcode${{ matrix.config.xcode }}
path: example/ios/build/Build/Products/Release-iphonesimulator/KeyboardControllerExample.app/**
determine-e2e-matrix:
name: ⚖️ Determine E2E Test Matrix
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Set matrix for PR or main
id: set-matrix
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
# Subset for PRs: Only ios 15, 26, 26e (adjust as needed)
echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT
else
# Full set for main
echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 16, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "16.4", "iphone": "iPhone 14 Pro", "os": "16.4"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": 18, artifact: "16.4", "xcode": "16.4", "macos": 15, "iphone": "iPhone 16 Pro", "os": "18.5"}, {"ios": 26, artifact: "16.4", "xcode": "26.0", "macos": 15, "iphone": "iPhone 17 Pro", "os": "26.2"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT
fi
e2e-test:
name: ⚙️ Automated test cases (iOS-${{ matrix.devices.ios }}, XCode-${{ matrix.devices.artifact }})
runs-on: macos-${{ matrix.devices.macos }}
timeout-minutes: 90
env:
WORKING_DIRECTORY: example
strategy:
matrix: ${{ fromJson(needs.determine-e2e-matrix.outputs.matrix) }}
needs: [build, determine-e2e-matrix]
steps:
- uses: actions/checkout@v4
- name: Download a single artifact
uses: actions/download-artifact@v4
with:
name: ios-e2e-ipa-xcode${{ matrix.devices.artifact }}
path: example/ios/build/Build/Products/Release-iphonesimulator/KeyboardControllerExample.app/
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ matrix.devices.xcode }}
- name: Get Xcode version
run: xcodebuild -version
# needed for additional runtime installation
- name: Install Xcodes
run: brew tap xcodesorg/made
- name: Install additional iOS runtimes
if: ${{ matrix.devices.runtime != '' && matrix.devices.runtime != null }}
uses: ./.github/actions/retry-sudo-with-timeout
with:
command: "xcodes runtimes install --keep-archive 'iOS ${{ matrix.devices.runtime }}'"
timeout: 600 # 10 minutes
max_retries: 3
retry_interval: 60
- name: List all available simulators
run: xcrun simctl list
# https://bitrise.io/blog/post/xcode-15-performance-regressions
- name: Install yeetd
run: |
defaults write dev.biscuit.yeetd killapsd true
wget https://github.com/biscuitehh/yeetd/releases/download/1.0/yeetd-normal.pkg
sudo installer -pkg yeetd-normal.pkg -target /
yeetd &
# needed for simulator pre-booting
- name: Install CoreUtils
run: brew install coreutils
- name: Boot simulator
uses: ./.github/actions/boot-simulator
with:
simulator-name: ${{ matrix.devices.iphone }}
simulator-version: ${{ matrix.devices.os }}
- name: Install AppleSimulatorUtils
run: brew tap wix/brew && brew install applesimutils
- name: Save yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Restore node_modules from cache
uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install root dependencies
run: yarn install
- name: Install e2e dependencies
run: yarn install --cwd e2e
- name: Use software keyboard
run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool NO
- name: Test app
working-directory: e2e
run: SOFT_CHECK=false yarn test-example:ios-${{ matrix.devices.ios }}
- uses: actions/upload-artifact@v4
if: ${{ failure() }}
with:
name: ios-fail-screen-shoots
path: e2e/artifacts