diff --git a/.github/workflows/profile-release.yml b/.github/workflows/profile-release.yml index a8cf9b35..1e88bd53 100644 --- a/.github/workflows/profile-release.yml +++ b/.github/workflows/profile-release.yml @@ -420,10 +420,59 @@ jobs: done < ./.env echo "✅ Export complete" - - name: Install ImageMagick (Ubuntu) + - name: Install ImageMagick & Ninja (Ubuntu) run: | sudo apt-get update - sudo apt-get install -y imagemagick + sudo apt-get install -y imagemagick ninja-build + + - name: Ensure Android SDK/NDK/CMake toolchain + shell: bash + env: + ANDROID_SDK_ROOT: /usr/local/lib/android/sdk + run: | + set -e + + # Find a working sdkmanager (latest if present, else first found) + if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + SDKMGR="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" + else + SDKMGR=$(ls -1d "$ANDROID_SDK_ROOT/cmdline-tools"/*/bin/sdkmanager 2>/dev/null | head -n1 || true) + if [ -z "$SDKMGR" ]; then + echo "No cmdline-tools found; installing 'cmdline-tools;latest' with the preinstalled sdkmanager..." + # Use the prebundled sdkmanager path on GH runners + SDKMGR="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" + "$SDKMGR" "cmdline-tools;latest" + SDKMGR="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" + fi + fi + + echo "Using sdkmanager at: $SDKMGR" + + # Accept licenses; don't fail on SIGPIPE from 'yes' + yes | "$SDKMGR" --licenses >/dev/null 2>&1 || true + + # Helper: install component if missing + need() { + local p="$1" + if ! "$SDKMGR" --list_installed | grep -q "^ $p$"; then + echo "Installing $p" + "$SDKMGR" "$p" + else + echo "✓ $p already installed" + fi + } + + # Match root gradle pins + need "platforms;android-35" + need "build-tools;35.0.0" + need "ndk;27.1.12297006" + + # CMake version + need "cmake;3.22.1" + + # Sanity output + "$ANDROID_SDK_ROOT/cmake/3.22.1/bin/cmake" --version || true + test -f "$ANDROID_SDK_ROOT/ndk/27.1.12297006/source.properties" && echo "✅ NDK 27.1.12297006 installed" - name: Generate app icon and splash screen run: | diff --git a/.github/workflows/react-native-ci.yml b/.github/workflows/react-native-ci.yml index 6fd570cb..3edc6e6a 100644 --- a/.github/workflows/react-native-ci.yml +++ b/.github/workflows/react-native-ci.yml @@ -118,13 +118,66 @@ jobs: run: | echo "$GOOGLE_SERVICES_JSON" > android/app/google-services.json - # Use JDK 21 to match your local environment - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '21' + - name: Install Ninja (Ubuntu) + run: | + sudo apt-get update + sudo apt-get install -y ninja-build + + - name: Ensure Android SDK/NDK/CMake toolchain + shell: bash + env: + ANDROID_SDK_ROOT: /usr/local/lib/android/sdk + run: | + set -e + + # Find a working sdkmanager (latest if present, else first found) + if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" ]; then + SDKMGR="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" + else + SDKMGR=$(ls -1d "$ANDROID_SDK_ROOT/cmdline-tools"/*/bin/sdkmanager 2>/dev/null | head -n1 || true) + if [ -z "$SDKMGR" ]; then + echo "No cmdline-tools found; installing 'cmdline-tools;latest' with the preinstalled sdkmanager..." + # Use the prebundled sdkmanager path on GH runners + SDKMGR="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" + "$SDKMGR" "cmdline-tools;latest" + SDKMGR="$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" + fi + fi + + echo "Using sdkmanager at: $SDKMGR" + + # Accept licenses; don't fail on SIGPIPE from 'yes' + yes | "$SDKMGR" --licenses >/dev/null 2>&1 || true + + # Helper: install component if missing + need() { + local p="$1" + if ! "$SDKMGR" --list_installed | grep -q "^ $p$"; then + echo "Installing $p" + "$SDKMGR" "$p" + else + echo "✓ $p already installed" + fi + } + + # Match root gradle pins + need "platforms;android-35" + need "build-tools;35.0.0" + need "ndk;27.1.12297006" + + # CMake version + need "cmake;3.22.1" + + # Sanity output + "$ANDROID_SDK_ROOT/cmake/3.22.1/bin/cmake" --version || true + test -f "$ANDROID_SDK_ROOT/ndk/27.1.12297006/source.properties" && echo "✅ NDK 27.1.12297006 installed" + - name: Cache Gradle Wrapper uses: actions/cache@v4 with: