Fix compiler crash when using Kotlin 2.0.20 (#1830) #1434
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: PR Build | |
on: | |
workflow_dispatch: # Add this line to enable manual triggering | |
pull_request: | |
paths-ignore: | |
- '**.md' | |
push: | |
branches: | |
- main | |
- releases | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
env: | |
REALM_DISABLE_ANALYTICS: true | |
REALM_PRINT_ANALYTICS: true | |
CMAKE_C_COMPILER: /usr/local/bin/ccache-clang | |
CMAKE_CXX_COMPILER: /usr/local/bin/ccache-clang++ | |
# Workflow environment variables are not available in Job if statements: https://github.com/actions/runner/issues/1661 | |
# For now move this check to the `deploy-snapshot` job and figure out if there is a better way to do this. | |
# IS_RELEASE_BRANCH: "${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/releases' }}" | |
jobs: | |
static-analysis: | |
uses: ./.github/workflows/include-static-analysis.yml | |
check-cache: | |
uses: ./.github/workflows/include-check-cache.yml | |
# We build the same JNI SWIG stub once and re-use it across platforms to ensure any problems | |
# with SWIG if we compile on each seperate platform. | |
build-jni-swig-stub: | |
runs-on: ubuntu-latest | |
needs: check-cache | |
if: always() && !cancelled() && needs.check-cache.outputs.jni-swig-stub-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Register problem matchers | |
run: |- | |
echo "::add-matcher::.github/problem-matchers/kotlin.json" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Load build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/jni-swig-stub/build/generated/sources/jni | |
key: jni-swig-stubs-${{ needs.check-cache.outputs.packages-sha }} | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
# Manually install SWIG 4.1.1 as only 4.0.2 is pre-installed | |
# 4.1.1 is not available in apt-get, so use brew instead | |
# We need to use the formulae directly from GitHub to pin the version as Homebrew does not have | |
# all versions available. | |
# https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu2204-Readme.md#ubuntu-22041-lts | |
# It seems to be required to manually add brew dirs to the PATH. This does not happen automatically. | |
- name: Install SWIG | |
run: | | |
test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)" | |
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" | |
test -r ~/.bash_profile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bash_profile | |
echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.profile | |
echo "/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH | |
echo "/home/linuxbrew/.linuxbrew/bin" >> $GITHUB_PATH | |
cd ~ | |
curl -L ${{ vars.VERSION_SWIG}} > swig.rb && HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=true brew install swig.rb | |
- name: Build JNI Stub | |
working-directory: ./packages | |
run: ./gradlew :jni-swig-stub:assemble -Prealm.kotlin.buildRealmCore=false -Prealm.kotlin.mainHost=false | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: jni-stub-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/jni-swig-stub/build/generated/sources/jni/* | |
retention-days: 1 | |
build-jvm-linux-native-lib: | |
runs-on: ubuntu-22.04 | |
needs: [check-cache, build-jni-swig-stub] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
needs.check-cache.outputs.jni-linux-lib-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Register problem matchers | |
run: |- | |
echo "::add-matcher::.github/problem-matchers/kotlin.json" | |
- name: Setup build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/cinterop/build/realmLinuxBuild | |
key: jni-linux-lib-${{ needs.check-cache.outputs.packages-sha }} | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Restore JNI Swig Stubs | |
uses: actions/download-artifact@v4 | |
with: | |
name: jni-stub-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/jni-swig-stub/build/generated/sources/jni | |
- name: Build native lib | |
working-directory: ./packages/cinterop | |
run: | | |
mkdir build | |
cd build | |
rm -rf realmLinuxBuild | |
mkdir realmLinuxBuild | |
cd realmLinuxBuild | |
cmake -DCMAKE_BUILD_TYPE=Release \ | |
-DREALM_ENABLE_SYNC=1 \ | |
-DREALM_NO_TESTS=1 \ | |
-DREALM_BUILD_LIB_ONLY=true \ | |
-DCMAKE_CXX_VISIBILITY_PRESET=hidden \ | |
-DCMAKE_TOOLCHAIN_FILE=../../../external/core/tools/cmake/x86_64-linux-gnu.toolchain.cmake \ | |
-DJAVA_INCLUDE_PATH=${{ env.JAVA_HOME }}/include/ \ | |
../../src/jvm | |
make -j8 | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: jni-linux-lib-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/cinterop/build/realmLinuxBuild/librealmc.so | |
retention-days: 1 | |
build-jvm-windows-native-lib: | |
runs-on: windows-latest | |
needs: [check-cache, build-jni-swig-stub] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
needs.check-cache.outputs.jni-windows-lib-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
# TODO See https://github.com/microsoft/vcpkg/issues/25349 which might describe the error here https://github.com/realm/realm-kotlin/runs/8099890473?check_suite_focus=true | |
# -- Building for: Visual Studio 17 2022 | |
# -- Running vcpkg install | |
# Error: while checking out port openssl with git tree 7e4d802e3bde4154c227c0dd1da75c719be9f07a | |
# Error: Failed to tar port directory | |
# error: tar failed with exit code: (128). | |
# fatal: not a tree object: 7e4d802e3bde4154c227c0dd1da75c719be9f07a | |
# TODO Implement better work-around here: https://mongodb.slack.com/archives/C017MBM0A30/p1661889411467029?thread_ts=1661888738.117769&cid=C017MBM0A30 | |
fetch-depth: 0 | |
submodules: "recursive" | |
- name: Setup build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/cinterop/build/realmWindowsBuild | |
key: jni-windows-lib-${{ needs.check-cache.outputs.packages-sha }} | |
enableCrossOsArchive: true | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Restore JNI Swig Stubs | |
uses: actions/download-artifact@v4 | |
with: | |
name: jni-stub-${{ needs.check-cache.outputs.version-label }} | |
path: ${{ github.workspace }}/packages/jni-swig-stub/build/generated/sources/jni | |
- name: Build native lib | |
shell: powershell | |
working-directory: packages | |
run: | | |
cd cinterop | |
mkdir build | |
cd build | |
Remove-Item -Path realmWindowsBuild -Force -Recurse -ErrorAction Ignore | |
mkdir realmWindowsBuild | |
cd realmWindowsBuild | |
cmake ` | |
..\..\src\jvm ` | |
-DCMAKE_GENERATOR_PLATFORM=x64 ` | |
-DCMAKE_BUILD_TYPE=Release ` | |
-DREALM_ENABLE_SYNC=ON ` | |
-DREALM_NO_TESTS=1 ` | |
-DCMAKE_CXX_VISIBILITY_PRESET=hidden ` | |
-DVCPKG_TARGET_TRIPLET=x64-windows-static | |
cmake --build . --config Release | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: jni-windows-lib-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/cinterop/build/realmWindowsBuild/Release/realmc.dll | |
retention-days: 1 | |
build-jvm-macos-native-lib: | |
runs-on: macos-14 | |
needs: [check-cache, build-jni-swig-stub] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
needs.check-cache.outputs.jni-macos-lib-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'jvm-macos-native-lib' | |
max-size: '2.0G' | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Debug environment | |
run: | | |
env | |
type cmake | |
cmake --version | |
type ninja | |
ninja --version | |
# We cannot use artifacts as they cannot be shared between workflows, so use cache instead. | |
- name: Setup build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/cinterop/build/realmMacOsBuild | |
key: jni-macos-lib-${{ needs.check-cache.outputs.packages-sha }} | |
- name: Restore JNI Swig Stubs | |
uses: actions/download-artifact@v4 | |
with: | |
name: jni-stub-${{ needs.check-cache.outputs.version-label }} | |
path: ${{ github.workspace }}/packages/jni-swig-stub/build/generated/sources/jni | |
- name: Build packages | |
working-directory: packages | |
run: ./gradlew buildJVMSharedLibs -Prealm.kotlin.mainHost=false | |
- name: Show ccache size | |
run: | | |
echo `du -sh ~/.ccache` | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: jni-macos-lib-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/cinterop/build/realmMacOsBuild/librealmc.dylib | |
retention-days: 1 | |
build-kotlin-metadata-package: | |
runs-on: ubuntu-latest | |
needs: [check-cache] | |
env: | |
NDK_VERSION: 23.2.8568313 | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
needs.check-cache.outputs.packages-metadata-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Register problem matchers | |
run: |- | |
echo "::add-matcher::.github/problem-matchers/kotlin.json" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'metadata-package' | |
max-size: '2.0G' | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
# This matches 23.2.8568313, but what happens if we a define specific ndk version in our build? | |
- name: Setup NDK | |
uses: nttld/setup-ndk@v1 | |
with: | |
ndk-version: r23c | |
- name: Setup build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-metadata-${{ needs.check-cache.outputs.packages-sha }} | |
- name: Build Kotlin Metadata and Gradle and Compiler Plugin | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=gradlePlugin,compilerPlugin -Prealm.kotlin.buildRealmCore=false -Prealm.kotlin.mainHost=true | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-metadata-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
# This task is also responsible for creating the Gradle and Compiler Plugin as well as | |
# all Kotlin Multiplatform Metadata | |
build-jvm-packages: | |
runs-on: macos-14 | |
needs: [check-cache, build-jvm-linux-native-lib, build-jvm-windows-native-lib, build-jvm-macos-native-lib] | |
env: | |
NDK_VERSION: 23.2.8568313 | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
needs.check-cache.outputs.packages-jvm-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Register problem matchers | |
run: |- | |
echo "::add-matcher::.github/problem-matchers/kotlin.json" | |
- name: Setup Java | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
# JVM 17 is required for android-actions/setup-android@v3 | |
# Last version will be used and available globally. Other Java versions can be accessed through env variables with such specification as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}' | |
java-version: | | |
17 | |
${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'jvm-package' | |
max-size: '2.0G' | |
- name: Install SWIG | |
run: brew install swig | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Setup Android SDK | |
env: | |
JAVA_HOME: ${{ env.JAVA_HOME_17_ARM64 }} | |
uses: android-actions/setup-android@v3 | |
- name: Install NDK | |
run: sdkmanager --install "ndk;${{ env.NDK_VERSION }}" | |
env: | |
JAVA_HOME: ${{ env.JAVA_HOME_17_ARM64 }} | |
# We cannot use artifacts as they cannot be shared between workflows, so use cache instead. | |
- name: Setup build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-jvm-sync-${{ needs.check-cache.outputs.packages-sha }} | |
- name: Restore Linux JNI lib | |
uses: actions/download-artifact@v4 | |
with: | |
name: jni-linux-lib-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/cinterop/build/realmLinuxBuild | |
- name: Restore Windows JNI lib | |
uses: actions/download-artifact@v4 | |
with: | |
name: jni-windows-lib-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/cinterop/build/realmWindowsBuild/Release | |
- name: Restore MacOS JNI lib | |
uses: actions/download-artifact@v4 | |
with: | |
name: jni-macos-lib-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/cinterop/build/realmMacOsBuild | |
- name: Build JVM Package | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=jvm -Prealm.kotlin.buildRealmCore=false -Prealm.kotlin.copyNativeJvmLibs=linux,windows,macos -Prealm.kotlin.mainHost=false | |
- name: Show ccache size | |
run: | | |
echo `du -sh ~/.ccache` | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-jvm-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
build-android-packages: | |
runs-on: ubuntu-latest | |
needs: check-cache | |
env: | |
NDK_VERSION: 23.2.8568313 | |
outputs: | |
baas-container-id: ${{ steps.baas_cli_start.outputs.baas_container_id }} | |
if: | | |
always() && !cancelled() && | |
(needs.check-cache.outputs.packages-android-cache-hit != 'true' || | |
needs.check-cache.outputs.android-test-base-apk-cache-hit != 'true' || | |
needs.check-cache.outputs.android-test-sync-apk-cache-hit != 'true') | |
steps: | |
- name: Remove unnecessary files | |
run: | | |
sudo rm -rf /usr/share/dotnet | |
sudo rm -rf "$AGENT_TOOLSDIRECTORY" | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Setup Java | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
# JVM 17 is required for android-actions/setup-android@v3 | |
# Last version will be used and available globally. Other Java versions can be accessed through env variables with such specification as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}' | |
java-version: | | |
17 | |
${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
# Manually install SWIG 4.1.1 as only 4.0.2 is pre-installed | |
# 4.1.1 is not available in apt-get, so use brew instead | |
# We need to use the formulae directly from GitHub to pin the version as Homebrew does not have | |
# all versions available. | |
# https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu2204-Readme.md#ubuntu-22041-lts | |
# It seems to be required to manually add brew dirs to the PATH. This does not happen automatically. | |
- name: Install SWIG | |
run: | | |
test -d ~/.linuxbrew && eval "$(~/.linuxbrew/bin/brew shellenv)" | |
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" | |
test -r ~/.bash_profile && echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bash_profile | |
echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.profile | |
echo "/home/linuxbrew/.linuxbrew/sbin" >> $GITHUB_PATH | |
echo "/home/linuxbrew/.linuxbrew/bin" >> $GITHUB_PATH | |
cd ~ | |
curl -L ${{ vars.VERSION_SWIG}} > swig.rb && HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=true brew install swig.rb | |
- name: Install JSON parser | |
run: brew install jq | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'android-package' | |
max-size: '2.0G' | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Setup Android SDK | |
uses: android-actions/setup-android@v3 | |
env: | |
JAVA_HOME: ${{ env.JAVA_HOME_17_X64 }} | |
- name: Install NDK | |
env: | |
JAVA_HOME: ${{ env.JAVA_HOME_17_X64 }} | |
run: sdkmanager --install "ndk;${{ env.NDK_VERSION }}" | |
- name: Build Android Base Test Apk | |
working-directory: packages | |
run: ./gradlew :test-base:assembleAndroidTest -Prealm.kotlin.buildRealmCore=false -Prealm.kotlin.mainHost=false | |
- name: Build Android Sync Test Apk | |
working-directory: packages | |
run: ./gradlew :test-sync:packageDebug :test-sync:assembleAndroidTest -Prealm.kotlin.buildRealmCore=false -Prealm.kotlin.mainHost=false | |
- name: Build packages | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=android -Prealm.kotlin.buildRealmCore=false -Prealm.kotlin.mainHost=false | |
- name: Store build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-android-sync-${{ needs.check-cache.outputs.packages-sha }} | |
- name: Store build cache for Android Test APK | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/test-base/build/outputs/apk/androidTest/debug/test-base-debug-androidTest.apk | |
key: android-base-test-apk-key-${{ needs.check-cache.outputs.packages-sha }} | |
# Must match naming found in include-check-cache.yml | |
- name: Store build cache for Android Sync Test APK | |
uses: actions/cache@v4 | |
with: | |
key: android-sync-test-apk-key-${{ needs.check-cache.outputs.packages-sha }} | |
path: | | |
./packages/test-sync/build/outputs/apk/androidTest/debug/test-sync-debug-androidTest.apk | |
./packages/test-sync/build/outputs/apk/debug/test-sync-debug.apk | |
# Must match naming found in include-check-cache.yml | |
# Must match naming found in include-check-cache.yml | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-android-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
- name: Upload Android Base Test APK | |
uses: actions/upload-artifact@v4 | |
with: | |
name: android-base-test-apk-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/test-base/build/outputs/apk/androidTest/debug/test-base-debug-androidTest.apk | |
retention-days: 1 | |
- name: Upload Android Sync Test APK | |
uses: actions/upload-artifact@v4 | |
with: | |
name: android-sync-test-apk-${{ needs.check-cache.outputs.version-label }} | |
retention-days: 1 | |
path: | | |
./packages/test-sync/build/outputs/apk/androidTest/debug/test-sync-debug-androidTest.apk | |
./packages/test-sync/build/outputs/apk/debug/test-sync-debug.apk | |
# TODO: ccache is not being used by this build for some reason | |
build-macos-x64-packages: | |
runs-on: macos-14 # x64 builds fine on an arm64 node | |
needs: check-cache | |
if: always() && !cancelled() && needs.check-cache.outputs.packages-macos-x64-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'macos-x64-package' | |
max-size: '2.0G' | |
- name: Install SWIG | |
run: brew install swig | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Build packages | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=macosX64 -Prealm.kotlin.mainHost=false | |
- name: Show ccache size | |
run: | | |
echo `du -sh ~/.ccache` | |
# We cannot use artifacts as they cannot be shared between workflows, so use cache instead. | |
- name: Store build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-macos-x64-sync-${{ needs.check-cache.outputs.packages-sha }} | |
# Must match naming found in include-check-cache.yml | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-macos-x64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
build-macos-arm64-packages: | |
runs-on: macos-14 | |
needs: check-cache | |
# needs: static-analysis | |
if: always() && !cancelled() && needs.check-cache.outputs.packages-macos-arm64-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'macos-arm64-package' | |
max-size: '2.0G' | |
- name: Install SWIG | |
run: brew install swig | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Build packages | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=macosArm64 -Prealm.kotlin.mainHost=false | |
- name: Store build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-macos-arm64-sync-${{ needs.check-cache.outputs.packages-sha }} | |
# Must match naming found in include-check-cache.yml | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-macos-arm64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
build-ios-x64-packages: | |
runs-on: macos-14 # x64 builds fine on an arm64 node | |
needs: check-cache | |
# needs: static-analysis | |
if: always() && !cancelled() && needs.check-cache.outputs.packages-ios-x64-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'ios-x64-package' | |
max-size: '2.0G' | |
- name: Install SWIG | |
run: brew install swig | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Build packages | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=iosX64 -Prealm.kotlin.mainHost=false | |
# We cannot use artifacts as they cannot be shared between workflows, so use cache instead. | |
- name: Store build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-ios-x64-sync-${{ needs.check-cache.outputs.packages-sha }} | |
# Must match naming found in include-check-cache.yml | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-ios-x64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
build-ios-arm64-packages: | |
runs-on: macos-14 | |
needs: check-cache | |
# needs: static-analysis | |
if: always() && !cancelled() && needs.check-cache.outputs.packages-ios-arm64-cache-hit != 'true' | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Setup cmake | |
uses: jwlawson/[email protected] | |
with: | |
cmake-version: ${{ vars.VERSION_CMAKE }} | |
- name: Setup ninja | |
uses: clementetb/setup-ninja@master | |
with: | |
version: ${{ vars.VERSION_NINJA }} | |
- name: Install ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: 'ios-arm64-package' | |
max-size: '2.0G' | |
- name: Install SWIG | |
run: brew install swig | |
- name: Prepend ccache executables to the PATH | |
run: echo "/usr/lib/ccache:/usr/local/opt/ccache/libexec" >> $GITHUB_PATH | |
# See https://github.com/hendrikmuhs/ccache-action/issues/94 | |
- name: Configure ccache | |
run: | | |
ccache --set-config="compiler_check=content" | |
ccache --show-config | |
echo '#!/bin/bash\nccache clang "$@"%"' > /usr/local/bin/ccache-clang | |
echo '#!/bin/bash\nccache clang++ "$@"%"' > /usr/local/bin/ccache-clang++ | |
- name: Build packages | |
working-directory: packages | |
run: ./gradlew publishCIPackages -Prealm.kotlin.targets=iosArm64 -Prealm.kotlin.mainHost=false | |
# We cannot use artifacts as they cannot be shared between workflows, so use cache instead. | |
- name: Store build cache | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/build/m2-buildrepo | |
key: packages-m2-ios-arm64-sync-${{ needs.check-cache.outputs.packages-sha }} | |
# Must match naming found in include-check-cache.yml | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: packages-ios-arm64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo/**/* | |
retention-days: 1 | |
# TODO Split into base and sync tests | |
# TODO If we hook up to Device Farm we can use ubuntu runners instead | |
# TODO Compare speed between emulator and Device Farm | |
# TODO We should be able to move this into a reusable work-flow | |
# TODO Compare speed between emulator and Device Farm | |
# TODO We should be able to move this into a reusable work-flow | |
test-android-packages-emulator: | |
timeout-minutes: 60 | |
strategy: | |
fail-fast: false | |
matrix: | |
type: [base, sync] | |
include: | |
- type: base | |
test-title: Unit Test Results - Android Base (Emulator) | |
- type: sync | |
test-title: Unit Test Results - Android Sync (Emulator) | |
runs-on: macos-12 # android emulator does not run on arm64 - https://github.com/ReactiveCircus/android-emulator-runner/issues/350 | |
needs: [check-cache, build-android-packages, build-jvm-packages, build-kotlin-metadata-package] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: "recursive" | |
# checkout BAAS CLI repo | |
- name: Checkout BAAS repo | |
if: matrix.type == 'sync' | |
run: | | |
echo ${{ secrets.BAAS_CLI }} | gh auth login --with-token | |
gh repo clone 10gen/baasaas | |
# Start BAAS instance in the background | |
# We save the container id to poll against and get the hostname info later | |
- name: Start Baas instance in the background | |
id: baas_cli_start | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
# Adding a dummy tag (foo=bar) to avoid the following issue on macos-runner | |
# curl: option --data: error encountered when reading a file | |
OUTPUT=$(bash cli.sh start | jq -r '.id') | |
echo "baas_container_id=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Restore Kotlin metadata artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-metadata-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore m2-buildrepo (Android) | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-android-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore m2-buildrepo (JVM) | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-jvm-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
# We poll the previously started BAAS container to get the hostname of the container to use with Device Farm tests | |
- name: Fetching the BAAS CLI hostname | |
id: baas_cli_poll | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
OUTPUT=$(bash cli.sh poll ${{ steps.baas_cli_start.outputs.baas_container_id }} | jq -r '.httpUrl') | |
echo "baas_container_hostname=$OUTPUT" >> $GITHUB_OUTPUT | |
# TODO This action does not support using `\` to split multiline scripts. | |
- name: Run Integration Tests | |
env: | |
SSH_AUTH_SOCK: /tmp/ssh_agent.sock | |
uses: reactivecircus/android-emulator-runner@v2 | |
with: | |
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none | |
disable-animations: true | |
api-level: ${{ vars.VERSION_ANDROID_EMULATOR_API_LEVEL }} # Must be 30 to support aosp_atd | |
target: default | |
arch: x86_64 | |
disk-size: 4096M | |
ram-size: 2048M | |
heap-size: 1024M | |
channel: canary | |
script: | | |
adb logcat -c | |
adb logcat > logcat.txt & | |
cd packages && ./gradlew :test-${{ matrix.type }}:connectedCheck -PsyncUsePlatformNetworking=true -PsyncTestUrl=${{ steps.baas_cli_poll.outputs.baas_container_hostname }} -PincludeSdkModules=false --info --no-daemon | |
- name: Archive LogCat data | |
uses: actions/upload-artifact@v4 | |
if: always() || failure() | |
with: | |
name: logcat-${{ matrix.type }}-emulator.txt | |
path: logcat.txt | |
retention-days: 1 | |
- name: Publish Unit Test Results | |
uses: dorny/test-reporter@v1 | |
if: always() || failure() | |
with: | |
name: ${{ matrix.test-title }} | |
path: ./packages/test-${{ matrix.type }}/build/**/TEST-*.xml | |
reporter: java-junit | |
list-suites: failed | |
list-tests: failed | |
fail-on-error: true | |
- name: Stopping the BAAS container | |
if: always() && matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
if [ -n "${{ steps.baas_cli_start.outputs.baas_container_id }}" ]; then | |
bash cli.sh stop ${{ steps.baas_cli_start.outputs.baas_container_id }} | |
fi | |
# Disable device farm test for Base, because running two in parallel seems to interfer somehow | |
test-android-packages-device-farm: | |
name: AWS Device Farm | |
timeout-minutes: 60 | |
runs-on: ubuntu-latest | |
needs: [ check-cache, build-android-packages, build-jvm-packages ] | |
if: | | |
false && | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Restore Android Test APK | |
uses: actions/download-artifact@v4 | |
with: | |
name: android-base-test-apk-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/test-base/build/outputs/apk/androidTest/debug | |
- name: Configure AWS Credentials | |
uses: aws-actions/configure-aws-credentials@v4 | |
with: | |
aws-access-key-id: ${{ secrets.AWS_DEVICEFARM_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_DEVICEFARM_SECRET_ACCESS_KEY }} | |
aws-region: us-west-2 | |
- name: Run the tests | |
uses: ./.github/actions/run-android-device-farm-test | |
id: run_android_tests | |
with: | |
apk-path: ${{ github.workspace }}/packages/test-base/build/outputs/apk/androidTest/debug/test-base-debug-androidTest.apk | |
app-id: io.realm.testapp | |
project-arn: ${{ secrets.DEVICEFARM_PROJECT_ARN }} | |
device-pool-arn: ${{ secrets.DEVICEFARM_POOL_ARN }} | |
test-android-packages-device-farm-sync: | |
name: AWS Device Farm Sync Tests | |
timeout-minutes: 60 | |
runs-on: ubuntu-latest | |
needs: [ check-cache, build-android-packages, build-jvm-packages ] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
endsWith(needs.check-cache.outputs.version-label, '-SNAPSHOT') && | |
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/releases' || github.ref == 'refs/heads/release/k2') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
# checkout BAAS CLI repo | |
- name: Checkout BAAS repo | |
run: | | |
echo ${{ secrets.BAAS_CLI }} | gh auth login --with-token | |
gh repo clone 10gen/baasaas | |
# Start BAAS instance in the background | |
# We save the container id to poll against and get the hostname info later | |
- name: Start Baas instance in the background | |
id: baas_cli_start | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
OUTPUT=$(bash cli.sh start | jq -r '.id') | |
echo "baas_container_id=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Restore Android Sync Test APK | |
uses: actions/download-artifact@v4 | |
with: | |
name: android-sync-test-apk-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/test-sync/build/outputs/apk/ | |
- name: Configure AWS Credentials | |
uses: aws-actions/configure-aws-credentials@v4 | |
with: | |
aws-access-key-id: ${{ secrets.AWS_DEVICEFARM_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_DEVICEFARM_SECRET_ACCESS_KEY }} | |
aws-region: us-west-2 | |
# We poll the previously started BAAS container to get the hostname of the container to use with Device Farm tests | |
- name: Fetching the BAAS CLI hostname | |
id: baas_cli_poll | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
OUTPUT=$(bash cli.sh poll ${{ steps.baas_cli_start.outputs.baas_container_id }} | jq -r '.httpUrl') | |
echo "baas_container_hostname=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Run the Sync tests | |
uses: ./.github/actions/run-android-device-farm-test | |
id: run_android_tests | |
with: | |
apk-path: ${{ github.workspace }}/packages/test-sync/build/outputs/apk/androidTest/debug/test-sync-debug-androidTest.apk | |
apk-auxiliary-path: ${{ github.workspace }}/packages/test-sync/build/outputs/apk/debug/test-sync-debug.apk | |
baas_url: ${{ steps.baas_cli_poll.outputs.baas_container_hostname }} | |
app-id: io.realm.sync.testapp.test | |
project-arn: ${{ secrets.DEVICEFARM_PROJECT_ARN }} | |
device-pool-arn: ${{ secrets.DEVICEFARM_POOL_ARN }} | |
- name: Stopping the BAAS container | |
if: always() | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
if [ -n "${{ steps.baas_cli_start.outputs.baas_container_id }}" ]; then | |
bash cli.sh stop ${{ steps.baas_cli_start.outputs.baas_container_id }} | |
fi | |
test-macos-packages: | |
timeout-minutes: 60 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [macos-12, macos-14] | |
type: [base, sync] | |
include: | |
- os: macos-12 | |
type: base | |
os-id: macos | |
package-prefix: macos-x64 | |
test-title: Unit Test Results - MacOS x64 Base | |
- os: macos-12 | |
type: sync | |
os-id: macos | |
package-prefix: macos-x64 | |
test-title: Unit Test Results - MacOS x64 Sync | |
- os: macos-14 | |
type: base | |
os-id: macos | |
package-prefix: macos-arm64 | |
test-title: Unit Test Results - MacOS arm64 Base | |
- os: macos-14 | |
type: sync | |
os-id: macos | |
package-prefix: macos-arm64 | |
test-title: Unit Test Results - MacOS arm64 Sync | |
runs-on: ${{ matrix.os }} | |
# TODO Unclear why MacOS needs the metadata package when the Android Tests do not | |
# Disable macos-arm for now as the host needs to have the Android SDK installed even though it isn't really using it. | |
needs: [check-cache, build-kotlin-metadata-package, build-macos-x64-packages, build-macos-arm64-packages] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
# checkout BAAS CLI repo | |
- name: Checkout BAAS repo | |
if: matrix.type == 'sync' | |
run: | | |
echo ${{ secrets.BAAS_CLI }} | gh auth login --with-token | |
gh repo clone 10gen/baasaas | |
# Start BAAS instance in the background | |
# We save the container id to poll against and get the hostname info later | |
- name: Start Baas instance in the background | |
id: baas_cli_start | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
# Adding a dummy tag (foo=bar) to avoid the following issue on macos-runner | |
# curl: option --data: error encountered when reading a file | |
OUTPUT=$(bash cli.sh start | jq -r '.id') | |
echo "baas_container_id=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Restore m2-buildrepo | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-${{ matrix.package-prefix }}-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore Kotlin metadata artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-metadata-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
# We poll the previously started BAAS container to get the hostname of the container to use with Device Farm tests | |
- name: Fetching the BAAS CLI hostname | |
id: baas_cli_poll | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
OUTPUT=$(bash cli.sh poll ${{ steps.baas_cli_start.outputs.baas_container_id }} | jq -r '.httpUrl') | |
echo "baas_container_hostname=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Run tests | |
working-directory: packages | |
run: > | |
./gradlew :test-${{ matrix.type }}:macosTest | |
-PsyncTestUrl=${{ steps.baas_cli_poll.outputs.baas_container_hostname }} | |
-PincludeSdkModules=false | |
--info --no-daemon | |
- name: Publish Unit Test Results | |
uses: dorny/test-reporter@v1 | |
if: always() || failure() | |
with: | |
name: ${{ matrix.test-title }} | |
path: ./packages/test-${{ matrix.type }}/build/**/TEST-*.xml | |
reporter: java-junit | |
list-suites: failed | |
list-tests: failed | |
fail-on-error: true | |
- name: Stopping the BAAS container | |
if: always() && matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
if [ -n "${{ steps.baas_cli_start.outputs.baas_container_id }}" ]; then | |
bash cli.sh stop ${{ steps.baas_cli_start.outputs.baas_container_id }} | |
fi | |
test-ios-packages: | |
timeout-minutes: 60 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [macos-12, macos-14] | |
type: [base, sync] | |
include: | |
- os: macos-12 | |
type: base | |
package-prefix: x64 | |
test-title: Unit Test Results - iOS x64 Base | |
test-task: iosTest | |
- os: macos-12 | |
type: sync | |
package-prefix: x64 | |
test-title: Unit Test Results - iOS x64 Sync | |
test-task: iosTest | |
- os: macos-14 | |
type: base | |
package-prefix: arm64 | |
test-title: Unit Test Results - iOS arm64 Base | |
test-task: iosTest | |
- os: macos-14 | |
type: sync | |
package-prefix: arm64 | |
test-title: Unit Test Results - iOS arm64 Sync | |
test-task: iosTest | |
runs-on: ${{ matrix.os }} | |
# TODO Unclear why MacOS needs the metadata package when the Android Tests do not | |
# Disable macos-arm for now as the host needs to have the Android SDK installed even though it isn't really using it. | |
needs: [check-cache, build-kotlin-metadata-package, build-ios-x64-packages, build-ios-arm64-packages] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
# checkout BAAS CLI repo | |
- name: Checkout BAAS repo | |
if: matrix.type == 'sync' | |
run: | | |
echo ${{ secrets.BAAS_CLI }} | gh auth login --with-token | |
gh repo clone 10gen/baasaas | |
# Start BAAS instance in the background | |
# We save the container id to poll against and get the hostname info later | |
- name: Start Baas instance in the background | |
id: baas_cli_start | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
# Adding a dummy tag (foo=bar) to avoid the following issue on macos-runner | |
# curl: option --data: error encountered when reading a file | |
OUTPUT=$(bash cli.sh start | jq -r '.id') | |
echo "baas_container_id=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Restore m2-buildrepo (ios) | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-ios-${{ matrix.package-prefix }}-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore Kotlin metadata artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-metadata-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
# We poll the previously started BAAS container to get the hostname of the container to use with Device Farm tests | |
- name: Fetching the BAAS CLI hostname | |
id: baas_cli_poll | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
OUTPUT=$(bash cli.sh poll ${{ steps.baas_cli_start.outputs.baas_container_id }} | jq -r '.httpUrl') | |
echo "baas_container_hostname=$OUTPUT" >> $GITHUB_OUTPUT | |
# App names are limited to 32 characters, so the appNamePrefix should not exceed 22 characters. | |
- name: Run tests | |
working-directory: packages | |
run: > | |
./gradlew :test-${{ matrix.type }}:${{ matrix.test-task }} | |
-PsyncTestUrl=${{ steps.baas_cli_poll.outputs.baas_container_hostname }} | |
-PincludeSdkModules=false | |
--info --no-daemon | |
- name: Publish Unit Test Results | |
uses: dorny/test-reporter@v1 | |
if: always() || failure() | |
with: | |
name: ${{ matrix.test-title }} | |
path: ./packages/test-${{ matrix.type }}/build/**/TEST-*.xml | |
reporter: java-junit | |
list-suites: failed | |
list-tests: failed | |
fail-on-error: true | |
- name: Stopping the BAAS container | |
if: always() && matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
if [ -n "${{ steps.baas_cli_start.outputs.baas_container_id }}" ]; then | |
bash cli.sh stop ${{ steps.baas_cli_start.outputs.baas_container_id }} | |
fi | |
test-jvm-packages: | |
timeout-minutes: 60 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [macos-12, macos-14, ubuntu-latest, windows-latest] | |
type: [base, sync] | |
include: | |
- os: macos-12 | |
os-id: mac | |
type: base | |
test-title: Unit Test Results - Base JVM MacOS x64 | |
- os: macos-14 | |
os-id: mac | |
type: base | |
test-title: Unit Test Results - Base JVM MacOS arm64 | |
- os: ubuntu-latest | |
os-id: ubu | |
type: base | |
test-title: Unit Test Results - Base JVM Linux | |
- os: windows-latest | |
os-id: win | |
type: base | |
test-title: Unit Test Results - Base JVM Windows | |
- os: macos-12 | |
os-id: mac | |
type: sync | |
test-title: Unit Test Results - Sync JVM MacOS x64 | |
- os: macos-14 | |
os-id: mac | |
type: sync | |
test-title: Unit Test Results - Sync JVM MacOS arm64 | |
- os: ubuntu-latest | |
os-id: ubu | |
type: sync | |
test-title: Unit Test Results - Sync JVM Linux | |
exclude: | |
# Do not run Windows Sync Tests, because the bash script for | |
# starting the BAAS container doesn not work on Windows. | |
- os: windows-latest | |
#os-id: win | |
type: sync | |
#test-title: Unit Test Results - Sync JVM Windows | |
runs-on: ${{ matrix.os }} | |
needs: [check-cache, build-jvm-packages, build-kotlin-metadata-package] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
# checkout BAAS CLI repo | |
- name: Checkout BAAS repo | |
if: matrix.type == 'sync' | |
run: | | |
echo ${{ secrets.BAAS_CLI }} | gh auth login --with-token | |
gh repo clone 10gen/baasaas | |
# Start BAAS instance in the background | |
# We save the container id to poll against and get the hostname info later | |
- name: Start Baas instance in the background | |
id: baas_cli_start | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
# Adding a dummy tag (foo=bar) to avoid the following issue on macos-runner | |
# curl: option --data: error encountered when reading a file | |
OUTPUT=$(bash cli.sh start | jq -r '.id') | |
echo "baas_container_id=$OUTPUT" >> $GITHUB_OUTPUT | |
- name: Setup Java 11 | |
uses: actions/setup-java@v4 | |
with: | |
distribution: ${{ vars.VERSION_JAVA_DISTRIBUTION }} | |
java-version: ${{ vars.VERSION_JAVA }} | |
- name: Setup Gradle and task/dependency caching | |
uses: gradle/actions/setup-gradle@v3 | |
with: | |
cache-read-only: false | |
- name: Restore Kotlin metadata artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-metadata-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore m2-buildrepo | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-jvm-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
# We poll the previously started BAAS container to get the hostname of the container to use with Device Farm tests | |
- name: Fetching the BAAS CLI hostname | |
id: baas_cli_poll | |
if: matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
OUTPUT=$(bash cli.sh poll ${{ steps.baas_cli_start.outputs.baas_container_id }} | jq -r '.httpUrl') | |
echo "baas_container_hostname=$OUTPUT" >> $GITHUB_OUTPUT | |
# App names are limited to 32 characters, so the appNamePrefix should not exceed 22 characters. | |
- name: Run tests | |
working-directory: packages | |
run: > | |
./gradlew :test-${{ matrix.type }}:jvmTest | |
-PsyncUsePlatformNetworking=true | |
-PsyncTestUrl=${{ steps.baas_cli_poll.outputs.baas_container_hostname }} | |
-PincludeSdkModules=false | |
--info --no-daemon | |
- name: Publish Unit Test Results | |
uses: dorny/test-reporter@v1 | |
if: always() || failure() | |
with: | |
name: ${{ matrix.test-title }} | |
path: ./packages/test-${{ matrix.type }}/build/**/TEST-*.xml | |
reporter: java-junit | |
list-suites: failed | |
list-tests: failed | |
fail-on-error: true | |
- name: Stopping the BAAS container | |
if: always() && matrix.type == 'sync' | |
working-directory: baasaas | |
env: | |
APIKEY: ${{ secrets.BAAS_CLI_API_KEY }} | |
run: | | |
if [ -n "${{ steps.baas_cli_start.outputs.baas_container_id }}" ]; then | |
bash cli.sh stop ${{ steps.baas_cli_start.outputs.baas_container_id }} | |
fi | |
package-all-artifacts: | |
runs-on: ubuntu-latest | |
needs: [check-cache, build-jvm-packages, build-android-packages, build-macos-x64-packages, build-macos-arm64-packages, build-ios-x64-packages, build-ios-arm64-packages, build-kotlin-metadata-package] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
# The Metadata artifact contain broken JVM publications, so it needs to be | |
# restored first, it so they can be overidden with the correct ones. | |
- name: Restore Kotlin metadata artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-metadata-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore Android artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-android-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore JVM artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-jvm-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore MacOS x64 artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-macos-x64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore MacOS arm64 artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-macos-arm64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore iOS x64 artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-ios-x64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Restore iOS arm64 artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: packages-ios-arm64-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
- name: Upload artifacts bundle | |
uses: actions/upload-artifact@v4 | |
with: | |
name: all-packages-${{ needs.check-cache.outputs.version-label }} | |
path: ./packages/build/m2-buildrepo | |
retention-days: 7 | |
integration-tests: | |
uses: ./.github/workflows/include-integration-tests.yml | |
needs: [check-cache, package-all-artifacts] | |
if: | | |
always() && | |
!cancelled() && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') | |
with: | |
version-label: ${{ needs.check-cache.outputs.version-label }} | |
deploy-snapshot: | |
uses: ./.github/workflows/include-deploy-snapshot.yml | |
needs: [ | |
check-cache, | |
static-analysis, | |
integration-tests, | |
test-jvm-packages, | |
test-macos-packages, | |
test-ios-packages, | |
test-android-packages-emulator, | |
# test-android-packages-device-farm, | |
test-android-packages-device-farm-sync, | |
package-all-artifacts | |
] | |
if: | | |
always() && | |
!cancelled() && | |
endsWith(needs.check-cache.outputs.version-label, '-SNAPSHOT') && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/releases' || github.ref == 'refs/heads/release/k2') | |
secrets: inherit | |
with: | |
version-label: ${{ needs.check-cache.outputs.version-label }} | |
# This job sets an output `is_publish_build` to `true` if this is a release build | |
check-release-build: | |
runs-on: ubuntu-latest | |
needs: [check-cache] | |
outputs: | |
is_publish_build: ${{ steps.check_release.outputs.is_publish_build }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Check if release build | |
id: check_release | |
run: | | |
git fetch --tags | |
gitTag=$(git describe --tags --exact-match HEAD) || echo "NONE" | |
echo "Git branch/tag: ${GITHUB_REF}/${gitTag:-'none'}" | |
if [[ -z "$gitTag" ]]; then | |
gitSha=$(git rev-parse HEAD | cut -c1-8) | |
echo "Building commit: ${{ needs.check-cache.outputs.version-label }} - ${gitSha}" | |
echo "is_publish_build=false" >> $GITHUB_OUTPUT | |
else | |
if [[ "$gitTag" != "v${{ needs.check-cache.outputs.version-label }}" ]]; then | |
echo "Git tag '${gitTag}' does not match v${{ needs.check-cache.outputs.version-label }}" | |
echo "is_publish_build=false" >> $GITHUB_OUTPUT | |
else | |
echo "Building release: '${gitTag}'" | |
echo "is_publish_build=true" >> $GITHUB_OUTPUT | |
fi | |
fi | |
- name: Print is release build | |
run: | | |
echo "Is release build: ${{ steps.check_release.outputs.is_publish_build }}" | |
deploy-release: | |
uses: ./.github/workflows/include-deploy-release.yml | |
needs: [ | |
check-cache, | |
check-release-build, | |
static-analysis, | |
integration-tests, | |
test-jvm-packages, | |
test-macos-packages, | |
test-ios-packages, | |
test-android-packages-emulator, | |
# test-android-packages-device-farm, | |
test-android-packages-device-farm-sync, | |
package-all-artifacts | |
] | |
if: | | |
always() && | |
!cancelled() && | |
!endsWith(needs.check-cache.outputs.version-label, '-SNAPSHOT') && | |
!contains(needs.*.result, 'failure') && | |
!contains(needs.*.result, 'cancelled') && | |
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/releases' || github.ref == 'refs/heads/release/k2') && | |
(needs.check-release-build.outputs.is_publish_build == 'true') | |
secrets: inherit | |
with: | |
version-label: ${{ needs.check-cache.outputs.version-label }} | |
packages-sha-label: ${{ needs.check-cache.outputs.packages-sha }} |