RJS-2760: Adding Realm.shutdown()
and fixing clean exit tests
#4357
Workflow file for this run
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: 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@v3 | |
with: | |
submodules: "recursive" | |
- name: Setup node version | |
uses: actions/setup-node@v3 | |
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@v3 | |
with: | |
submodules: "recursive" | |
- name: Setup node version | |
uses: actions/setup-node@v3 | |
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@v3 | |
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 | |
# 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@v3 | |
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@v3 | |
with: | |
submodules: "recursive" | |
- name: Setup node version | |
uses: actions/setup-node@v3 | |
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@v3 | |
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@v3 | |
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 | |
- 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@v3 | |
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@v3 | |
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 }} |