From b946cbbc0201f83a3cb99255d4f9f1d17d926696 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 29 Jun 2022 09:21:01 +0200 Subject: [PATCH 01/88] packages for 0.65 --- .github/workflows/pr.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b00a2e773..f35ab0920 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -120,3 +120,21 @@ jobs: - name: Gulp Build ${{ matrix.platform }} ${{ matrix.config }} Playground (Windows) run: npx gulp buildUWPPlayground${{ matrix.platform }}${{ matrix.config }} working-directory: ./Package + +# Test packages + build-android-ios-065: + uses: ./.github/workflows/ios_android.yml + with: + react-native-version: 0.65 + release-version: 2.0.0 # dummy version + + build-windows-065: + uses: ./.github/workflows/windows.yml + with: + react-native-version: 0.65 + release-version: 2.0.0 + + build-typescript: + uses: ./.github/workflows/typescript.yml + with: + release-version: 2.0.0 \ No newline at end of file From ca107c09861b8455b40ac431dcec81aa7e561682 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 29 Jun 2022 12:20:42 +0200 Subject: [PATCH 02/88] add artifact --- .github/workflows/add_artifact_urls.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/add_artifact_urls.yml diff --git a/.github/workflows/add_artifact_urls.yml b/.github/workflows/add_artifact_urls.yml new file mode 100644 index 000000000..aa3320c89 --- /dev/null +++ b/.github/workflows/add_artifact_urls.yml @@ -0,0 +1,21 @@ +name: add artifact links to pull request and related issues +on: + workflow_run: + workflows: ['PR Build'] + types: [completed] + +jobs: + artifacts-url-comments: + name: add artifact links to pull request and related issues job + runs-on: windows-2019 + steps: + - name: add artifact links to pull request and related issues step + uses: tonyhallett/artifacts-url-comments@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + prefix: Here are the build results + suffix: Artifacts will only be retained for 90 days. + format: name + addTo: pull + continue-on-error: true From a96592416881375483b18a4d88797949b89cbbb6 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 10:36:31 +0100 Subject: [PATCH 03/88] testVersion --- .github/workflows/testVersion.yml | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/testVersion.yml diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml new file mode 100644 index 000000000..b2faac8db --- /dev/null +++ b/.github/workflows/testVersion.yml @@ -0,0 +1,35 @@ +name: Publish Package For Preview +on: + workflow_dispatch: + inputs: + RN_Version: + description: 'ReactNative Version' + required: true + type: string + default: '0.69.0' + BRN_Version: + description: 'Babylon ReactNative Version' + required: true + type: string + default: '0-69' + +jobs: + build: + runs-on: macos-latest + + steps: + - name: Generate PG + run: | + npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} --template react-native-template-typescript + cd Playground + npm install @babylonjs/core + npm install @babylonjs/loaders + npm install @babylonjs/react-native + @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npm build android + npm build ios + - name: Upload Assembled + uses: actions/upload-artifact@v2 + with: + name: 'Assembled' + path: Playground \ No newline at end of file From a4a3765ff9ce6bad2ec6e0aaf88217d69a7ad962 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 10:37:22 +0100 Subject: [PATCH 04/88] title --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index b2faac8db..b5b989ecd 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -1,4 +1,4 @@ -name: Publish Package For Preview +name: Test RN/BRN Version on: workflow_dispatch: inputs: From 3db221650e0a2b08f8028dba3ea72c40e7f986aa Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 10:41:56 +0100 Subject: [PATCH 05/88] template --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index b5b989ecd..eb6710fb3 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Generate PG run: | - npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} --template react-native-template-typescript + npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground npm install @babylonjs/core npm install @babylonjs/loaders From 80054d4e34ff58cd405390a697804fbefc5ae2d1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:19:22 +0100 Subject: [PATCH 06/88] ubuntu --- .github/workflows/testVersion.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index eb6710fb3..13323a79c 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -15,11 +15,12 @@ on: jobs: build: - runs-on: macos-latest + runs-on: ubuntu-latest steps: - name: Generate PG run: | +# brew install ruby@2.7 npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground npm install @babylonjs/core @@ -27,7 +28,7 @@ jobs: npm install @babylonjs/react-native @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} npm build android - npm build ios +# npm build ios - name: Upload Assembled uses: actions/upload-artifact@v2 with: From d0ac717a2b4f8a903aaf991074bf447bc54518da Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:20:28 +0100 Subject: [PATCH 07/88] comments --- .github/workflows/testVersion.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 13323a79c..996d07e4f 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -20,7 +20,6 @@ jobs: steps: - name: Generate PG run: | -# brew install ruby@2.7 npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground npm install @babylonjs/core @@ -28,7 +27,6 @@ jobs: npm install @babylonjs/react-native @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} npm build android -# npm build ios - name: Upload Assembled uses: actions/upload-artifact@v2 with: From 4f7d05a7bec28ef511185dd43e145cc254472c86 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:25:02 +0100 Subject: [PATCH 08/88] react-native iosandroid --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 996d07e4f..8ca1580d3 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -25,7 +25,7 @@ jobs: npm install @babylonjs/core npm install @babylonjs/loaders npm install @babylonjs/react-native - @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} npm build android - name: Upload Assembled uses: actions/upload-artifact@v2 From 9663758b2b97c25f6c76cb182ad0e4e8e6884f08 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:28:47 +0100 Subject: [PATCH 09/88] npm build --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 8ca1580d3..4ce3c8b22 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -26,7 +26,7 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npm build android + npm build - name: Upload Assembled uses: actions/upload-artifact@v2 with: From 9b60a48940e5b14468821406c77ca4182b820a33 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:33:04 +0100 Subject: [PATCH 10/88] run android --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 4ce3c8b22..f2522ae9d 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -26,7 +26,7 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npm build + npm run android - name: Upload Assembled uses: actions/upload-artifact@v2 with: From 3df66646215a2eb2eb88806a47b03ace75325b82 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:42:06 +0100 Subject: [PATCH 11/88] gradlew --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index f2522ae9d..87f88612b 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -26,7 +26,8 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npm run android + cd android + ./gradlew Playground:assembleRelease --stacktrace --info - name: Upload Assembled uses: actions/upload-artifact@v2 with: From 8dd8a6eb40d04c9b7f590afbd7272384d78e6d83 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:48:39 +0100 Subject: [PATCH 12/88] app --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 87f88612b..03e86c8e7 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -27,7 +27,7 @@ jobs: npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} cd android - ./gradlew Playground:assembleRelease --stacktrace --info + ./gradlew app:assembleRelease --stacktrace --info - name: Upload Assembled uses: actions/upload-artifact@v2 with: From 0349f0763148399baea65598253ccfd9fbd70c94 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 25 Jan 2023 11:58:13 +0100 Subject: [PATCH 13/88] apk --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 03e86c8e7..6a6e6cc72 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -32,4 +32,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: 'Assembled' - path: Playground \ No newline at end of file + path: Playground/android/app/build/outputs/apk/release/app-release.apk \ No newline at end of file From d736625b1133a0ed555616cf2dbf429ad7aa9a28 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 10:38:35 +0100 Subject: [PATCH 14/88] windows build --- .github/workflows/testVersion.yml | 41 +++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 6a6e6cc72..c9476a181 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -14,11 +14,31 @@ on: default: '0-69' jobs: - build: + + build-windows: + runs-on: windows-latest + steps: + - name: Generate PG Windows + npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + cd Playground + npm install @babylonjs/core + npm install @babylonjs/loaders + npm install @babylonjs/react-native + npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npx react-native-windows-init --overwrite + msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" + + - name: Upload UWP x64 + uses: actions/upload-artifact@v2 + with: + name: 'WindowsUWPx64' + path: Playground/windows + + build-android: runs-on: ubuntu-latest steps: - - name: Generate PG + - name: Generate PG Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground @@ -26,10 +46,21 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npx react-native-windows-init --overwrite + msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./Playground.sln" cd android ./gradlew app:assembleRelease --stacktrace --info - - name: Upload Assembled + + - name: Upload APK uses: actions/upload-artifact@v2 with: - name: 'Assembled' - path: Playground/android/app/build/outputs/apk/release/app-release.apk \ No newline at end of file + name: 'AndroidAPK' + path: Playground/android/app/build/outputs/apk/release/app-release.apk + + package: + needs: [build-windows, build-android] + runs-on: macos-latest + steps: + - name: Gather + run: | + ls -l -a \ No newline at end of file From a26918ed6177261c8fdb0d87c29e3e0630e8e7a0 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 10:40:29 +0100 Subject: [PATCH 15/88] indents --- .github/workflows/testVersion.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index c9476a181..d9289b8f8 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -18,7 +18,8 @@ jobs: build-windows: runs-on: windows-latest steps: - - name: Generate PG Windows + - name: Generate PG Windows + run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground npm install @babylonjs/core @@ -36,7 +37,6 @@ jobs: build-android: runs-on: ubuntu-latest - steps: - name: Generate PG Android run: | @@ -62,5 +62,5 @@ jobs: runs-on: macos-latest steps: - name: Gather - run: | - ls -l -a \ No newline at end of file + run: | + ls -l -a \ No newline at end of file From 0d5fd88da9bbb4a3e4dad241e2b0b829b79d178a Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 10:57:25 +0100 Subject: [PATCH 16/88] msbuild --- .github/workflows/testVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index d9289b8f8..830339eb2 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -18,6 +18,8 @@ jobs: build-windows: runs-on: windows-latest steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.1 - name: Generate PG Windows run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} @@ -46,8 +48,6 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npx react-native-windows-init --overwrite - msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./Playground.sln" cd android ./gradlew app:assembleRelease --stacktrace --info From 8943303e0aced7a658c485d5a55b7e4e5d42adfe Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 11:19:42 +0100 Subject: [PATCH 17/88] windows 2019 --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 830339eb2..57dad9412 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -16,7 +16,7 @@ on: jobs: build-windows: - runs-on: windows-latest + runs-on: windows-2019 steps: - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v1.1 From 6a7b5f5fd769e0fd7d74251fbee553b00aae379e Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 11:43:31 +0100 Subject: [PATCH 18/88] nuget restore --- .github/workflows/testVersion.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 57dad9412..22c0b47a9 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -16,11 +16,11 @@ on: jobs: build-windows: - runs-on: windows-2019 + runs-on: windows-latest steps: - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v1.1 - - name: Generate PG Windows + - name: Build Playground Windows x64 run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground @@ -29,6 +29,7 @@ jobs: npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} npx react-native-windows-init --overwrite + msbuild.exe /r "./windows/Playground.sln" msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" - name: Upload UWP x64 @@ -40,7 +41,7 @@ jobs: build-android: runs-on: ubuntu-latest steps: - - name: Generate PG Android + - name: Build Playground Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cd Playground From 215641e0c00d1598bc65d95a84833065fd4602e8 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 12:07:58 +0100 Subject: [PATCH 19/88] back to 2019 --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 22c0b47a9..2cffd67cc 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -16,7 +16,7 @@ on: jobs: build-windows: - runs-on: windows-latest + runs-on: windows-2019 steps: - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v1.1 From 77937fda93f121404f00428cdddf72f62a81ecef Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Thu, 26 Jan 2023 14:42:32 +0100 Subject: [PATCH 20/88] windows package path --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 2cffd67cc..6c11de3f6 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -36,7 +36,7 @@ jobs: uses: actions/upload-artifact@v2 with: name: 'WindowsUWPx64' - path: Playground/windows + path: Playground/windows/x64/Release/Playground build-android: runs-on: ubuntu-latest From f70ad573acab24d415e7a3a70518a5365af4068d Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 10:32:04 +0100 Subject: [PATCH 21/88] test emulator --- .github/workflows/testVersion.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 6c11de3f6..bdbabd617 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -58,8 +58,30 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk + - name: Install Android Emulator + run: | + echo Install Android image + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses + echo Create AVD + $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" + + - name: Start emulator + run: | + echo Start emulator + nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_27 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & + echo Wait for emulator + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + + -name: Install & Run .APK + run: | + adb install -t Playground/android/app/build/outputs/apk/release/app-release.apk + adb shell am start -n com.playground/com.playground.MainActivity + package: - needs: [build-windows, build-android] + #needs: [build-windows, build-android] + needs: [build-android] runs-on: macos-latest steps: - name: Gather From 2acdfd20e59fd9c0da04b19d3d9eece9754f9fc9 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 10:33:50 +0100 Subject: [PATCH 22/88] typo --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index bdbabd617..9fd07c3d5 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -74,7 +74,7 @@ jobs: $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' $ANDROID_HOME/platform-tools/adb devices - -name: Install & Run .APK + - name: Install & Run .APK run: | adb install -t Playground/android/app/build/outputs/apk/release/app-release.apk adb shell am start -n com.playground/com.playground.MainActivity From a7f41bacd7a57bc7e7759c63a4239e096556dc7f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 10:48:02 +0100 Subject: [PATCH 23/88] macos --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 9fd07c3d5..21c647983 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -39,7 +39,7 @@ jobs: path: Playground/windows/x64/Release/Playground build-android: - runs-on: ubuntu-latest + runs-on: macos-latest steps: - name: Build Playground Android run: | From 56b3d45d2418b47f3359fd9b1f0f30952212b20f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 10:48:51 +0100 Subject: [PATCH 24/88] no windows --- .github/workflows/testVersion.yml | 44 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 21c647983..0c5b4f2e2 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -15,28 +15,28 @@ on: jobs: - build-windows: - runs-on: windows-2019 - steps: - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.1 - - name: Build Playground Windows x64 - run: | - npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} - cd Playground - npm install @babylonjs/core - npm install @babylonjs/loaders - npm install @babylonjs/react-native - npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npx react-native-windows-init --overwrite - msbuild.exe /r "./windows/Playground.sln" - msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" - - - name: Upload UWP x64 - uses: actions/upload-artifact@v2 - with: - name: 'WindowsUWPx64' - path: Playground/windows/x64/Release/Playground +# build-windows: +# runs-on: windows-2019 +# steps: +# - name: Add msbuild to PATH +# uses: microsoft/setup-msbuild@v1.1 +# - name: Build Playground Windows x64 +# run: | +# npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} +# cd Playground +# npm install @babylonjs/core +# npm install @babylonjs/loaders +# npm install @babylonjs/react-native +# npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} +# npx react-native-windows-init --overwrite +# msbuild.exe /r "./windows/Playground.sln" +# msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" +# +# - name: Upload UWP x64 +# uses: actions/upload-artifact@v2 +# with: +# name: 'WindowsUWPx64' +# path: Playground/windows/x64/Release/Playground build-android: runs-on: macos-latest From d8e085dd17d17166bce9f71dfc5be721e9d0063d Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 10:56:29 +0100 Subject: [PATCH 25/88] separate build & test --- .github/workflows/testVersion.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 0c5b4f2e2..b033efca5 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -39,7 +39,7 @@ jobs: # path: Playground/windows/x64/Release/Playground build-android: - runs-on: macos-latest + runs-on: ubuntu-latest steps: - name: Build Playground Android run: | @@ -58,6 +58,15 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk + test-android: + needs: [build-android] + runs-on: macos-latest + steps: + - name: Download APK + uses: actions/download-artifact@v2 + with: + name: 'AndroidAPK' + path: ./ - name: Install Android Emulator run: | echo Install Android image @@ -81,7 +90,7 @@ jobs: package: #needs: [build-windows, build-android] - needs: [build-android] + needs: [test-android] runs-on: macos-latest steps: - name: Gather From 370b5b9ef2a6a02dcfcec523fc3c1bb7d20ad076 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 11:08:31 +0100 Subject: [PATCH 26/88] apk path --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index b033efca5..e8116f66f 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -85,7 +85,7 @@ jobs: - name: Install & Run .APK run: | - adb install -t Playground/android/app/build/outputs/apk/release/app-release.apk + adb install -t ./app-release.apk adb shell am start -n com.playground/com.playground.MainActivity package: From 3c21c537bed5455fad92e4ba68a42b1aefb1b370 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 11:41:14 +0100 Subject: [PATCH 27/88] default paths --- .github/workflows/testVersion.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index e8116f66f..9540b66c4 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -70,23 +70,25 @@ jobs: - name: Install Android Emulator run: | echo Install Android image - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses + echo "y" | sdkmanager --install "system-images;android-27;default;x86_64" + echo "y" | sdkmanager --licenses echo Create AVD - $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" + avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" - name: Start emulator run: | echo Start emulator nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_27 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & echo Wait for emulator - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices + adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' + adb devices - name: Install & Run .APK run: | adb install -t ./app-release.apk adb shell am start -n com.playground/com.playground.MainActivity + sleep 2 + adb shell pidof com.playground.MainActivity package: #needs: [build-windows, build-android] From b71ab0e19a1d107aa958c0c50d9039f2bc4953e1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 12:01:43 +0100 Subject: [PATCH 28/88] check running --- .github/workflows/testVersion.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 9540b66c4..606d294e5 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -70,10 +70,10 @@ jobs: - name: Install Android Emulator run: | echo Install Android image - echo "y" | sdkmanager --install "system-images;android-27;default;x86_64" - echo "y" | sdkmanager --licenses + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses echo Create AVD - avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" + $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" - name: Start emulator run: | @@ -87,8 +87,12 @@ jobs: run: | adb install -t ./app-release.apk adb shell am start -n com.playground/com.playground.MainActivity - sleep 2 - adb shell pidof com.playground.MainActivity + # wait not ready + adb wait-for-device shell 'while [[ -z $(pidof com.playground | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' + # wait a bit more + sleep 10 + # check it's still alive + if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit(1); fi package: #needs: [build-windows, build-android] From 94b032db967019457f2443f729b66f42ffe29321 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 12:16:30 +0100 Subject: [PATCH 29/88] script --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 606d294e5..139baa6c7 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -92,7 +92,7 @@ jobs: # wait a bit more sleep 10 # check it's still alive - if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit(1); fi + if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit 1; fi package: #needs: [build-windows, build-android] From 33ff0e50ee550ca149ec14e976708613a888268d Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 13:09:28 +0100 Subject: [PATCH 30/88] strings --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 139baa6c7..a5f4bb45f 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -88,7 +88,8 @@ jobs: adb install -t ./app-release.apk adb shell am start -n com.playground/com.playground.MainActivity # wait not ready - adb wait-for-device shell 'while [[ -z $(pidof com.playground | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' + adb shell "pidof com.playground" + adb shell "while [[ -z $(pidof com.playground | tr -d '\r') ]]; do echo '.''; sleep 1; done; input keyevent 82" # wait a bit more sleep 10 # check it's still alive From 356988c777b8a3863fcc51f4656d953a851e994c Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 13:33:06 +0100 Subject: [PATCH 31/88] verbose checks --- .github/workflows/testVersion.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index a5f4bb45f..7476b9185 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -86,14 +86,17 @@ jobs: - name: Install & Run .APK run: | adb install -t ./app-release.apk + echo APK installation done. adb shell am start -n com.playground/com.playground.MainActivity - # wait not ready + echo Activity started. adb shell "pidof com.playground" + echo Activity PID adb shell "while [[ -z $(pidof com.playground | tr -d '\r') ]]; do echo '.''; sleep 1; done; input keyevent 82" - # wait a bit more + echo Activity is running. Waiting 10s. sleep 10 - # check it's still alive + echo Checking it's still alive if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit 1; fi + echo Checks done. package: #needs: [build-windows, build-android] From eba9baa0ecf67c9e00f58f92e05413fcc20e11ea Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 13:48:33 +0100 Subject: [PATCH 32/88] strings again --- .github/workflows/testVersion.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 7476b9185..2be075b7d 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -70,15 +70,15 @@ jobs: - name: Install Android Emulator run: | echo Install Android image - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;default;x86_64" echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses echo Create AVD - $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" + $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_29 -d pixel -k "system-images;android-29;default;x86_64" - name: Start emulator run: | echo Start emulator - nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_27 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & + nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_29 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & echo Wait for emulator adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' adb devices @@ -87,11 +87,11 @@ jobs: run: | adb install -t ./app-release.apk echo APK installation done. - adb shell am start -n com.playground/com.playground.MainActivity + adb wait-for-device shell 'am start -n com.playground/com.playground.MainActivity' echo Activity started. - adb shell "pidof com.playground" + adb wait-for-device shell 'pidof com.playground' echo Activity PID - adb shell "while [[ -z $(pidof com.playground | tr -d '\r') ]]; do echo '.''; sleep 1; done; input keyevent 82" + adb wait-for-device shell 'while [[ -z $(pidof com.playground | tr -d "\r") ]]; do echo "."; sleep 1; done; input keyevent 82' echo Activity is running. Waiting 10s. sleep 10 echo Checking it's still alive From c960ca30c6fa77e8e7954403bd012f2dd5bf1211 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 14:19:24 +0100 Subject: [PATCH 33/88] back to android 27 --- .github/workflows/testVersion.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 2be075b7d..f558cb2cd 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -70,15 +70,15 @@ jobs: - name: Install Android Emulator run: | echo Install Android image - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;default;x86_64" + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses echo Create AVD - $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_29 -d pixel -k "system-images;android-29;default;x86_64" + $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" - name: Start emulator run: | echo Start emulator - nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_29 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & + nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_27 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & echo Wait for emulator adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' adb devices From 3038f9ffa20f88759de529614125f104a79e657e Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 14:40:13 +0100 Subject: [PATCH 34/88] strings --- .github/workflows/testVersion.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index f558cb2cd..3bb27239a 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -87,11 +87,11 @@ jobs: run: | adb install -t ./app-release.apk echo APK installation done. - adb wait-for-device shell 'am start -n com.playground/com.playground.MainActivity' + adb wait-for-device shell am start -n com.playground/com.playground.MainActivity echo Activity started. - adb wait-for-device shell 'pidof com.playground' + adb wait-for-device shell pidof com.playground echo Activity PID - adb wait-for-device shell 'while [[ -z $(pidof com.playground | tr -d "\r") ]]; do echo "."; sleep 1; done; input keyevent 82' + adb wait-for-device shell while [[ -z $(pidof com.playground | tr -d "\r") ]]; do echo "."; sleep 1; done; input keyevent 82 echo Activity is running. Waiting 10s. sleep 10 echo Checking it's still alive From 7a0041dfd4999d816c66ad941c3ffcc57a31de62 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Fri, 27 Jan 2023 15:02:34 +0100 Subject: [PATCH 35/88] mix --- .github/workflows/testVersion.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 3bb27239a..66450bc5b 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -82,9 +82,6 @@ jobs: echo Wait for emulator adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' adb devices - - - name: Install & Run .APK - run: | adb install -t ./app-release.apk echo APK installation done. adb wait-for-device shell am start -n com.playground/com.playground.MainActivity From 237e4c021f6556da184ef3e091798d05405f05b6 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 10:27:49 +0100 Subject: [PATCH 36/88] WIP --- .github/workflows/testVersion.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 66450bc5b..5153b9f82 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -58,6 +58,13 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk + - name: Upload Playground App + uses: actions/upload-artifact@v2 + with: + name: 'Playground App' + path: Playground/ + +# test jobs not working test-android: needs: [build-android] runs-on: macos-latest @@ -96,8 +103,7 @@ jobs: echo Checks done. package: - #needs: [build-windows, build-android] - needs: [test-android] + needs: [build-android] runs-on: macos-latest steps: - name: Gather From c5c6004fd63f471bc7c5e48bdb23a9c9cf7b522d Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 10:30:02 +0100 Subject: [PATCH 37/88] remove test android --- .github/workflows/testVersion.yml | 72 +++++++++++++++---------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 5153b9f82..a4889613f 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -65,42 +65,42 @@ jobs: path: Playground/ # test jobs not working - test-android: - needs: [build-android] - runs-on: macos-latest - steps: - - name: Download APK - uses: actions/download-artifact@v2 - with: - name: 'AndroidAPK' - path: ./ - - name: Install Android Emulator - run: | - echo Install Android image - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses - echo Create AVD - $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" - - - name: Start emulator - run: | - echo Start emulator - nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_27 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & - echo Wait for emulator - adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' - adb devices - adb install -t ./app-release.apk - echo APK installation done. - adb wait-for-device shell am start -n com.playground/com.playground.MainActivity - echo Activity started. - adb wait-for-device shell pidof com.playground - echo Activity PID - adb wait-for-device shell while [[ -z $(pidof com.playground | tr -d "\r") ]]; do echo "."; sleep 1; done; input keyevent 82 - echo Activity is running. Waiting 10s. - sleep 10 - echo Checking it's still alive - if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit 1; fi - echo Checks done. +# test-android: +# needs: [build-android] +# runs-on: macos-latest +# steps: +# - name: Download APK +# uses: actions/download-artifact@v2 +# with: +# name: 'AndroidAPK' +# path: ./ +# - name: Install Android Emulator +# run: | +# echo Install Android image +# echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-27;default;x86_64" +# echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --licenses +# echo Create AVD +# $ANDROID_HOME/tools/bin/avdmanager create avd -n Pixel_API_27 -d pixel -k "system-images;android-27;default;x86_64" +# +# - name: Start emulator +# run: | +# echo Start emulator +# nohup $ANDROID_HOME/emulator/emulator -avd Pixel_API_27 -gpu host -no-audio -no-boot-anim -camera-back none -camera-front none -qemu -m 2048 2>&1 & +# echo Wait for emulator +# adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do echo "."; sleep 1; done; input keyevent 82' +# adb devices +# adb install -t ./app-release.apk +# echo APK installation done. +# adb wait-for-device shell am start -n com.playground/com.playground.MainActivity +# echo Activity started. +# adb wait-for-device shell pidof com.playground +# echo Activity PID +# adb wait-for-device shell while [[ -z $(pidof com.playground | tr -d "\r") ]]; do echo "."; sleep 1; done; input keyevent 82 +# echo Activity is running. Waiting 10s. +# sleep 10 +# echo Checking it's still alive +# if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit 1; fi +# echo Checks done. package: needs: [build-android] From b41fc6961d1864bc911edf2e4213fc7def791003 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 11:18:35 +0100 Subject: [PATCH 38/88] update app TS --- .github/workflows/testVersion.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index a4889613f..a024bf1a0 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -41,6 +41,11 @@ jobs: build-android: runs-on: ubuntu-latest steps: + - name: Checkout Repo + uses: actions/checkout@v2.3.3 + - name: Update App scripts + run: | + cp Apps/Playground/playground-shared/* ./Playground/ - name: Build Playground Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} @@ -49,6 +54,7 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npm install @react-native-community/slider cd android ./gradlew app:assembleRelease --stacktrace --info @@ -58,11 +64,11 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk - - name: Upload Playground App - uses: actions/upload-artifact@v2 - with: - name: 'Playground App' - path: Playground/ +# - name: Upload Playground App +# uses: actions/upload-artifact@v2 +# with: +# name: 'Playground App' +# path: Playground/ # test jobs not working # test-android: From 35d9166b8522babbf63efa9875bf44899f56f09c Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 11:24:06 +0100 Subject: [PATCH 39/88] cp script --- .github/workflows/testVersion.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index a024bf1a0..c9f97f894 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -43,12 +43,10 @@ jobs: steps: - name: Checkout Repo uses: actions/checkout@v2.3.3 - - name: Update App scripts - run: | - cp Apps/Playground/playground-shared/* ./Playground/ - name: Build Playground Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + cp Apps/Playground/playground-shared/* ./Playground/ cd Playground npm install @babylonjs/core npm install @babylonjs/loaders From 2062bb44c65b4addeecef9d4b0e56567042b4f0f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 11:30:42 +0100 Subject: [PATCH 40/88] again --- .github/workflows/testVersion.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index c9f97f894..ff6369748 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -38,6 +38,8 @@ jobs: # name: 'WindowsUWPx64' # path: Playground/windows/x64/Release/Playground +# npm install @react-native-community/slider + build-android: runs-on: ubuntu-latest steps: @@ -48,11 +50,11 @@ jobs: npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cp Apps/Playground/playground-shared/* ./Playground/ cd Playground + ls -R npm install @babylonjs/core npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npm install @react-native-community/slider cd android ./gradlew app:assembleRelease --stacktrace --info From c848c851b435377b1c72b81d1f488ae3fae777b9 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 11:36:00 +0100 Subject: [PATCH 41/88] config crash --- .github/workflows/testVersion.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index ff6369748..73ad7de73 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -6,12 +6,12 @@ on: description: 'ReactNative Version' required: true type: string - default: '0.69.0' + default: '0.71.0' BRN_Version: description: 'Babylon ReactNative Version' required: true type: string - default: '0-69' + default: '0-70' jobs: @@ -38,8 +38,8 @@ jobs: # name: 'WindowsUWPx64' # path: Playground/windows/x64/Release/Playground -# npm install @react-native-community/slider - +# +cp Apps/Playground/playground-shared/* ./Playground/ build-android: runs-on: ubuntu-latest steps: @@ -48,13 +48,14 @@ jobs: - name: Build Playground Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} - cp Apps/Playground/playground-shared/* ./Playground/ + cd Playground ls -R npm install @babylonjs/core npm install @babylonjs/loaders npm install @babylonjs/react-native npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npm install @react-native-community/slider cd android ./gradlew app:assembleRelease --stacktrace --info From 93f06131254083db8b4b62dedce8aba6e984ae0b Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 11:38:04 +0100 Subject: [PATCH 42/88] removed copy --- .github/workflows/testVersion.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 73ad7de73..e528a5495 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -39,7 +39,7 @@ jobs: # path: Playground/windows/x64/Release/Playground # -cp Apps/Playground/playground-shared/* ./Playground/ +# cp Apps/Playground/playground-shared/* ./Playground/ build-android: runs-on: ubuntu-latest steps: @@ -48,7 +48,6 @@ cp Apps/Playground/playground-shared/* ./Playground/ - name: Build Playground Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} - cd Playground ls -R npm install @babylonjs/core From 08c0d34e5c16ce5055e3c27aece5e82db35c8f37 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 11:45:12 +0100 Subject: [PATCH 43/88] try copy again --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index e528a5495..e053fbf64 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -39,7 +39,7 @@ jobs: # path: Playground/windows/x64/Release/Playground # -# cp Apps/Playground/playground-shared/* ./Playground/ +# build-android: runs-on: ubuntu-latest steps: @@ -48,6 +48,7 @@ jobs: - name: Build Playground Android run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground ls -R npm install @babylonjs/core From 2b885c4871ffa42237d2eea3f33585790b57c2d1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 12:17:45 +0100 Subject: [PATCH 44/88] version quotes --- .github/workflows/testVersion.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index e053fbf64..57afdfdf8 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -47,10 +47,9 @@ jobs: uses: actions/checkout@v2.3.3 - name: Build Playground Android run: | - npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground - ls -R npm install @babylonjs/core npm install @babylonjs/loaders npm install @babylonjs/react-native From d96e0bb5f708817ee6ec6ae60935eb2940fa187c Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 13:43:14 +0100 Subject: [PATCH 45/88] verbose --- .github/workflows/testVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 57afdfdf8..1c6958aee 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -6,7 +6,7 @@ on: description: 'ReactNative Version' required: true type: string - default: '0.71.0' + default: '0.70.7' BRN_Version: description: 'Babylon ReactNative Version' required: true @@ -47,7 +47,7 @@ jobs: uses: actions/checkout@v2.3.3 - name: Build Playground Android run: | - npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core From c63ca9cab08359f886eee6c27a68b017389b40da Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 13:55:07 +0100 Subject: [PATCH 46/88] list versions --- .github/workflows/testVersion.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 1c6958aee..a4b9baf7a 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -47,6 +47,8 @@ jobs: uses: actions/checkout@v2.3.3 - name: Build Playground Android run: | + npm view react-native versions + npm uninstall -g react-native-cli @react-native-community/cli npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground From 3b7a6966d06d0cdc367a1647c09217b1cc0e7573 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 14:08:50 +0100 Subject: [PATCH 47/88] an 1 --- .github/workflows/testVersion.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index a4b9baf7a..f4cec7a1e 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -47,7 +47,6 @@ jobs: uses: actions/checkout@v2.3.3 - name: Build Playground Android run: | - npm view react-native versions npm uninstall -g react-native-cli @react-native-community/cli npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx @@ -66,11 +65,11 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk -# - name: Upload Playground App -# uses: actions/upload-artifact@v2 -# with: -# name: 'Playground App' -# path: Playground/ + - name: Upload Playground App + uses: actions/upload-artifact@v2 + with: + name: 'Playground App' + path: Playground/ # test jobs not working # test-android: From ba8c1c18d6317769cbb7173e3825c5543a999ea4 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 14:53:16 +0100 Subject: [PATCH 48/88] template --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index f4cec7a1e..03490d526 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -48,7 +48,7 @@ jobs: - name: Build Playground Android run: | npm uninstall -g react-native-cli @react-native-community/cli - npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core From 4c94ee9f684996137bba9498e6a57cb65c1f2b41 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 14:53:55 +0100 Subject: [PATCH 49/88] no upload --- .github/workflows/testVersion.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 03490d526..51f95d6f1 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -65,11 +65,11 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk - - name: Upload Playground App - uses: actions/upload-artifact@v2 - with: - name: 'Playground App' - path: Playground/ +# - name: Upload Playground App +# uses: actions/upload-artifact@v2 +# with: +# name: 'Playground App' +# path: Playground/ # test jobs not working # test-android: From 6bd01fcc275681edf082dbedd355d4bb99e6c363 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 14:58:49 +0100 Subject: [PATCH 50/88] version --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 51f95d6f1..15e55d41b 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -48,7 +48,7 @@ jobs: - name: Build Playground Android run: | npm uninstall -g react-native-cli @react-native-community/cli - npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript + npx react-native init Playground --verbose --template react-native-template-typescript@${{ github.event.inputs.RN_Version }} cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core From 088aac3ca2f5c63c325d7c54f1f2d4dba35c876d Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 15:08:09 +0100 Subject: [PATCH 51/88] and again --- .github/workflows/testVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 15e55d41b..51f95d6f1 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -48,7 +48,7 @@ jobs: - name: Build Playground Android run: | npm uninstall -g react-native-cli @react-native-community/cli - npx react-native init Playground --verbose --template react-native-template-typescript@${{ github.event.inputs.RN_Version }} + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core From a5f1831ea322299ba9a289b69d32a73e04417c26 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 15:21:20 +0100 Subject: [PATCH 52/88] template --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 51f95d6f1..52c40eb6b 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -48,7 +48,8 @@ jobs: - name: Build Playground Android run: | npm uninstall -g react-native-cli @react-native-community/cli - npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript +# npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript + npx react-native init Playground --template react-native-template-typescript@6.12.10 cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core From 5e67e073c709353a0df0868f4da342a490358595 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 15:22:13 +0100 Subject: [PATCH 53/88] comment --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 52c40eb6b..25f3e83b4 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -40,6 +40,8 @@ jobs: # # +# npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript + build-android: runs-on: ubuntu-latest steps: @@ -48,7 +50,6 @@ jobs: - name: Build Playground Android run: | npm uninstall -g react-native-cli @react-native-community/cli -# npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript npx react-native init Playground --template react-native-template-typescript@6.12.10 cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground From fb9b544ea0c99da15fcd9a683f5de51682c8c7ba Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Wed, 8 Feb 2023 15:43:50 +0100 Subject: [PATCH 54/88] 0.71.2 --- .github/workflows/testVersion.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 25f3e83b4..9719d0365 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -6,7 +6,7 @@ on: description: 'ReactNative Version' required: true type: string - default: '0.70.7' + default: '0.71.2' BRN_Version: description: 'Babylon ReactNative Version' required: true @@ -40,7 +40,8 @@ jobs: # # -# npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --template react-native-template-typescript +# --template react-native-template-typescript +# npx react-native init Playground --template react-native-template-typescript@6.12.10 build-android: runs-on: ubuntu-latest @@ -50,7 +51,7 @@ jobs: - name: Build Playground Android run: | npm uninstall -g react-native-cli @react-native-community/cli - npx react-native init Playground --template react-native-template-typescript@6.12.10 + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core From ffbd50b66c93e1ab1fa30496da36026f02c98cc1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <ceguille@microsoft.com> Date: Mon, 20 Feb 2023 09:47:41 +0100 Subject: [PATCH 55/88] PG gen --- .github/workflows/testVersion.yml | 46 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 9719d0365..9fd263198 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -15,34 +15,36 @@ on: jobs: -# build-windows: -# runs-on: windows-2019 -# steps: -# - name: Add msbuild to PATH -# uses: microsoft/setup-msbuild@v1.1 -# - name: Build Playground Windows x64 -# run: | -# npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} -# cd Playground -# npm install @babylonjs/core -# npm install @babylonjs/loaders -# npm install @babylonjs/react-native -# npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} -# npx react-native-windows-init --overwrite -# msbuild.exe /r "./windows/Playground.sln" -# msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" -# -# - name: Upload UWP x64 -# uses: actions/upload-artifact@v2 -# with: -# name: 'WindowsUWPx64' -# path: Playground/windows/x64/Release/Playground + build-windows: + runs-on: windows-2019 + steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.1 + - name: Build Playground Windows x64 + run: | + npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + cd Playground + npm install @babylonjs/core + npm install @babylonjs/loaders + npm install @babylonjs/react-native + npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npx react-native-windows-init --overwrite + + - name: Upload UWP x64 + uses: actions/upload-artifact@v2 + with: + name: 'PG' + path: Playground # # # --template react-native-template-typescript # npx react-native init Playground --template react-native-template-typescript@6.12.10 + #msbuild.exe /r "./windows/Playground.sln" + #msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" + + build-android: runs-on: ubuntu-latest steps: From af32bf2dcbad25f3a89981885de236ee6cd7d93f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 6 Mar 2023 17:35:20 +0100 Subject: [PATCH 56/88] postfix package --- .github/workflows/testVersion.yml | 51 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 9fd263198..26aa573dc 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -6,35 +6,40 @@ on: description: 'ReactNative Version' required: true type: string - default: '0.71.2' + default: '0.71.0' BRN_Version: - description: 'Babylon ReactNative Version' + description: 'BRN package version' required: true type: string - default: '0-70' + default: '1.5.2-preview' + BRN_Postfix: + description: 'BRN package postfix' + required: true + type: string + default: '0-71' jobs: - build-windows: - runs-on: windows-2019 - steps: - - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.1 - - name: Build Playground Windows x64 - run: | - npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} - cd Playground - npm install @babylonjs/core - npm install @babylonjs/loaders - npm install @babylonjs/react-native - npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} - npx react-native-windows-init --overwrite - - - name: Upload UWP x64 - uses: actions/upload-artifact@v2 - with: - name: 'PG' - path: Playground +# build-windows: +# runs-on: windows-2019 +# steps: +# - name: Add msbuild to PATH +# uses: microsoft/setup-msbuild@v1.1 +# - name: Build Playground Windows x64 +# run: | +# npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} +# cd Playground +# npm install @babylonjs/core +# npm install @babylonjs/loaders +# npm install @babylonjs/react-native +# npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} +# npx react-native-windows-init --overwrite +# +# - name: Upload UWP x64 +# uses: actions/upload-artifact@v2 +# with: +# name: 'PG' +# path: Playground # # From 6848f051e9d23445f0ca99a13821d3c425a3fcec Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 6 Mar 2023 17:36:18 +0100 Subject: [PATCH 57/88] fix android --- .github/workflows/testVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 26aa573dc..872ed3fca 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -63,8 +63,8 @@ jobs: cd Playground npm install @babylonjs/core npm install @babylonjs/loaders - npm install @babylonjs/react-native - npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Version }} + npm install @babylonjs/react-native@${{ github.event.inputs.BRN_Version }} + npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} npm install @react-native-community/slider cd android ./gradlew app:assembleRelease --stacktrace --info From 6ba61d61e98554a718dc3e2fc531bd89cc625c7b Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 10:20:45 +0100 Subject: [PATCH 58/88] windows build --- .github/workflows/testVersion.yml | 61 ++++++++++++------------------- 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 872ed3fca..be011713f 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -11,7 +11,7 @@ on: description: 'BRN package version' required: true type: string - default: '1.5.2-preview' + default: '1.5.3-preview' BRN_Postfix: description: 'BRN package postfix' required: true @@ -19,30 +19,29 @@ on: default: '0-71' jobs: + build-windows: + runs-on: windows-2019 + steps: + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v1.1 + - name: Build Playground Windows x64 + run: | + npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + cd Playground + npm install @babylonjs/core + npm install @babylonjs/loaders + npm install @babylonjs/react-native + npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} + npx react-native-windows-init --overwrite + msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" -# build-windows: -# runs-on: windows-2019 -# steps: -# - name: Add msbuild to PATH -# uses: microsoft/setup-msbuild@v1.1 -# - name: Build Playground Windows x64 -# run: | -# npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} -# cd Playground -# npm install @babylonjs/core -# npm install @babylonjs/loaders -# npm install @babylonjs/react-native -# npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} -# npx react-native-windows-init --overwrite -# -# - name: Upload UWP x64 -# uses: actions/upload-artifact@v2 -# with: -# name: 'PG' -# path: Playground - -# -# + - name: Upload UWP x64 + uses: actions/upload-artifact@v2 + with: + name: 'PG' + path: Playground + + # --template react-native-template-typescript # npx react-native init Playground --template react-native-template-typescript@6.12.10 @@ -75,12 +74,6 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk -# - name: Upload Playground App -# uses: actions/upload-artifact@v2 -# with: -# name: 'Playground App' -# path: Playground/ - # test jobs not working # test-android: # needs: [build-android] @@ -118,11 +111,3 @@ jobs: # echo Checking it's still alive # if [[ -z "$(pidof com.playground | tr -d '\r')" ]]; then echo "com.playground is not running."; exit 1; fi # echo Checks done. - - package: - needs: [build-android] - runs-on: macos-latest - steps: - - name: Gather - run: | - ls -l -a \ No newline at end of file From 060d90cb15c2059e50e46da7f6d264b927e5162a Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 10:38:57 +0100 Subject: [PATCH 59/88] nuget restore --- .github/workflows/testVersion.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index be011713f..fc2babe5e 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -30,9 +30,10 @@ jobs: cd Playground npm install @babylonjs/core npm install @babylonjs/loaders - npm install @babylonjs/react-native + npm install @babylonjs/react-native@${{ github.event.inputs.BRN_Version }} npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} npx react-native-windows-init --overwrite + msbuild.exe /r "./windows/Playground.sln" msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" - name: Upload UWP x64 @@ -40,14 +41,6 @@ jobs: with: name: 'PG' path: Playground - - -# --template react-native-template-typescript -# npx react-native init Playground --template react-native-template-typescript@6.12.10 - - #msbuild.exe /r "./windows/Playground.sln" - #msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" - build-android: runs-on: ubuntu-latest From fdf1d2d0d630e7bba41226840c6cb0a5ea92352f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 14:45:43 +0100 Subject: [PATCH 60/88] up windows --- .github/workflows/testVersion.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index fc2babe5e..c8e2b7f16 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -27,6 +27,7 @@ jobs: - name: Build Playground Windows x64 run: | npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} + cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground npm install @babylonjs/core npm install @babylonjs/loaders @@ -39,8 +40,8 @@ jobs: - name: Upload UWP x64 uses: actions/upload-artifact@v2 with: - name: 'PG' - path: Playground + name: Upload appx + path: Playground/windows/AppPackages/Playground/Playground_1.0.0.0_x64_Test/Playground_1.0.0.0_x64.appx build-android: runs-on: ubuntu-latest From 13aca4f3f49dcba062e09cab9798796394a8a6ab Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 15:31:57 +0100 Subject: [PATCH 61/88] missing windows checkout --- .github/workflows/testVersion.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index c8e2b7f16..ae2c5b97a 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -22,6 +22,8 @@ jobs: build-windows: runs-on: windows-2019 steps: + - name: Checkout Repo + uses: actions/checkout@v2.3.3 - name: Add msbuild to PATH uses: microsoft/setup-msbuild@v1.1 - name: Build Playground Windows x64 From 3f14305c376bed1380d82dc6bdb01c017eb0abcd Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 16:32:08 +0100 Subject: [PATCH 62/88] more packages --- .github/workflows/testVersion.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index ae2c5b97a..7f9fc7596 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -35,6 +35,8 @@ jobs: npm install @babylonjs/loaders npm install @babylonjs/react-native@${{ github.event.inputs.BRN_Version }} npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} + npm install @react-native-community/slider@4.0.0-rc.3 + npm install react-native-permissions@3.0.0 npx react-native-windows-init --overwrite msbuild.exe /r "./windows/Playground.sln" msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" From ea6933d8751cdd24db8cfdbbcb030d548b4c328f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 17:24:58 +0100 Subject: [PATCH 63/88] autolink --- .github/workflows/testVersion.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 7f9fc7596..68f0cedec 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -38,6 +38,7 @@ jobs: npm install @react-native-community/slider@4.0.0-rc.3 npm install react-native-permissions@3.0.0 npx react-native-windows-init --overwrite + npx react-native autolink-windows msbuild.exe /r "./windows/Playground.sln" msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" From 38b8731017d28ca4717607ecd01afd730e91c982 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 17:49:23 +0100 Subject: [PATCH 64/88] ios build --- .github/workflows/testVersion.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 68f0cedec..3055b7ab4 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -73,6 +73,37 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk +build-ios: + runs-on: macos-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v2.3.3 + - name: Clone iOS Toolchain + run: | + git clone https://github.com/leetal/ios-cmake.git + - name: Build Playground iOS + run: | + npm uninstall -g react-native-cli @react-native-community/cli + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose + cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx + cd Playground + npm install @babylonjs/core + npm install @babylonjs/loaders + npm install @babylonjs/react-native@${{ github.event.inputs.BRN_Version }} + npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} + npm install @react-native-community/slider + mkdir ios/build + cd ios/build + cmake -G Xcode -DCMAKE_TOOLCHAIN_FILE=../../../ios-cmake/ios.toolchain.cmake -DPLATFORM=OS64COMBINED -DENABLE_ARC=0 -DENABLE_BITCODE=1 -DDEPLOYMENT_TARGET=12 -DENABLE_PCH=OFF .. + xcodebuild -sdk iphoneos -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO + xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO + + - name: Upload iOS App + uses: actions/upload-artifact@v2 + with: + name: 'iOSApp' + path: Playground/ios/build + # test jobs not working # test-android: # needs: [build-android] From 3603139fdf2c66120c53e038de4a847437308d4e Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 17:50:40 +0100 Subject: [PATCH 65/88] indent --- .github/workflows/testVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 3055b7ab4..ef4dc78ca 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -73,7 +73,7 @@ jobs: name: 'AndroidAPK' path: Playground/android/app/build/outputs/apk/release/app-release.apk -build-ios: + build-ios: runs-on: macos-latest steps: - name: Checkout Repo @@ -103,7 +103,7 @@ build-ios: with: name: 'iOSApp' path: Playground/ios/build - + # test jobs not working # test-android: # needs: [build-android] From 79f349b209aa0a0280d100f579440567160fa79f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 18:29:10 +0100 Subject: [PATCH 66/88] and again --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index ef4dc78ca..d63a84a21 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -38,8 +38,8 @@ jobs: npm install @react-native-community/slider@4.0.0-rc.3 npm install react-native-permissions@3.0.0 npx react-native-windows-init --overwrite - npx react-native autolink-windows msbuild.exe /r "./windows/Playground.sln" + npx react-native autolink-windows msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" - name: Upload UWP x64 @@ -83,6 +83,7 @@ jobs: git clone https://github.com/leetal/ios-cmake.git - name: Build Playground iOS run: | + brew install cocoapods npm uninstall -g react-native-cli @react-native-community/cli npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx From 6380a6f0c0bab859c9eecb31b37c365c942dd4f4 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 18:43:47 +0100 Subject: [PATCH 67/88] pods --- .github/workflows/testVersion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index d63a84a21..96883a74c 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -83,7 +83,8 @@ jobs: git clone https://github.com/leetal/ios-cmake.git - name: Build Playground iOS run: | - brew install cocoapods + brew install node + brew install watchman npm uninstall -g react-native-cli @react-native-community/cli npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx From 90b72e6e3d28c260acd226b89df4c935c0f5785b Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Wed, 8 Mar 2023 19:15:43 +0100 Subject: [PATCH 68/88] ios install --- .github/workflows/testVersion.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 96883a74c..d28ab2296 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -86,16 +86,19 @@ jobs: brew install node brew install watchman npm uninstall -g react-native-cli @react-native-community/cli - npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose + npx react-native init Playground --version "${{ github.event.inputs.RN_Version }}" --verbose --skip-install cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground + yarn install npm install @babylonjs/core npm install @babylonjs/loaders npm install @babylonjs/react-native@${{ github.event.inputs.BRN_Version }} npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} npm install @react-native-community/slider - mkdir ios/build - cd ios/build + cd ios + pod install + mkdir build + cd build cmake -G Xcode -DCMAKE_TOOLCHAIN_FILE=../../../ios-cmake/ios.toolchain.cmake -DPLATFORM=OS64COMBINED -DENABLE_ARC=0 -DENABLE_BITCODE=1 -DDEPLOYMENT_TARGET=12 -DENABLE_PCH=OFF .. xcodebuild -sdk iphoneos -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO From 18ac18c1901a2d5838235fc02ce4d6f12242b7b1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Thu, 9 Mar 2023 10:01:46 +0100 Subject: [PATCH 69/88] ios build --- .github/workflows/testVersion.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index d28ab2296..9f2346875 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -97,11 +97,8 @@ jobs: npm install @react-native-community/slider cd ios pod install - mkdir build - cd build - cmake -G Xcode -DCMAKE_TOOLCHAIN_FILE=../../../ios-cmake/ios.toolchain.cmake -DPLATFORM=OS64COMBINED -DENABLE_ARC=0 -DENABLE_BITCODE=1 -DDEPLOYMENT_TARGET=12 -DENABLE_PCH=OFF .. - xcodebuild -sdk iphoneos -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO - xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -project ReactNativeBabylon.xcodeproj -scheme BabylonNative build CODE_SIGNING_ALLOWED=NO + xcodebuild -sdk iphoneos -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO + xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO - name: Upload iOS App uses: actions/upload-artifact@v2 From d73df40d7593c4ff8fd2bb387d07e451df63a54b Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Thu, 9 Mar 2023 12:06:20 +0100 Subject: [PATCH 70/88] more tests --- .github/workflows/testVersion.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 9f2346875..94c21c35e 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -31,15 +31,15 @@ jobs: npx react-native init Playground --version ${{ github.event.inputs.RN_Version }} cp Apps/Playground/playground-shared/App.tsx ./Playground/App.tsx cd Playground + npx react-native-windows-init --overwrite npm install @babylonjs/core npm install @babylonjs/loaders npm install @babylonjs/react-native@${{ github.event.inputs.BRN_Version }} npm install @babylonjs/react-native-iosandroid-${{ github.event.inputs.BRN_Postfix }}@${{ github.event.inputs.BRN_Version }} - npm install @react-native-community/slider@4.0.0-rc.3 - npm install react-native-permissions@3.0.0 - npx react-native-windows-init --overwrite - msbuild.exe /r "./windows/Playground.sln" + npm install @react-native-community/slider + #npm install react-native-permissions@3.0.0 npx react-native autolink-windows + msbuild.exe /r "./windows/Playground.sln" msbuild.exe /p:Configuration="Release" /p:Platform="x64" /m "./windows/Playground.sln" - name: Upload UWP x64 @@ -97,14 +97,14 @@ jobs: npm install @react-native-community/slider cd ios pod install - xcodebuild -sdk iphoneos -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO - xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO + #xcodebuild -sdk iphoneos -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO + xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO -archivePath ./playgroundSimulator.xcarchive archive - name: Upload iOS App uses: actions/upload-artifact@v2 with: name: 'iOSApp' - path: Playground/ios/build + path: Playground/ios/playgroundSimulator.xcarchive # test jobs not working # test-android: From ff7dc8626749562fedfadc0e1034961f509dcceb Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Thu, 9 Mar 2023 15:28:56 +0100 Subject: [PATCH 71/88] test ios-build-action --- .github/workflows/testVersion.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 94c21c35e..41b0c61f2 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -45,7 +45,7 @@ jobs: - name: Upload UWP x64 uses: actions/upload-artifact@v2 with: - name: Upload appx + name: 'WindowsAppx' path: Playground/windows/AppPackages/Playground/Playground_1.0.0.0_x64_Test/Playground_1.0.0.0_x64.appx build-android: @@ -98,13 +98,23 @@ jobs: cd ios pod install #xcodebuild -sdk iphoneos -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO - xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO -archivePath ./playgroundSimulator.xcarchive archive + #xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO -archivePath ./playgroundSimulator.xcarchive archive + + - uses: sparkfabrik/ios-build-action@v2.1.0 + with: + upload-to-testflight: false + workspace-path: Playground/ios/Playground.xcworkspace + export-method: ad-hoc + configuration: Release + scheme: Playground + output-path: Playground/build-${{ github.sha }}.ipa - name: Upload iOS App uses: actions/upload-artifact@v2 with: name: 'iOSApp' - path: Playground/ios/playgroundSimulator.xcarchive + path: Playground/build-${{ github.sha }}.ipa + #Playground/ios/playgroundSimulator.xcarchive # test jobs not working # test-android: From 6a4dbbffb06df7eaba17d93262819abb90e6d306 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Thu, 9 Mar 2023 16:00:18 +0100 Subject: [PATCH 72/88] back to xcodebuild --- .github/workflows/testVersion.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/testVersion.yml b/.github/workflows/testVersion.yml index 41b0c61f2..e57670d00 100644 --- a/.github/workflows/testVersion.yml +++ b/.github/workflows/testVersion.yml @@ -98,23 +98,13 @@ jobs: cd ios pod install #xcodebuild -sdk iphoneos -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO - #xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO -archivePath ./playgroundSimulator.xcarchive archive - - - uses: sparkfabrik/ios-build-action@v2.1.0 - with: - upload-to-testflight: false - workspace-path: Playground/ios/Playground.xcworkspace - export-method: ad-hoc - configuration: Release - scheme: Playground - output-path: Playground/build-${{ github.sha }}.ipa + xcodebuild -sdk iphonesimulator -arch x86_64 -configuration Release -workspace Playground.xcworkspace -scheme Playground build CODE_SIGNING_ALLOWED=NO -archivePath ./playgroundSimulator.xcarchive archive - name: Upload iOS App uses: actions/upload-artifact@v2 with: name: 'iOSApp' - path: Playground/build-${{ github.sha }}.ipa - #Playground/ios/playgroundSimulator.xcarchive + path: Playground/ios/playgroundSimulator.xcarchive # test jobs not working # test-android: From 8e0bf52fb8f47257ef94abfd4d614d4bcc56eb19 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 13 Mar 2023 10:48:46 +0100 Subject: [PATCH 73/88] test BN protocol tool and github action --- .github/workflows/test_protocol.yml | 29 ++ Apps/TestProtocol/package-lock.json | 415 ++++++++++++++++++++++++++++ Apps/TestProtocol/package.json | 15 + Apps/TestProtocol/testBNProtocol.js | 130 +++++++++ 4 files changed, 589 insertions(+) create mode 100644 .github/workflows/test_protocol.yml create mode 100644 Apps/TestProtocol/package-lock.json create mode 100644 Apps/TestProtocol/package.json create mode 100644 Apps/TestProtocol/testBNProtocol.js diff --git a/.github/workflows/test_protocol.yml b/.github/workflows/test_protocol.yml new file mode 100644 index 000000000..d804794f2 --- /dev/null +++ b/.github/workflows/test_protocol.yml @@ -0,0 +1,29 @@ +name: Test BabylonNative Protocol compatibility +on: + workflow_dispatch: + inputs: + NPM_Mask: + description: 'NPM versions mask' + required: true + type: string + default: 5.*.* + +jobs: + build: + runs-on: windows-2019 + + steps: + - name: Checkout + uses: actions/checkout@master + - name: NPM Install + run: npm install + working-directory: ./Apps/TestProtocol + - name: Run tests + run: npm run testPackages ${{ github.event.inputs.NPM_Mask }} + working-directory: ./Apps/TestProtocol + - name: Upload Result + uses: actions/upload-artifact@v2 + with: + name: NPMCompatibility + path: | + ./compatibility.json \ No newline at end of file diff --git a/Apps/TestProtocol/package-lock.json b/Apps/TestProtocol/package-lock.json new file mode 100644 index 000000000..49c1b455a --- /dev/null +++ b/Apps/TestProtocol/package-lock.json @@ -0,0 +1,415 @@ +{ + "name": "testcompatibility", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "testcompatibility", + "version": "0.0.1", + "dependencies": { + "babylonjs": "^5.0.3", + "babylonjs-gui": "^5.0.3", + "babylonjs-loaders": "^5.0.3", + "babylonjs-materials": "^5.0.3", + "shelljs": "^0.8.4" + } + }, + "node_modules/babylonjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-5.0.3.tgz", + "integrity": "sha512-FcvNJHOn9wJ+geohPCFOa2RwwADz3Ep1gyPeWui8C96KwbKXrW/k02N1Uh5MyMu8s2P9thPCHr298lrTs5pwnQ==" + }, + "node_modules/babylonjs-gltf2interface": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.50.1.tgz", + "integrity": "sha512-FgXTm/N0Vz/K4FA0X5OoHxQ7tyacxRvfd8MBYMEtvSSTyDpYEiEqhEmcUgAON0OGGJ3fBYl9jZXromXO2NG7ow==" + }, + "node_modules/babylonjs-gui": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-5.0.3.tgz", + "integrity": "sha512-kyeNLfZ3hrK2MLkhX9VBy40Y0B7b7IqZhqQwK36BULKie7i6cL7PZbCh5jRndW1m19qT+nb0ePmbV27zAxZjNg==", + "dependencies": { + "babylonjs": "^5.0.3" + } + }, + "node_modules/babylonjs-loaders": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-5.0.3.tgz", + "integrity": "sha512-3OAP06RsTj+DNVcVZyIOkJdU1SeJzrnHm5EiIS0EtSChAFVSJimY3q6MVm1VzSxqJtrdbe3AOG4qI5NOnSja/w==", + "dependencies": { + "babylonjs": "^5.0.3", + "babylonjs-gltf2interface": "^5.0.3" + } + }, + "node_modules/babylonjs-materials": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-5.0.3.tgz", + "integrity": "sha512-VQ4Z5VU11AjjK+/ragkVdiIjvnCDzsYULTdKNDiKBmKxU1Idq9DM2TI9AO2LipZauXXvd0YhJSlVX5fCkG+Ubg==", + "dependencies": { + "babylonjs": "^5.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + }, + "dependencies": { + "babylonjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-5.0.3.tgz", + "integrity": "sha512-FcvNJHOn9wJ+geohPCFOa2RwwADz3Ep1gyPeWui8C96KwbKXrW/k02N1Uh5MyMu8s2P9thPCHr298lrTs5pwnQ==" + }, + "babylonjs-gltf2interface": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.50.1.tgz", + "integrity": "sha512-FgXTm/N0Vz/K4FA0X5OoHxQ7tyacxRvfd8MBYMEtvSSTyDpYEiEqhEmcUgAON0OGGJ3fBYl9jZXromXO2NG7ow==" + }, + "babylonjs-gui": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-5.0.3.tgz", + "integrity": "sha512-kyeNLfZ3hrK2MLkhX9VBy40Y0B7b7IqZhqQwK36BULKie7i6cL7PZbCh5jRndW1m19qT+nb0ePmbV27zAxZjNg==", + "requires": { + "babylonjs": "^5.0.3" + } + }, + "babylonjs-loaders": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-5.0.3.tgz", + "integrity": "sha512-3OAP06RsTj+DNVcVZyIOkJdU1SeJzrnHm5EiIS0EtSChAFVSJimY3q6MVm1VzSxqJtrdbe3AOG4qI5NOnSja/w==", + "requires": { + "babylonjs": "^5.0.3", + "babylonjs-gltf2interface": "^5.0.3" + } + }, + "babylonjs-materials": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-5.0.3.tgz", + "integrity": "sha512-VQ4Z5VU11AjjK+/ragkVdiIjvnCDzsYULTdKNDiKBmKxU1Idq9DM2TI9AO2LipZauXXvd0YhJSlVX5fCkG+Ubg==", + "requires": { + "babylonjs": "^5.0.3" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Apps/TestProtocol/package.json b/Apps/TestProtocol/package.json new file mode 100644 index 000000000..88b87511b --- /dev/null +++ b/Apps/TestProtocol/package.json @@ -0,0 +1,15 @@ +{ + "name": "testcompatibility", + "version": "0.0.1", + "private": true, + "scripts": { + "testPackages": "node testBNProtocol.js" + }, + "dependencies": { + "babylonjs": "^5.0.3", + "babylonjs-gui": "^5.0.3", + "babylonjs-loaders": "^5.0.3", + "babylonjs-materials": "^5.0.3", + "shelljs": "^0.8.4" + } +} diff --git a/Apps/TestProtocol/testBNProtocol.js b/Apps/TestProtocol/testBNProtocol.js new file mode 100644 index 000000000..5c347d28d --- /dev/null +++ b/Apps/TestProtocol/testBNProtocol.js @@ -0,0 +1,130 @@ +const fs = require('fs'); +const shelljs = require('shelljs'); + +let compatibility = []; +function execute(command, workingDirectory, callback){ + const res = shelljs.exec(command, { fatal: false, cwd: workingDirectory, async: false }); + callback(res.code, res.stdout, res.stderr); +}; + +function copy(source, destination) { + fs.copyFileSync(source, destination); + console.log(`${source} was copied to ${destination}`); +} + +const protocolChecker = "//BRNCHECK\r\nconsole.log(' * Checking Babylon.js / BabylonNative protocols');\r\n"+ + "if (_native.Engine.PROTOCOL_VERSION !== BABYLON.NativeEngine.PROTOCOL_VERSION) {\r\n"+ + "console.log(` * Protocol version mismatch: ${_native.Engine.PROTOCOL_VERSION} (Native) !== ${BABYLON.NativeEngine.PROTOCOL_VERSION} (JS)`);\r\n"+ + "TestUtils.exit(-1); } else { console.log(' * Protocol version OK! '); }\r\n"+ + "console.error = function(errorMsg) { console.log(errorMsg); TestUtils.exit(-1);}\r\n"; + +const exeFolder = './BabylonNative/build/Apps/ValidationTests/Release'; +const filesToCopy = [ + {source:'babylonjs', files:['babylon.max.js', 'babylon.max.js.map']}, + {source:'babylonjs-gui', files:['babylon.gui.js', 'babylon.gui.js.map']}, + {source:'babylonjs-loaders', files:['babylonjs.loaders.js', 'babylonjs.loaders.js.map']}, + {source:'babylonjs-materials', files:['babylonjs.materials.js', 'babylonjs.materials.js.map']}]; + +const BRNVersions = [ + {tag:'1.4.0', hash:'5859ffa'}, + {tag:'1.4.1', hash:'70bb77a'}, + {tag:'1.4.2', hash:'5990087'}, + {tag:'1.4.3', hash:'301ab90'}, + {tag:'1.4.4', hash:'75954f4'}, + {tag:'1.5.0', hash:'75954f4'}, + {tag:'1.5.1', hash:'a2cf1c7'}, + {tag:'1.5.4-preview', hash:'409bc4b'}]; + +function patchTestScript() { + const filePath = `${exeFolder}/Scripts/validation_native.js`; + console.log("Patching test script."); + const testScript = fs.readFileSync(filePath); + if (testScript.includes("//BRNCHECK")) { + // already patched + return; + } + const newContent = protocolChecker + testScript; + fs.writeFileSync(filePath, newContent); +} + +function checkoutAndBuildBN(tag, hash, callback) { + console.log("Git clone."); + execute('git clone https://github.com/BabylonJS/BabylonNative.git', './', (error, stdout, stderr) => { + console.log("Submodule update."); + execute('git submodule update --init --recursive', './BabylonNative', (error, stdout, stderr) => { + //if (error) throw error; + console.log(`Checkout tag ${hash}.`); + execute(`git checkout ${hash}`, "./BabylonNative", (error, stdout, stderr) => { + if (error) throw error; + execute('git submodule update --recursive', './BabylonNative', (error, stdout, stderr) => { + console.log('Making build directory.'); + fs.rmSync('./BabylonNative/build', { recursive: true, force: true }); + execute(`mkdir build`, "./BabylonNative", (error, stdout, stderr) => { + if (error) throw error; + execute(`npm install`, "./BabylonNative/Apps", (error, stdout, stderr) => { + if (error) throw error; + console.log('Building win32 project.'); + + execute(`cmake -G "Visual Studio 16 2019" -A x64 ..`, "./BabylonNative/build", (error, stdout, stderr) => { + if (error) throw error; + console.log('Building win32 apps.'); + execute(`cmake --build build --config Release`, "./BabylonNative", (error, stdout, stderr) => { + if (error) throw error; + patchTestScript(); + callback(tag, hash); + }); + }); + }); + }); + }); + }); + }); + }); +} + +function testPackages(tag, hash) { + let compatiblePackageVersions = []; + console.log("Getting NPM versions ..."); + execute("npm show babylonjs@5.*.* version --json", "./", (error, stdout, stderr) => { + if (error) throw error; + + const versions = JSON.parse(stdout); + + versions.forEach(version => { + console.log("-".repeat(30)); + console.log(`Installing packages for ${version}`); + execute(`npm install babylonjs@${version} babylonjs-gui@${version} babylonjs-loaders@${version} babylonjs-materials@${version}`, "./", (error, stdout, stderr) => { + if (error) throw error; + + // copy package .js + console.log("Copying packages files."); + filesToCopy.forEach(entry => { + entry.files.forEach(file => { + copy(`node_modules/${entry.source}/${file}`, `${exeFolder}/Scripts/${file}`); + }); + }); + + // run validation test + console.log("Running validation tests."); + execute("ValidationTests", exeFolder, (error, stdout, stderr) => { + console.log(`Error Code ${error}`); + if (!!error) { + console.log(`${version} Failed!`); + } else { + compatiblePackageVersions.push(version); + console.log(`${version} OK!`); + } + }); + }); + }); + }); + console.log(`Compatible versions for BabylonReactNative ${tag} using BabylonNative ${hash}:`, compatiblePackageVersions); + compatibility.push({tag:tag, hash:hash, npms:compatiblePackageVersions}); +} + +BRNVersions.forEach((versionToTest) =>{ + checkoutAndBuildBN(versionToTest.tag, versionToTest.hash,(tag, hash) => { testPackages(tag, hash); }); +}); + +// and out! +fs.writeFileSync("compatibility.json", JSON.stringify(compatibility)); \ No newline at end of file From f2cd81f3819541fbf32f528c943f519037a9686f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 13 Mar 2023 10:54:24 +0100 Subject: [PATCH 74/88] pr.yml fix --- .github/workflows/pr.yml | 46 +++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b3f5e396e..db9e10c25 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -145,16 +145,52 @@ jobs: build-android-ios-065: uses: ./.github/workflows/ios_android.yml with: - react-native-version: 0.65 - release-version: 2.0.0 # dummy version + react-native-version: '0.65' + release-version: 0.0.${GITHUB_SHA::8} + + build-android-ios-069: + uses: ./.github/workflows/ios_android.yml + with: + react-native-version: '0.69' + release-version: 0.0.${GITHUB_SHA::8} + + build-android-ios-070: + uses: ./.github/workflows/ios_android.yml + with: + react-native-version: '0.70' + release-version: 0.0.${GITHUB_SHA::8} + + build-android-ios-071: + uses: ./.github/workflows/ios_android.yml + with: + react-native-version: '0.71' + release-version: 0.0.${GITHUB_SHA::8} build-windows-065: uses: ./.github/workflows/windows.yml with: - react-native-version: 0.65 - release-version: 2.0.0 + react-native-version: '0.65' + release-version: 0.0.${GITHUB_SHA::8} + + build-windows-069: + uses: ./.github/workflows/windows.yml + with: + react-native-version: '0.69' + release-version: 0.0.${GITHUB_SHA::8} + + build-windows-070: + uses: ./.github/workflows/windows.yml + with: + react-native-version: '0.70' + release-version: 0.0.${GITHUB_SHA::8} + + build-windows-071: + uses: ./.github/workflows/windows.yml + with: + react-native-version: '0.71' + release-version: 0.0.${GITHUB_SHA::8} build-typescript: uses: ./.github/workflows/typescript.yml with: - release-version: 2.0.0 + release-version: 0.0.${GITHUB_SHA::8} \ No newline at end of file From d754efd6daa6036177fa6496b09d74e170f57ebf Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 13 Mar 2023 10:55:32 +0100 Subject: [PATCH 75/88] EoL --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index db9e10c25..eb34d5003 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -193,4 +193,4 @@ jobs: build-typescript: uses: ./.github/workflows/typescript.yml with: - release-version: 0.0.${GITHUB_SHA::8} \ No newline at end of file + release-version: 0.0.${GITHUB_SHA::8} From 9c28c0dc654208a03a0af63864cb0ac39ecdbb11 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 13 Mar 2023 11:14:52 +0100 Subject: [PATCH 76/88] documentation --- Documentation/Images/protocolTest.jpg | Bin 0 -> 118085 bytes Documentation/TestingProtocol.md | 35 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 Documentation/Images/protocolTest.jpg create mode 100644 Documentation/TestingProtocol.md diff --git a/Documentation/Images/protocolTest.jpg b/Documentation/Images/protocolTest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad04734fc39ab32745255f3ff79c1ed411093111 GIT binary patch literal 118085 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Ξ_e%!TjsAqrrH2ec`YHZ(?&bb;YOgfpOW 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�|j26_clA5peiRMeL8j( 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 T;T6T4tcVAoDk_ie=h(jibO`V0 literal 0 HcmV?d00001 diff --git a/Documentation/TestingProtocol.md b/Documentation/TestingProtocol.md new file mode 100644 index 000000000..3e3f4b7c7 --- /dev/null +++ b/Documentation/TestingProtocol.md @@ -0,0 +1,35 @@ +# Testing BabylonNative Protocol + +`Apps/TestProtocol` is a semi-automated tool to test compatibility between BabylonReactNative (more specificaly BabylonNative) +and Babylon.js NPM packages. +It checkouts, build and run validation tests for every BabylonNative hash version from a list and every Babylon.js NPM package. +NPM Package version must correspond to a mask provided to the script. + +## Testing localy + +Testing takes time and multiple windows get opened and closed. This will make working in parrallel a bit difficult. Best is to leave running script without using the PC. + +Clone BabylonReactNative repo then : +``` +cd Apps/TestProtocol +npm i +npm run testPackages +``` + +Result is a JSON file named `compatibility.json`. + +## Testing on CI + +Go to GitHub Action. + + + +Result is the same .JSON as earlier than can be download as an artifact + +## Results + +Resulting JSON is an array that contains a list of Babylon.js NPM versions compatible with the BabylonNative commit hash. +There is a 1-1 link between a BabylonReactNative released version and a BabylonNative commit. + +Note: The script test is very restrictive. Any protocol version mismatch, a crash, a bad Validation test ,... will result in that specific version to not be compatible. +This means that a version marked as compatible is sure to run, at least, all the validation tests. \ No newline at end of file From aec9e530b1171a47537487a6534ae2aa2f40ba95 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Mon, 13 Mar 2023 15:43:05 +0100 Subject: [PATCH 77/88] path fix for compatibility --- .github/workflows/test_protocol.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_protocol.yml b/.github/workflows/test_protocol.yml index d804794f2..6c281fbe5 100644 --- a/.github/workflows/test_protocol.yml +++ b/.github/workflows/test_protocol.yml @@ -26,4 +26,4 @@ jobs: with: name: NPMCompatibility path: | - ./compatibility.json \ No newline at end of file + ./Apps/TestProtocol/compatibility.json \ No newline at end of file From e48945f6dfcb05fda50a2e63a824154ad55c3ca6 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Tue, 14 Mar 2023 16:54:46 +0100 Subject: [PATCH 78/88] removed protocol word --- .../package-lock.json | 0 .../package.json | 2 +- .../testBNCompatibility.js} | 0 .../{protocolTest.jpg => compatibilityTest.jpg} | Bin .../{TestingProtocol.md => TestingCompatibility.md} | 10 +++++----- 5 files changed, 6 insertions(+), 6 deletions(-) rename Apps/{TestProtocol => TestCompatibility}/package-lock.json (100%) rename Apps/{TestProtocol => TestCompatibility}/package.json (83%) rename Apps/{TestProtocol/testBNProtocol.js => TestCompatibility/testBNCompatibility.js} (100%) rename Documentation/Images/{protocolTest.jpg => compatibilityTest.jpg} (100%) rename Documentation/{TestingProtocol.md => TestingCompatibility.md} (70%) diff --git a/Apps/TestProtocol/package-lock.json b/Apps/TestCompatibility/package-lock.json similarity index 100% rename from Apps/TestProtocol/package-lock.json rename to Apps/TestCompatibility/package-lock.json diff --git a/Apps/TestProtocol/package.json b/Apps/TestCompatibility/package.json similarity index 83% rename from Apps/TestProtocol/package.json rename to Apps/TestCompatibility/package.json index 88b87511b..58294d01d 100644 --- a/Apps/TestProtocol/package.json +++ b/Apps/TestCompatibility/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "scripts": { - "testPackages": "node testBNProtocol.js" + "testCompatibility": "node testBNCompatibility.js" }, "dependencies": { "babylonjs": "^5.0.3", diff --git a/Apps/TestProtocol/testBNProtocol.js b/Apps/TestCompatibility/testBNCompatibility.js similarity index 100% rename from Apps/TestProtocol/testBNProtocol.js rename to Apps/TestCompatibility/testBNCompatibility.js diff --git a/Documentation/Images/protocolTest.jpg b/Documentation/Images/compatibilityTest.jpg similarity index 100% rename from Documentation/Images/protocolTest.jpg rename to Documentation/Images/compatibilityTest.jpg diff --git a/Documentation/TestingProtocol.md b/Documentation/TestingCompatibility.md similarity index 70% rename from Documentation/TestingProtocol.md rename to Documentation/TestingCompatibility.md index 3e3f4b7c7..48bfb97df 100644 --- a/Documentation/TestingProtocol.md +++ b/Documentation/TestingCompatibility.md @@ -1,6 +1,6 @@ -# Testing BabylonNative Protocol +# Testing BabylonNative Compatibility -`Apps/TestProtocol` is a semi-automated tool to test compatibility between BabylonReactNative (more specificaly BabylonNative) +`Apps/TestCompatibility` is a semi-automated tool to test compatibility between BabylonReactNative (more specificaly BabylonNative) and Babylon.js NPM packages. It checkouts, build and run validation tests for every BabylonNative hash version from a list and every Babylon.js NPM package. NPM Package version must correspond to a mask provided to the script. @@ -11,7 +11,7 @@ Testing takes time and multiple windows get opened and closed. This will make wo Clone BabylonReactNative repo then : ``` -cd Apps/TestProtocol +cd Apps/TestCompatibility npm i npm run testPackages ``` @@ -22,7 +22,7 @@ Result is a JSON file named `compatibility.json`. Go to GitHub Action. - + Result is the same .JSON as earlier than can be download as an artifact @@ -31,5 +31,5 @@ Result is the same .JSON as earlier than can be download as an artifact Resulting JSON is an array that contains a list of Babylon.js NPM versions compatible with the BabylonNative commit hash. There is a 1-1 link between a BabylonReactNative released version and a BabylonNative commit. -Note: The script test is very restrictive. Any protocol version mismatch, a crash, a bad Validation test ,... will result in that specific version to not be compatible. +Note: The script test is very restrictive. Any compatibility version mismatch, a crash, a bad Validation test ,... will result in that specific version to not be compatible. This means that a version marked as compatible is sure to run, at least, all the validation tests. \ No newline at end of file From b168e48b5c6107ac57d59bcb7b5c37bfdb5b56cf Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <cedric.guillemet@gmail.com> Date: Tue, 14 Mar 2023 16:56:57 +0100 Subject: [PATCH 79/88] even more compat --- .../{test_protocol.yml => test_compatibility.yml} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename .github/workflows/{test_protocol.yml => test_compatibility.yml} (73%) diff --git a/.github/workflows/test_protocol.yml b/.github/workflows/test_compatibility.yml similarity index 73% rename from .github/workflows/test_protocol.yml rename to .github/workflows/test_compatibility.yml index 6c281fbe5..a76d443a2 100644 --- a/.github/workflows/test_protocol.yml +++ b/.github/workflows/test_compatibility.yml @@ -1,4 +1,4 @@ -name: Test BabylonNative Protocol compatibility +name: Test BabylonNative Compatibility on: workflow_dispatch: inputs: @@ -17,13 +17,13 @@ jobs: uses: actions/checkout@master - name: NPM Install run: npm install - working-directory: ./Apps/TestProtocol + working-directory: ./Apps/TestCompatibility - name: Run tests run: npm run testPackages ${{ github.event.inputs.NPM_Mask }} - working-directory: ./Apps/TestProtocol + working-directory: ./Apps/TestCompatibility - name: Upload Result uses: actions/upload-artifact@v2 with: name: NPMCompatibility path: | - ./Apps/TestProtocol/compatibility.json \ No newline at end of file + ./Apps/TestCompatibility/compatibility.json \ No newline at end of file From 3ea15e837c967c4a690a0e39b2844e58b239bc00 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 23 May 2023 15:47:17 +0200 Subject: [PATCH 80/88] fix test bjs mask as parameter --- Apps/TestCompatibility/testBNCompatibility.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Apps/TestCompatibility/testBNCompatibility.js b/Apps/TestCompatibility/testBNCompatibility.js index 5c347d28d..da1b97e74 100644 --- a/Apps/TestCompatibility/testBNCompatibility.js +++ b/Apps/TestCompatibility/testBNCompatibility.js @@ -26,14 +26,11 @@ const filesToCopy = [ {source:'babylonjs-materials', files:['babylonjs.materials.js', 'babylonjs.materials.js.map']}]; const BRNVersions = [ - {tag:'1.4.0', hash:'5859ffa'}, - {tag:'1.4.1', hash:'70bb77a'}, - {tag:'1.4.2', hash:'5990087'}, {tag:'1.4.3', hash:'301ab90'}, {tag:'1.4.4', hash:'75954f4'}, {tag:'1.5.0', hash:'75954f4'}, {tag:'1.5.1', hash:'a2cf1c7'}, - {tag:'1.5.4-preview', hash:'409bc4b'}]; + {tag:'1.6.0', hash:'409bc4b'}]; function patchTestScript() { const filePath = `${exeFolder}/Scripts/validation_native.js`; @@ -84,8 +81,15 @@ function checkoutAndBuildBN(tag, hash, callback) { function testPackages(tag, hash) { let compatiblePackageVersions = []; + + let bjsMask = '5.*.*'; + const [bjsVersion] = process.argv.slice(2); + if (bjsVersion != '') { + bjsMask = bjsVersion; + } + console.log("Getting NPM versions ..."); - execute("npm show babylonjs@5.*.* version --json", "./", (error, stdout, stderr) => { + execute(`npm show babylonjs@${bjsMask} version --json`, "./", (error, stdout, stderr) => { if (error) throw error; const versions = JSON.parse(stdout); From 7c7c844cc1bc9e4c044d745e70afa0f9721e53b4 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 23 May 2023 16:15:45 +0200 Subject: [PATCH 81/88] Update Documentation/TestingCompatibility.md Co-authored-by: Andy Fillebrown <andy@docEdub.com> --- Documentation/TestingCompatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TestingCompatibility.md b/Documentation/TestingCompatibility.md index 48bfb97df..72a06d2a9 100644 --- a/Documentation/TestingCompatibility.md +++ b/Documentation/TestingCompatibility.md @@ -31,5 +31,5 @@ Result is the same .JSON as earlier than can be download as an artifact Resulting JSON is an array that contains a list of Babylon.js NPM versions compatible with the BabylonNative commit hash. There is a 1-1 link between a BabylonReactNative released version and a BabylonNative commit. -Note: The script test is very restrictive. Any compatibility version mismatch, a crash, a bad Validation test ,... will result in that specific version to not be compatible. +Note: The script test is very restrictive. Any compatibility version mismatch, a crash, a bad Validation test ,... will result in that specific version being incompatible. This means that a version marked as compatible is sure to run, at least, all the validation tests. \ No newline at end of file From 6aa53712f41baa74b68364daf6ab30aea9e64e69 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Tue, 23 May 2023 16:15:51 +0200 Subject: [PATCH 82/88] Update Documentation/TestingCompatibility.md Co-authored-by: Andy Fillebrown <andy@docEdub.com> --- Documentation/TestingCompatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/TestingCompatibility.md b/Documentation/TestingCompatibility.md index 72a06d2a9..ce7104cb5 100644 --- a/Documentation/TestingCompatibility.md +++ b/Documentation/TestingCompatibility.md @@ -2,7 +2,7 @@ `Apps/TestCompatibility` is a semi-automated tool to test compatibility between BabylonReactNative (more specificaly BabylonNative) and Babylon.js NPM packages. -It checkouts, build and run validation tests for every BabylonNative hash version from a list and every Babylon.js NPM package. +It checks out, builds and runs validation tests for every BabylonNative hash version from a list and every Babylon.js NPM package. NPM Package version must correspond to a mask provided to the script. ## Testing localy From 76388a0d1a83414326a2e0b614ab0e6bf05d09d1 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Wed, 24 May 2023 09:30:25 +0200 Subject: [PATCH 83/88] SLA update for 1.6.0 package (#579) --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 82b323d29..4da6c93a5 100644 --- a/README.md +++ b/README.md @@ -227,11 +227,11 @@ For iOS the XCode project needs to be generated with `CMake` as described [above | React Native | Babylon React Native | |---|---| -| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.5.4-preview| -| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.5.4-preview | -| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.5.4-preview | -| 0.70 | 1.5.0, 1.5.1, 1.5.4-preview | -| 0.71 | 1.5.4-preview | +| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0| +| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0 | +| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0 | +| 0.70 | 1.5.0, 1.5.1, 1.6.0 | +| 0.71 | 1.6.0 | Here are the package names for Android/iOS and Windows: @@ -254,11 +254,11 @@ Depending on the Babylon React Native NPM package version, some Babylon.js NPM d | 1.4.0 | 5.27.1 | | 1.4.1 | 5.32.2, 5.33.0, 5.33.1, 5.33.2, 5.34.0, 5.35.0 | | 1.4.2 | 5.35.1, 5.36.0, 5.37.0, 5.38.0, 5.39.0, 5.42.0, 5.42.1 | -| 1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | -| 1.5.4-preview | 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1 | +| 1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.6.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | ## Security From dfc218eb0a5b47c4443e31ae06b3f514c0154b0f Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Thu, 1 Jun 2023 17:50:28 +0200 Subject: [PATCH 84/88] Agnostic toolset for VS project + std link issue with MSVC 17.2+ (#580) * Agnostic toolset for VS project * platform tool version * pragma for std * Update Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj Co-authored-by: Gary Hsu <bghgary@users.noreply.github.com> * update windows readme --------- Co-authored-by: Gary Hsu <bghgary@users.noreply.github.com> --- Modules/@babylonjs/react-native-windows/README.md | 8 ++++++++ .../windows/BabylonReactNative/BabylonModule.cpp | 6 ++++++ .../windows/BabylonReactNative/BabylonReactNative.vcxproj | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Modules/@babylonjs/react-native-windows/README.md b/Modules/@babylonjs/react-native-windows/README.md index 4a84b9a19..e9ff6dc1f 100644 --- a/Modules/@babylonjs/react-native-windows/README.md +++ b/Modules/@babylonjs/react-native-windows/README.md @@ -10,3 +10,11 @@ This package has several **peer dependencies**. If these dependencies are unmet, This package will not work without installing the `@babylonjs/react-native` peer dependency. The `react-native-permissions` dependency is required for XR capabilities of Babylon.js. + +### Toolset + +Default toolset is v142. It's possible to change it using project variable named `BabylonReactNativeToolset`. +There are multiple ways to specify it: +- environment variable +- msbuild property (`msbuild /p:BabylonReactNativeToolset=v143` for example) +- customize the build by folder (https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-by-directory?view=vs-2022) \ No newline at end of file diff --git a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp index 240cbc662..6cb24ca85 100644 --- a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp +++ b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonModule.cpp @@ -2,6 +2,12 @@ #include "BabylonModule.h" #include "JSI/JsiApiContext.h" +// see https://developercommunity.visualstudio.com/t/-imp-std-init-once-complete-unresolved-external-sy/1684365 +#if _MSC_VER >= 1932 // Visual Studio 2022 version 17.2+ +# pragma comment(linker, "/alternatename:__imp___std_init_once_complete=__imp_InitOnceComplete") +# pragma comment(linker, "/alternatename:__imp___std_init_once_begin_initialize=__imp_InitOnceBeginInitialize") +#endif + using namespace winrt::BabylonReactNative::implementation; REACT_INIT(Initialize); diff --git a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj index 6960fe7a2..818b25733 100644 --- a/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj +++ b/Modules/@babylonjs/react-native-windows/windows/BabylonReactNative/BabylonReactNative.vcxproj @@ -77,8 +77,8 @@ <PropertyGroup Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <PlatformToolset>v142</PlatformToolset> - <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset> - <PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset> + <PlatformToolset Condition="'$(BabylonReactNativeToolset)'!=''">$(BabylonReactNativeToolset)</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> <GenerateManifest>false</GenerateManifest> <PreferredToolArchitecture>x64</PreferredToolArchitecture> From 1033c2fb7178468926816bc13a15b304664c5e08 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Thu, 1 Jun 2023 19:54:18 +0200 Subject: [PATCH 85/88] 1.6.1 SLA update (#581) * 1.6.1 SLA update * removed empty space --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 4da6c93a5..108b6029c 100644 --- a/README.md +++ b/README.md @@ -227,11 +227,11 @@ For iOS the XCode project needs to be generated with `CMake` as described [above | React Native | Babylon React Native | |---|---| -| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0| -| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0 | -| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0 | -| 0.70 | 1.5.0, 1.5.1, 1.6.0 | -| 0.71 | 1.6.0 | +| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | +| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | +| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | +| 0.70 | 1.5.0, 1.5.1, 1.6.0, 1.6.1 | +| 0.71 | 1.6.0, 1.6.1 | Here are the package names for Android/iOS and Windows: @@ -251,14 +251,15 @@ Depending on the Babylon React Native NPM package version, some Babylon.js NPM d | Babylon React Native | Babylon.js ([@babylonjs/core](https://www.npmjs.com/package/@babylonjs/core), [@babylonjs/loaders](https://www.npmjs.com/package/@babylonjs/loaders), ...) | |---|---| -| 1.4.0 | 5.27.1 | -| 1.4.1 | 5.32.2, 5.33.0, 5.33.1, 5.33.2, 5.34.0, 5.35.0 | -| 1.4.2 | 5.35.1, 5.36.0, 5.37.0, 5.38.0, 5.39.0, 5.42.0, 5.42.1 | -| 1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.1, 6.4.0, 6.4.1 | -| 1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | -| 1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | -| 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | -| 1.6.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | +| 1.4.0 | 5.27.1 | +| 1.4.1 | 5.32.2, 5.33.0, 5.33.1, 5.33.2, 5.34.0, 5.35.0 | +| 1.4.2 | 5.35.1, 5.36.0, 5.37.0, 5.38.0, 5.39.0, 5.42.0, 5.42.1 | +| 1.4.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.4.4 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.5.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | +| 1.6.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | +| 1.6.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | ## Security From aafbad864d6eb6b08c4461caa8d77583e9aa4da3 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Thu, 22 Jun 2023 17:53:41 +0200 Subject: [PATCH 86/88] SLA for RN 0.72 (#584) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 108b6029c..9ed4c90ff 100644 --- a/README.md +++ b/README.md @@ -231,7 +231,7 @@ For iOS the XCode project needs to be generated with `CMake` as described [above | 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | | 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | | 0.70 | 1.5.0, 1.5.1, 1.6.0, 1.6.1 | -| 0.71 | 1.6.0, 1.6.1 | +| 0.71 -> 0.72 | 1.6.0, 1.6.1 | Here are the package names for Android/iOS and Windows: @@ -241,7 +241,7 @@ Here are the package names for Android/iOS and Windows: | 0.65 -> 0.68 | [@babylonjs/react-native-iosandroid-0-65](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-65) | [@babylonjs/react-native-windows-0-65](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-65) | | 0.69 | [@babylonjs/react-native-iosandroid-0-69](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-69) | [@babylonjs/react-native-windows-0-69](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-69) | | 0.70 | [@babylonjs/react-native-iosandroid-0-70](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-70) | [@babylonjs/react-native-windows-0-70](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-70) | -| 0.71 | [@babylonjs/react-native-iosandroid-0-71](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-71) | [@babylonjs/react-native-windows-0-71](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-71) | +| 0.71 -> 0.72 | [@babylonjs/react-native-iosandroid-0-71](https://www.npmjs.com/package/@babylonjs/react-native-iosandroid-0-71) | [@babylonjs/react-native-windows-0-71](https://www.npmjs.com/package/@babylonjs/react-native-windows-0-71) | Also, [@babylonjs/react-native](https://www.npmjs.com/package/@babylonjs/react-native) is a needed dependency for all platforms. From ca1663ffda25c47d731a313705ced28308b09245 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Thu, 20 Jul 2023 18:02:15 +0200 Subject: [PATCH 87/88] Update BN submodule (#589) * Update BN submodule * BN #883ba13 * a676d6df117cb6cdebc5c347b8aa37f2fed852fb * cmake + brn up * cmake update * removed comment * comment * GraphicsDevice * graphics init * android rn 0.71 * back to 0.64 --- .github/workflows/bn_master_commit.yml | 2 +- .github/workflows/ios_android.yml | 2 +- .github/workflows/pr.yml | 4 +- .../android/CMakeLists.txt | 4 +- .../android/build.gradle | 2 +- .../ios/CMakeLists.txt | 2 +- .../submodules/BabylonNative | 2 +- .../windows/CMakeLists.txt | 2 +- .../react-native/shared/BabylonNative.cpp | 48 +++++++++---------- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/bn_master_commit.yml b/.github/workflows/bn_master_commit.yml index 85b2f9cf3..beaf3270c 100644 --- a/.github/workflows/bn_master_commit.yml +++ b/.github/workflows/bn_master_commit.yml @@ -23,7 +23,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: NPM Install (Playground) diff --git a/.github/workflows/ios_android.yml b/.github/workflows/ios_android.yml index 12d6316cc..f501f8e61 100644 --- a/.github/workflows/ios_android.yml +++ b/.github/workflows/ios_android.yml @@ -28,7 +28,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: 'Select XCode ${{ inputs.xcode-version }}' diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index eb34d5003..0d762adbd 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -21,7 +21,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: NPM Install (Playground) @@ -77,7 +77,7 @@ jobs: - name: Setup CMake uses: jwlawson/actions-setup-cmake@v1.8 with: - cmake-version: '3.19.6' # See https://gitlab.kitware.com/cmake/cmake/-/issues/22021 + cmake-version: '3.26.3' - name: Setup Ninja run: brew install ninja - name: NPM Install (Playground) diff --git a/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt b/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt index 99bd84ed3..1396477f9 100644 --- a/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt +++ b/Modules/@babylonjs/react-native-iosandroid/android/CMakeLists.txt @@ -134,7 +134,7 @@ if (EXISTS "${TURBOMODULE_DIR}/CMakeLists.txt") turbomodulejsijni # prefab ready yoga # prefab ready AndroidExtensions - Graphics + GraphicsDevice JsRuntime NativeCamera NativeCapture @@ -196,7 +196,7 @@ else() jsi turbomodulejsijni AndroidExtensions - Graphics + GraphicsDevice JsRuntime NativeCamera NativeCapture diff --git a/Modules/@babylonjs/react-native-iosandroid/android/build.gradle b/Modules/@babylonjs/react-native-iosandroid/android/build.gradle index e7dfd3fd0..c64e1ec91 100644 --- a/Modules/@babylonjs/react-native-iosandroid/android/build.gradle +++ b/Modules/@babylonjs/react-native-iosandroid/android/build.gradle @@ -109,7 +109,7 @@ android { } externalNativeBuild { cmake { - version '3.19.6' + version '3.19.6+' path 'CMakeLists.txt' } } diff --git a/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt b/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt index fadbf2538..23ff53114 100644 --- a/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt +++ b/Modules/@babylonjs/react-native-iosandroid/ios/CMakeLists.txt @@ -42,7 +42,7 @@ target_include_directories(BabylonNative PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(BabylonNative z arcana - Graphics + GraphicsDevice jsi reactnative JsRuntime diff --git a/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative b/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative index 409bc4b31..c89031ec5 160000 --- a/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative +++ b/Modules/@babylonjs/react-native-iosandroid/submodules/BabylonNative @@ -1 +1 @@ -Subproject commit 409bc4b3178a5140462c618293e5ff984dfe5bd5 +Subproject commit c89031ec58bca5faffa92d3498230c5484175e57 diff --git a/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt b/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt index a23b717ff..7dcada09c 100644 --- a/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt +++ b/Modules/@babylonjs/react-native-windows/windows/CMakeLists.txt @@ -30,7 +30,7 @@ target_include_directories(BabylonNative PRIVATE ${SHARED_INCLUDES}) target_link_libraries(BabylonNative arcana - Graphics + GraphicsDevice jsi JsRuntime NativeCamera diff --git a/Modules/@babylonjs/react-native/shared/BabylonNative.cpp b/Modules/@babylonjs/react-native/shared/BabylonNative.cpp index a42f83bee..f1042c3b0 100644 --- a/Modules/@babylonjs/react-native/shared/BabylonNative.cpp +++ b/Modules/@babylonjs/react-native/shared/BabylonNative.cpp @@ -23,8 +23,8 @@ namespace BabylonNative namespace { Dispatcher g_inlineDispatcher{ [](const std::function<void()>& func) { func(); } }; - std::unique_ptr<Babylon::Graphics::Device> g_graphics{}; - std::unique_ptr<Babylon::Graphics::DeviceUpdate> g_update{}; + std::optional<Babylon::Graphics::Device> g_graphicsDevice{}; + std::optional<Babylon::Graphics::DeviceUpdate> g_update{}; std::unique_ptr<Babylon::Polyfills::Canvas> g_nativeCanvas{}; } @@ -75,34 +75,34 @@ namespace BabylonNative void UpdateView(WindowType window, size_t width, size_t height) { - m_windowConfig.Window = window; - m_windowConfig.Width = width; - m_windowConfig.Height = height; + m_graphicsConfig.Window = window; + m_graphicsConfig.Width = width; + m_graphicsConfig.Height = height; UpdateGraphicsConfiguration(); } void UpdateGraphicsConfiguration() { - if (!g_graphics) + if (!g_graphicsDevice) { - g_graphics = Babylon::Graphics::Device::Create(m_windowConfig); - g_update = std::make_unique<Babylon::Graphics::DeviceUpdate>(g_graphics->GetUpdate("update")); + g_graphicsDevice.emplace(m_graphicsConfig); + g_update.emplace(g_graphicsDevice->GetUpdate("update")); } else { - g_graphics->UpdateWindow(m_windowConfig); - g_graphics->UpdateSize(m_windowConfig.Width, m_windowConfig.Height); + g_graphicsDevice->UpdateWindow(m_graphicsConfig.Window); + g_graphicsDevice->UpdateSize(m_graphicsConfig.Width, m_graphicsConfig.Height); } - g_graphics->UpdateMSAA(mMSAAValue); - g_graphics->UpdateAlphaPremultiplied(mAlphaPremultiplied); + g_graphicsDevice->UpdateMSAA(mMSAAValue); + g_graphicsDevice->UpdateAlphaPremultiplied(mAlphaPremultiplied); - g_graphics->EnableRendering(); + g_graphicsDevice->EnableRendering(); std::call_once(m_isGraphicsInitialized, [this]() { m_jsDispatcher([this]() { - g_graphics->AddToJavaScript(m_env); + g_graphicsDevice->AddToJavaScript(m_env); Babylon::Plugins::NativeEngine::Initialize(m_env); }); }); @@ -121,18 +121,18 @@ namespace BabylonNative void UpdateMSAA(uint8_t value) { mMSAAValue = value; - if (g_graphics) + if (g_graphicsDevice) { - g_graphics->UpdateMSAA(value); + g_graphicsDevice->UpdateMSAA(value); } } void UpdateAlphaPremultiplied(bool enabled) { mAlphaPremultiplied = enabled; - if (g_graphics) + if (g_graphicsDevice) { - g_graphics->UpdateAlphaPremultiplied(enabled); + g_graphicsDevice->UpdateAlphaPremultiplied(enabled); } } @@ -144,12 +144,12 @@ namespace BabylonNative } // If rendering has not been explicitly enabled, or has been explicitly disabled, then don't try to render. // Otherwise rendering can be implicitly enabled, which may not be desirable (e.g. after the engine is disposed). - if (g_graphics && m_isRenderingEnabled) + if (g_graphicsDevice && m_isRenderingEnabled) { - g_graphics->StartRenderingCurrentFrame(); + g_graphicsDevice->StartRenderingCurrentFrame(); g_update->Start(); g_update->Finish(); - g_graphics->FinishRenderingCurrentFrame(); + g_graphicsDevice->FinishRenderingCurrentFrame(); } } @@ -160,10 +160,10 @@ namespace BabylonNative void ResetView() { - if (g_graphics) + if (g_graphicsDevice) { g_nativeCanvas->FlushGraphicResources(); - g_graphics->DisableRendering(); + g_graphicsDevice->DisableRendering(); } m_isRenderingEnabled = false; @@ -264,7 +264,7 @@ namespace BabylonNative Babylon::Plugins::NativeInput* m_nativeInput{}; std::optional<Babylon::Plugins::NativeXr> m_nativeXr{}; - Babylon::Graphics::WindowConfiguration m_windowConfig{}; + Babylon::Graphics::Configuration m_graphicsConfig{}; std::shared_ptr<bool> m_isXRActive{}; uint8_t mMSAAValue{}; From f90faebe3d3dc7a28a47f432857c6b1add24d648 Mon Sep 17 00:00:00 2001 From: Cedric Guillemet <1312968+CedricGuillemet@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:30:08 +0200 Subject: [PATCH 88/88] SLA 1.6.3 (#591) --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ed4c90ff..f67b23db7 100644 --- a/README.md +++ b/README.md @@ -227,11 +227,11 @@ For iOS the XCode project needs to be generated with `CMake` as described [above | React Native | Babylon React Native | |---|---| -| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | -| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | -| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1 | -| 0.70 | 1.5.0, 1.5.1, 1.6.0, 1.6.1 | -| 0.71 -> 0.72 | 1.6.0, 1.6.1 | +| 0.64 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.65 -> 0.68 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.69 | 1.4.0, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.70 | 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.3 | +| 0.71 -> 0.72 | 1.6.0, 1.6.1, 1.6.3 | Here are the package names for Android/iOS and Windows: @@ -260,6 +260,7 @@ Depending on the Babylon React Native NPM package version, some Babylon.js NPM d | 1.5.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.1, 5.45.2, 5.46.0, 5.47.0, 5.47.1, 5.48.0, 5.48.1, 5.49.0, 5.49.1, 5.49.2, 5.50.0, 5.50.1, 5.51.0, 5.52.0, 5.53.0, 5.54.0, 5.55.0, 5.56.0, 5.57.0, 5.57.1, 6.0.0, 6.1.0, 6.2.0, 6.3.0, 6.3.1, 6.4.0, 6.4.1 | | 1.6.0 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | | 1.6.1 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | +| 1.6.3 | 5.42.2, 5.43.0, 5.43.1, 5.43.2, 5.44.0, 5.45.0, 5.45.2, 5.46.0, 5.47.0, 5.48.0, 5.48.1, 5.49.1 | ## Security