Skip to content

Commit

Permalink
feat: upgrade dependencies (#535)
Browse files Browse the repository at this point in the history
* feat: upgrade and cleanup dependencies

* feat: move types to optional peer dependencies

* chore: align gradle.properties with template

* chore: ignore all build directories from eslint

* chore: reduce duplicate dependencies

* refactor: align node imports

* ci: align working-directory

* ci: fix working-directory

* ci: android try setup only in react-native-app

* ci: try again with default working-directory

* chore: keep jest for detox

* ci: try react-native build-android command

* ci: try running react-native through yarn

* ci: fix jest config e2e

* ci: use npx for jest e2e

* chore: upgrade ios example

* ci: test maestro

* ci: try iPhone 15 Pro

* ci: add maestro to path

* ci: debug maestro

* ci: test maestro path

* ci: export path in test job

* chore: remove detox

* ci: use GITHUB_PATH

* ci: remove maestro version testing

* ci: setup cocoapods cache

* ci: setup iOS build cache

* ci: separate iOS build and test

* ci: improve cache keys

* ci: fix cache and upload paths

* ci: keep diretory structure for app

* ci: fix pods path

* ci: debug pathes

* ci: add Android app artifact

* ci: fix artifact download path

* ci: fix artifact download path

* ci: add Android build cache

* ci: fix android apk path

* ci: try without idb

* ci: add Android test

* ci: use reactivecircus/android-emulator-runner@v2

* ci: fix android apk path

* ci: align tests

* ci: fix apk path

* test: adapt e2e test for Android

* ci: improve android caching

* ci: add report upload

* chore: ignore report.xml

* ci: test android workflows on macos

* ci: improve emulator setup

* Revert "ci: test android workflows on macos"

This reverts commit ed38256.

* ci: keep default emulator setup

* ci: reorder jobs

* ci: list emulators

* ci: cache android virtual device

* ci: remove avd list

* ci: align emulator versions

* ci: change api-level

* ci: try different profile

* ci: remove sdkmanager debugging

* fix: use old arch for RN example

* chore: fix typo

* ci: separate Android and iOS workflow for arch matrix

* ci: adopt matrxi for tests

* ci: move matrix to jobs

* ci: shorten job names

* ci: add matrix to test name

* ci: Podfile.lock needs update for new arch
  • Loading branch information
KiwiKilian authored Dec 8, 2024
1 parent deb9655 commit 047f87f
Show file tree
Hide file tree
Showing 44 changed files with 3,351 additions and 4,875 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
lib
build
1 change: 0 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
module.exports = {
root: true,
extends: ["universe/native"],
ignorePatterns: ["build"],
};
128 changes: 128 additions & 0 deletions .github/workflows/review-android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
name: Android

on:
workflow_call:
# Review calls this Workflow

jobs:
build-android:
name: Build ${{ matrix.new-arch && 'new' || 'old'}} Arch
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./packages/react-native-app
strategy:
matrix:
new-arch: [false, true]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup
uses: ./.github/actions/setup

- name: Setup Azul Zulu OpenJDK
uses: actions/setup-java@v4
with:
distribution: zulu
java-version: 21
cache: gradle

- name: Cache Build
uses: actions/cache@v4
id: android-build-cache
with:
path: |
./android/build
./packages/react-native-app/android/.gradle
./packages/react-native-app/android/app/build
./packages/react-native-app/android/build
key: ${{ runner.os }}-android-build-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ github.workflow }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-android-build-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ github.workflow }}-${{ github.sha }}
${{ runner.os }}-android-build-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ github.workflow }}-
- name: Build
if: steps.android-build-cache.outputs.cache-hit != 'true'
run: yarn react-native build-android --mode release --tasks assembleRelease --extra-params "-PnewArchEnabled=${{ matrix.new-arch }}"

- name: Upload App
uses: actions/upload-artifact@v4
with:
name: android-app-${{ matrix.new-arch && 'new' || 'old' }}-arch
path: ./packages/react-native-app/android/app/build/outputs/apk/release/app-release.apk

