Skip to content

Prepare for 12.7.0 #4416

Prepare for 12.7.0

Prepare for 12.7.0 #4416

Workflow file for this run

name: Pull request build and test
on:
push:
# The workflow will run only when both `branches` and `paths-ignore` are satisfied.
branches:
- main
paths-ignore:
- "**.md"
- "**.png"
pull_request:
# Note that the workflow will still run if paths outside of `paths-ignore` have
# been modified in the PR, irrespective of an individual commit only modifying
# ignored paths. (See: https://github.com/actions/runner/issues/2324)
paths-ignore:
- "**.md"
- "**.png"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
bundle:
name: Bundle TypeScript
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: Setup node version
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: Install dependencies
# Ignoring scripts to prevent a prebuilt from getting fetched / built
run: npm ci --ignore-scripts
- name: Bundle all packages
run: npm run bundle
# Due to a limitation in upload-artifact a redundant file is needed to force
# preserving paths (https://github.com/actions/upload-artifact/issues/174)
- name: Upload dist artifacts
uses: actions/upload-artifact@v3
with:
name: realm-js-bundles
path: |
README.md
packages/*/dist
packages/realm/binding/dist
packages/realm/binding/generated
build:
name: Build for ${{ matrix.variant.os }} ${{ matrix.variant.arch }}
runs-on: ${{ matrix.variant.runner }}
env:
REALM_DISABLE_ANALYTICS: 1
NDK_VERSION: 25.1.8937393
strategy:
fail-fast: false
matrix:
variant:
- { os: linux, runner: ubuntu-latest, arch: x64, artifact-path: packages/realm/prebuilds, test-node: true, test-electron: true }
- { os: linux, runner: ubuntu-latest, arch: arm, artifact-path: packages/realm/prebuilds }
- { os: linux, runner: ubuntu-latest, arch: arm64, artifact-path: packages/realm/prebuilds }
- { os: windows, runner: windows-latest, arch: x64, artifact-path: packages/realm/prebuilds, test-node: true, test-electron: true }
- { os: windows, runner: windows-2019, arch: ia32, artifact-path: packages/realm/prebuilds }
- { os: android, runner: ubuntu-latest, arch: x86_64, artifact-path: packages/realm/react-native/android/src/main/jniLibs }
- { os: android, runner: ubuntu-latest, arch: armeabi-v7a, artifact-path: packages/realm/react-native/android/src/main/jniLibs }
- { os: android, runner: ubuntu-latest, arch: arm64-v8a, artifact-path: packages/realm/react-native/android/src/main/jniLibs }
- { os: android, runner: ubuntu-latest, arch: x86, artifact-path: packages/realm/react-native/android/src/main/jniLibs }
- { os: darwin, runner: macos-latest, arch: x64, artifact-path: packages/realm/prebuilds, test-node: true, test-electron: true }
- { os: darwin, runner: macos-latest, arch: arm64, artifact-path: packages/realm/prebuilds, test-node: true, test-electron: true }
- { os: ios, runner: macos-latest-xlarge, arch: simulator, artifact-path: packages/realm/react-native/ios/realm-js-ios.xcframework }
- { os: ios, runner: macos-latest-xlarge, arch: catalyst, artifact-path: packages/realm/react-native/ios/realm-js-ios.xcframework }
- { os: ios, runner: macos-latest-xlarge, arch: ios, artifact-path: packages/realm/react-native/ios/realm-js-ios.xcframework }
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: Setup node version
uses: actions/setup-node@v4
with:
node-version: 20.11.1
cache: npm
- name: Get NPM cache directory
id: npm-cache-dir
shell: bash
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Restore NPM cache
id: npm-cache
uses: actions/cache@v4
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Setup Wireit cache
uses: google/wireit@setup-github-actions-caching/v1
- name: MSVC Setup
if: ${{ runner.os == 'Windows' }}
uses: ilammy/msvc-dev-cmd@v1
- name: Setup CMake
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.29.2'
# ninja-build is used by default if available and results in faster build times
# On linux, electron requires a connected display. We fake this by giving it a headless environment using xvfb
# Relevant issue: https://github.com/juliangruber/browser-run/issues/147
- name: Linux Environment setup
if: ${{ matrix.variant.runner == 'ubuntu-latest' }}
run: sudo apt-get install ccache ninja-build
- name: Setup Java
if: ${{ matrix.variant.os == 'android' }}
uses: actions/setup-java@v3
with:
distribution: 'zulu' # See 'Supported distributions' for available options
java-version: '11'
- name: Setup Android SDK
if: ${{ matrix.variant.os == 'android' }}
uses: android-actions/setup-android@v2
- name: Install NDK
if: ${{ matrix.variant.os == 'android' }}
run: sdkmanager --install "ndk;${{ env.NDK_VERSION }}"
# The ccache installed by github doesn't want to be moved around. Let the ccache action download a new one.
- name: Remove pre-installed ccache
if: ${{ runner.os == 'Windows' }}
shell: bash
# There are two; remove both
run: |
rm -fv $(which ccache)
rm -fv $(which ccache)
- name: ccache
uses: hendrikmuhs/ccache-action@v1
with:
key: ${{ runner.os }}-${{ matrix.variant.os }}-${{ matrix.variant.arch }}
max-size: '2.0G'
- name: Prepend ccache executables to the PATH
if: ${{ runner.os != 'Windows' }}
run: |
echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH
# in CI file timestamps change with every run so instead rely on file content hashing
# https://reactnative.dev/docs/build-speed#using-this-approach-on-a-ci
- name: Configure ccache
run: ccache --set-config="compiler_check=content"
- name: Install dependencies
# Ignoring scripts to prevent a prebuilt from getting fetched / built
run: npm ci --ignore-scripts
- name: Insert ccache executables
if: ${{ runner.os == 'Windows' }}
shell: bash
run: |
cl_exe=$(which cl.exe)
cl_dir=$(dirname "$cl_exe")
# For 32-bit it uses a different compiler than the one in the path
if [ ${{ matrix.variant.arch }} = ia32 ]; then
cl_dir=$(dirname "$cl_dir")/x86
cl_exe="$cl_dir/cl.exe"
fi
cl_dir_windows="C:${cl_dir#/c}"
mv -v "$cl_exe" "$cl_dir"/cl-real.exe
cp -v "$cl_dir"/cl.exe.config "$cl_dir"/cl-real.exe.config
ccache_exe=$(which ccache.exe)
cp -v "$ccache_exe" "$cl_dir"/cl.exe
ls -l "$cl_dir"
echo "CCACHE_COMPILER=$cl_dir_windows/cl-real.exe" >> $GITHUB_ENV
echo 'CCACHE_COMPILERTYPE=msvc' >> $GITHUB_ENV
echo 'CCACHE_STATSLOG=C:\Users\runneradmin\ccache\statslog.txt' >> $GITHUB_ENV
#echo 'CCACHE_LOGFILE=C:\Users\runneradmin\ccache\logfile.txt' >> $GITHUB_ENV
# This tells msbuild to compile only one file at a time; ccache needs that.
echo 'UseMultiToolTask=true' >> $GITHUB_ENV
echo 'VCPKG_KEEP_ENV_VARS=CCACHE_COMPILER;CCACHE_STATSLOG;CCACHE_LOGFILE;CCACHE_COMPILERTYPE;UseMultiToolTask' >> $GITHUB_ENV
# build the c++ library for standard targets
- name: Build node
if: ${{ matrix.variant.os != 'ios' && matrix.variant.os != 'android' }}
run: npm run build:node:prebuild:${{matrix.variant.arch}} --workspace realm
# build the c++ library for IOS
# the Info.plist needs to be regenerated with all libraries in place
- name: Build iOS
if: ${{ matrix.variant.os == 'ios' }}
run: |
npm run build:ios --workspace realm
rm -vf ${{ matrix.variant.artifact-path }}/Info.plist
env:
PLATFORMS: ${{ matrix.variant.arch }}
# build the c++ library for Android
- name: Build Android
if: ${{ matrix.variant.os == 'android' }}
run: npm run build:android --workspace realm -- --arch=${{matrix.variant.arch}}
# Due to a limitation in upload-artifact a redundant file is needed to force
# preserving paths (https://github.com/actions/upload-artifact/issues/174)
- name: Upload prebuild artifact
uses: actions/upload-artifact@v3
with:
name: realm-js-prebuilds
path: |
README.md
${{ matrix.variant.artifact-path }}
ios-xcframework:
name: Generate Info.plist with all frameworks in place
needs: [build]
if: ${{ success() || failure() }}
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: Download prebuilds
uses: actions/download-artifact@v3
with:
name: realm-js-prebuilds
- name: Regenerate Info.plist
run: scripts/regen-info-plist.sh packages/realm/react-native/ios/realm-js-ios.xcframework
# Due to a limitation in upload-artifact a redundant file is needed to force
# preserving paths (https://github.com/actions/upload-artifact/issues/174)
- name: Upload prebuild artifact
uses: actions/upload-artifact@v3
with:
name: realm-js-prebuilds
path: |
README.md
packages/realm/react-native/ios/realm-js-ios.xcframework/Info.plist
integration-tests:
name: Test ${{ matrix.variant.environment }} on ${{ matrix.variant.os }} (${{matrix.variant.target}})
needs: [bundle, build, ios-xcframework]
if: ${{ success() || failure() }}
env:
REALM_DISABLE_ANALYTICS: 1
MOCHA_REMOTE_TIMEOUT: 60000
LONG_TIMEOUT: 300000 # 5 minutes
MOCHA_REMOTE_REPORTER: mocha-github-actions-reporter
MOCHA_REMOTE_EXIT_ON_ERROR: true
SPAWN_LOGCAT: true
BAAS_BRANCH: master
# Pin the Xcode version
DEVELOPER_DIR: /Applications/Xcode_14.3.1.app
IOS_DEVICE_NAME: iPhone 14
runs-on: ${{ matrix.variant.runner }}
strategy:
fail-fast: false
matrix:
variant:
- { os: linux, target: "test:ci", runner: ubuntu-latest, environment: node }
- { os: linux, target: "test:ci:main", runner: ubuntu-latest, environment: electron }
- { os: linux, target: "test:ci:renderer", runner: ubuntu-latest, environment: electron }
#- { os: windows, target: "test:ci", runner: windows-latest, environment: node}
#- { os: windows, target: "test:ci:main", runner: windows-latest, environment: electron }
#- { os: windows, target: "test:ci:renderer", runner: windows-latest, environment: electron }
- { os: darwin, target: "test:ci:main", runner: macos-latest, environment: electron }
- { os: darwin, target: "test:ci:renderer", runner: macos-latest, environment: electron }
- { os: darwin, target: "test:ci", runner: macos-latest, environment: node }
- { os: android, target: "test:ci:android", runner: macos-latest-large, environment: react-native-test-app, arch: "armeabi-v7a" }
- { os: ios, target: "test:ci:ios", runner: macos-latest-xlarge, environment: react-native-test-app, arch: "ios" }
#- { os: ios, target: "test:ci:catalyst", runner: macos-latest, environment: react-native-test-app, arch: "catalyst" }
timeout-minutes: 60
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: "recursive"
- name: Setup node version
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: Get NPM cache directory
id: npm-cache-dir
shell: bash
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Restore NPM cache
id: npm-cache
uses: actions/cache@v4
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Restore Wireit cache
uses: google/wireit@setup-github-actions-caching/v1
- name: Restore React Native cache
if: ${{ matrix.variant.environment == 'react-native-test-app' }}
uses: actions/cache@v4
with:
path: '**/Pods'
key: ${{ runner.os }}-${{matrix.variant.environment}}-${{ hashFiles('**/Podfile.lock', './src/**', './vendor/**') }}
restore-keys: |
${{ runner.os }}-${{matrix.variant.environment}}-
- name: MSVC Setup
if: ${{ runner.os == 'Windows' }}
uses: ilammy/msvc-dev-cmd@v1
# we use a different version for Android, and it is specified below
- name: Setup CMake
if: ${{ matrix.variant.os != 'android' }}
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.29.2'
- name: ccache
uses: hendrikmuhs/ccache-action@v1
if: ${{ matrix.variant.environment == 'react-native-test-app' }}
with:
key: ${{ runner.os }}-${{ matrix.variant.os }}-${{ matrix.variant.arch }}
max-size: '2.0G'
# in CI file timestamps change with every run so instead rely on file content hashing
# https://reactnative.dev/docs/build-speed#using-this-approach-on-a-ci
- name: Configure ccache
if: ${{ matrix.variant.environment == 'react-native-test-app' }}
run: ccache --set-config="compiler_check=content"
# Hermes doesn't work with Cocoapods 1.15.0
# https://forums.developer.apple.com/forums/thread/745518
- name: Install older Cocoapods version
if: ${{ matrix.variant.os == 'ios' }}
uses: maxim-lobanov/setup-cocoapods@v1
with:
version: 1.14.3
- name: Install IOS tools
if: ${{ matrix.variant.os == 'ios' }}
run: |
npm install -g ios-deploy
- name: Set xvfb wrapper for Linux / electron tests
if: ${{ matrix.variant.os == 'linux' && matrix.variant.environment == 'electron' }}
run: |
sudo apt-get install xvfb
echo "wrapper=xvfb-run" >> $GITHUB_ENV
- name: Download bundles
uses: actions/download-artifact@v3
with:
name: realm-js-bundles
- name: Download prebuilds
uses: actions/download-artifact@v3
with:
name: realm-js-prebuilds
- name: Install dependencies
run: npm ci
env:
# Ensure we install the prebuild built in the previous job
npm_config_realm_local_prebuilds: ${{github.workspace}}/packages/realm/prebuilds
# The following makes subsequent "open -a Simulator" calls work
- name: Invoke the simulator
if: ${{ matrix.variant.os == 'ios' }}
run: open -a ${{ env.DEVELOPER_DIR }}/Contents/Developer/Applications/Simulator.app
- name: Boot the simulator
if: ${{ matrix.variant.os == 'ios' }}
run: xcrun simctl boot '${{ env.IOS_DEVICE_NAME }}'
- name: Start BaaS test server
id: baas
uses: ./.github/actions/baas-test-server
with:
branch: ${{ env.BAAS_BRANCH }}
env:
BAASAAS_KEY: ${{ secrets.BAASAAS_KEY }}
- name: Create Mocha Remote Context
id: mocha-env
run: echo "context=syncLogLevel=warn,longTimeoutMs=${{ env.LONG_TIMEOUT }},baseUrl=${{ steps.baas.outputs.baas-url }}" >> $GITHUB_OUTPUT
- name: Run ${{matrix.variant.target}} (${{ matrix.variant.os}} / ${{ matrix.variant.environment }})
if: ${{ matrix.variant.os != 'android' && matrix.variant.os != 'ios' }}
env:
MOCHA_REMOTE_CONTEXT: ${{ steps.mocha-env.outputs.context }}
# The non react native environments should not take so long
timeout-minutes: 60
run: ${{ env.wrapper }} npm run ${{ matrix.variant.target}} --prefix integration-tests/environments/${{ matrix.variant.environment }}
- name: Run ${{matrix.variant.target}} (${{ matrix.variant.os}} / ${{ matrix.variant.environment }})
if: ${{ matrix.variant.os == 'ios' }}
env:
MOCHA_REMOTE_CONTEXT: ${{ steps.mocha-env.outputs.context }}
timeout-minutes: 75
run: npm run ${{ matrix.variant.target}} --prefix integration-tests/environments/${{ matrix.variant.environment }}
- name: Setup Java Gradle cache for android test app
if: ${{ matrix.variant.os == 'android' }}
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Android Emulator cache
if: ${{ matrix.variant.os == 'android' }}
uses: actions/cache@v4
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-29
- uses: actions/setup-java@v3
if: ${{ matrix.variant.os == 'android' }}
with:
distribution: 'zulu' # See 'Supported distributions' for available options
java-version: '17'
- name: Run ${{matrix.variant.target}} (${{ matrix.variant.os}} / ${{ matrix.variant.environment }})
if: ${{ matrix.variant.os == 'android' }}
env:
MOCHA_REMOTE_CONTEXT: ${{ steps.mocha-env.outputs.context }}
timeout-minutes: 75
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 29
force-avd-creation: false
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
arch: x86
ndk: ${{ env.NDK_VERSION }}
cmake: 3.22.1
script: npm run ${{ matrix.variant.target}} --prefix integration-tests/environments/${{ matrix.variant.environment }}