test-android:
name: Test ${{ matrix.new-arch && 'new' || 'old'}} Arch
needs: [build-android]
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./packages/react-native-app
strategy:
matrix:
new-arch: [false, true]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Enable KVM Group Permissions
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Gradle cache
uses: gradle/actions/setup-gradle@v3

- name: Cache Virtual Device
uses: actions/cache@v4
id: android-virtual-device-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: android-virtual-device-api-level-33

- name: Create Virtual Device
if: steps.android-virtual-device-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 33
target: google_apis
arch: x86_64
force-avd-creation: false
working-directory: ./packages/react-native-app
script: echo "Generated Android Virtual Device Snapshot for Caching"

- name: Install Maestro
run: |
curl -Ls "https://get.maestro.mobile.dev" | bash
echo "$HOME/.maestro/bin" >> "$GITHUB_PATH"
- name: Download App
uses: actions/download-artifact@v4
with:
name: android-app-${{ matrix.new-arch && 'new' || 'old' }}-arch
path: ./packages/react-native-app/android/

- name: Run Tests
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 33
target: google_apis
arch: x86_64
force-avd-creation: false
working-directory: ./packages/react-native-app
script: |
adb install ./android/app-release.apk
maestro test ./e2e/show-map.yml --format junit
- name: Upload Report
if: always()
uses: actions/upload-artifact@v4
with:
name: Android Report ${{ matrix.new-arch && 'new' || 'old' }} Arch
path: |
./packages/react-native-app/report.xml
~/.maestro/tests/**/*
102 changes: 102 additions & 0 deletions .github/workflows/review-ios.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
name: iOS

on:
workflow_call:
# Review calls this Workflow

jobs:
build-ios:
name: Build ${{ matrix.new-arch && 'new' || 'old'}} Arch
runs-on: macos-latest
defaults:
run:
working-directory: ./packages/react-native-app
strategy:
matrix:
new-arch: [false, true]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup
uses: ./.github/actions/setup

- name: Cache Cocoapods
uses: actions/cache@v4
id: cocoapods-cache
with:
path: ./packages/react-native-app/ios/Pods
key: ${{ runner.os }}-cocoapods-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ hashFiles('./packages/react-native-app/ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-cocoapods-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ hashFiles('./packages/react-native-app/ios/Podfile.lock') }}
${{ runner.os }}-cocoapods-${{ matrix.new-arch && 'new' || 'old' }}-arch-
- name: Install Cocoapods
# New Arch changes Podfile.lock so it always has to run
if: matrix.new-arch || steps.cocoapods-cache.outputs.cache-hit != 'true'
run: RCT_NEW_ARCH_ENABLED=${{ matrix.new-arch && '1' || '0' }} yarn pod:install

- name: Cache Build
uses: actions/cache@v4
id: ios-build-cache
with:
path: ./packages/react-native-app/ios/build
key: ${{ runner.os }}-ios-build-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ github.workflow }}-${{ github.sha }}
restore-keys: |
${{ runner.os }}-ios-build-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ github.workflow }}-${{ github.sha }}
${{ runner.os }}-ios-build-${{ matrix.new-arch && 'new' || 'old' }}-arch-${{ github.workflow }}-
- name: Build
if: steps.ios-build-cache.outputs.cache-hit != 'true'
# Like `react-native build-ios --mode Release` but adapted for simulators
run: xcodebuild -workspace ios/MapLibreReactNativeExample.xcworkspace -scheme MapLibreReactNativeExample -configuration Release -sdk iphonesimulator -derivedDataPath ios/build

- name: Upload App
uses: actions/upload-artifact@v4
with:
name: ios-app-${{ matrix.new-arch && 'new' || 'old' }}-arch
# `.app` is a directory, so we have to archive one level above
path: |
./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator
!./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator/**
./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator/MapLibreReactNativeExample.app
test-ios:
name: Test ${{ matrix.new-arch && 'new' || 'old'}} Arch
needs: [build-ios]
runs-on: macos-latest
defaults:
run:
working-directory: ./packages/react-native-app
strategy:
matrix:
new-arch: [false, true]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install Maestro
run: |
curl -Ls "https://get.maestro.mobile.dev" | bash
echo "$HOME/.maestro/bin" >> "$GITHUB_PATH"
- name: Download App
uses: actions/download-artifact@v4
with:
name: ios-app-${{ matrix.new-arch && 'new' || 'old' }}-arch
path: ./packages/react-native-app/ios

- name: Run Tests
run: |
xcrun simctl boot "iPhone 15 Pro"
xcrun simctl install booted ./ios/MapLibreReactNativeExample.app
maestro test ./e2e/show-map.yml --format junit
- name: Upload Report
if: always()
uses: actions/upload-artifact@v4
with:
name: iOS Report ${{ matrix.new-arch && 'new' || 'old' }} Arch
path: |
./packages/react-native-app/report.xml
~/.maestro/tests/**/*
60 changes: 7 additions & 53 deletions .github/workflows/review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Review

on:
workflow_call:
# Release calls this Workflow
# Release calls this Workflow
pull_request:
branches:
- main
Expand Down Expand Up @@ -87,56 +87,10 @@ jobs:
- name: Build Library
run: yarn prepack

build-react-native-android:
name: Build React Native Android
needs: [lint-eslint, lint-tsc, test, codegen, build-library]
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./packages/react-native-app
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup
uses: ./.github/actions/setup

- name: Setup Azul Zulu OpenJDK
uses: actions/setup-java@v4
with:
distribution: zulu
java-version: 21

- name: Build Android
run: ./gradlew assemble
working-directory: packages/react-native-app/android

build-react-native-ios:
name: Build React Native iOS & Test with Detox
needs: [lint-eslint, lint-tsc, test, codegen, build-library]
runs-on: macos-latest
timeout-minutes: 30
defaults:
run:
working-directory: ./packages/react-native-app
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup
uses: ./.github/actions/setup

- name: Install Pod Dependencies
run: cd ios && pod --version && pod install

- name: Install Detox Dependencies
run: |
brew tap wix/brew
brew install applesimutils
yarn detox clean-framework-cache && yarn detox build-framework-cache
- name: Build iOS
run: yarn detox build -c ios.sim.release
review-android:
name: Android
uses: ./.github/workflows/review-android.yml

- name: Test with Detox
run: yarn detox test --debug-synchronization 200 -c ios.sim.release
review-ios:
name: iOS
uses: ./.github/workflows/review-ios.yml
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,6 @@ packages/expo-app/android

# Build by bob
lib/

# Maestro
report.xml
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Which means, when you change something within [
`/src/components/UserLocation.tsx`](/src/components/UserLocation.tsx)
it will be reflected in any scene in example that uses that component.

TODO: A better overview of how we use jest, detox, etc. (issue #22)
TODO: A better overview of how we use jest, Maestro, etc. (issue #22)

## Optional: Local development with `yalc`

Expand Down
File renamed without changes.
3 changes: 0 additions & 3 deletions jest-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
import "@testing-library/react-native/extend-expect";
import { NativeModules } from "react-native";

// Silence the warning: Animated: `useNativeDriver` is not supported because the native animated module is missing
jest.mock("react-native/Libraries/Animated/NativeAnimatedHelper");

function keyMirror(keys: string[]) {
const obj: Record<string, string> = {};
keys.forEach((key) => (obj[key] = key));
Expand Down
8 changes: 0 additions & 8 deletions jest.config.js

This file was deleted.

20 changes: 20 additions & 0 deletions jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import type { Config } from "jest";

const config: Config = {
preset: "@testing-library/react-native",

moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json"],
setupFilesAfterEnv: [
"./jest-setup.ts",
"./__tests__/__mocks__/react-native.mock.ts",
],
modulePathIgnorePatterns: [
"<rootDir>/lib",
"<rootDir>/packages/*",
"__tests__/__mocks__",
"fixtures",
],
collectCoverageFrom: ["src/**/*.{ts,tsx,js,jsx}"],
};

module.exports = config;
Loading

0 comments on commit 047f87f

Please sign in to comment.