Release to Staging v2.9.28 - 2026-08-07 #3256
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Mobile CI | |
| permissions: | |
| contents: read | |
| env: | |
| # Build environment versions | |
| # Node version is read from .nvmrc during workflow execution | |
| RUBY_VERSION: 3.2 | |
| JAVA_VERSION: 17 | |
| ANDROID_NDK_VERSION: 28.0.13004108 | |
| XCODE_VERSION: 26 | |
| # Path configuration | |
| WORKSPACE: ${{ github.workspace }} | |
| APP_PATH: ${{ github.workspace }}/app | |
| # Cache versions | |
| GH_CACHE_VERSION: v2 # Global cache version - bumped to invalidate caches | |
| GH_GEMS_CACHE_VERSION: v1 # Ruby gems cache version | |
| # Performance optimizations | |
| GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=2 -Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.caching=true -Dorg.gradle.jvmargs='-Xmx6144m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8' | |
| CI: true | |
| on: | |
| pull_request: | |
| branches: | |
| - dev | |
| - staging | |
| - main | |
| paths: | |
| - "common/**" | |
| - "app/**" | |
| - "packages/mobile-sdk-alpha/**" | |
| - ".github/workflows/mobile-ci.yml" | |
| - ".github/actions/**" | |
| - ".github/CI_FORCE_RUN" | |
| workflow_dispatch: {} | |
| concurrency: | |
| group: mobile-ci-${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| build-deps: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Read and sanitize Node.js version | |
| shell: bash | |
| run: | | |
| if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then | |
| echo "❌ .nvmrc is missing or empty"; exit 1; | |
| fi | |
| VERSION="$(tr -d '\r\n' < .nvmrc)" | |
| VERSION="${VERSION#v}" | |
| if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then | |
| echo "Invalid .nvmrc content: '$VERSION'"; exit 1; | |
| fi | |
| echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV" | |
| echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV" | |
| - name: Use Node.js | |
| uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - name: Enable Corepack | |
| run: corepack enable | |
| - name: Cache pnpm store | |
| uses: ./.github/actions/cache-pnpm | |
| with: | |
| cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }} | |
| - name: Install Dependencies | |
| uses: ./.github/actions/pnpm-install | |
| - name: Cache Built Dependencies | |
| id: built-deps | |
| uses: ./.github/actions/cache-built-deps | |
| with: | |
| cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }} | |
| - name: Build dependencies (cache miss) | |
| # Temporarily disabled due to `pnpm types` failures when cache is used. | |
| # if: steps.built-deps.outputs.cache-hit != 'true' | |
| run: | | |
| echo "Cache miss for built dependencies. Building now..." | |
| pnpm --filter @selfxyz/mobile-app run build:deps | |
| - name: Run linter | |
| run: pnpm lint | |
| working-directory: ./app | |
| - name: Run prettier | |
| run: pnpm fmt | |
| working-directory: ./app | |
| - name: Check App Types | |
| run: pnpm types | |
| working-directory: ./app | |
| test: | |
| runs-on: ubuntu-latest | |
| needs: build-deps | |
| timeout-minutes: 60 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Read and sanitize Node.js version | |
| shell: bash | |
| run: | | |
| if [ ! -f .nvmrc ] || [ -z "$(cat .nvmrc)" ]; then | |
| echo "❌ .nvmrc is missing or empty"; exit 1; | |
| fi | |
| VERSION="$(tr -d '\r\n' < .nvmrc)" | |
| VERSION="${VERSION#v}" | |
| if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+){0,2}$ ]]; then | |
| echo "Invalid .nvmrc content: '$VERSION'"; exit 1; | |
| fi | |
| echo "NODE_VERSION=$VERSION" >> "$GITHUB_ENV" | |
| echo "NODE_VERSION_SANITIZED=${VERSION//\//-}" >> "$GITHUB_ENV" | |
| - name: Use Node.js | |
| uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - name: Enable Corepack | |
| run: corepack enable | |
| - name: Cache pnpm store | |
| uses: ./.github/actions/cache-pnpm | |
| with: | |
| cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }} | |
| - name: Install Dependencies | |
| uses: ./.github/actions/pnpm-install | |
| - name: Cache Built Dependencies | |
| id: built-deps | |
| uses: ./.github/actions/cache-built-deps | |
| with: | |
| cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }} | |
| - name: Debug Cache Restoration | |
| run: | | |
| echo "Cache hit: ${{ steps.built-deps.outputs.cache-hit }}" | |
| echo "Cache key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}" | |
| echo "Checking if cached files exist:" | |
| ls -la packages/mobile-sdk-alpha/dist/ || echo "❌ mobile-sdk-alpha dist not found" | |
| ls -la packages/mobile-sdk-alpha/dist/cjs/ || echo "❌ mobile-sdk-alpha dist/cjs not found" | |
| ls -la packages/mobile-sdk-alpha/dist/cjs/index.cjs || echo "❌ mobile-sdk-alpha dist/cjs/index.cjs not found" | |
| ls -la common/dist/ || echo "❌ common dist not found" | |
| ls -la common/dist/cjs/ || echo "❌ common dist/cjs not found" | |
| ls -la common/dist/cjs/index.cjs || echo "❌ common dist/cjs/index.cjs not found" | |
| - name: Build dependencies (always - debugging CI) | |
| # Temporarily always build to debug CI issues | |
| # TODO: Re-enable cache after fixing: if: steps.built-deps.outputs.cache-hit != 'true' | |
| run: | | |
| echo "Building dependencies (cache temporarily disabled for debugging)..." | |
| pnpm --filter @selfxyz/mobile-app run build:deps | |
| # Verify build completed successfully | |
| if [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "common/dist/cjs/index.cjs" ]; then | |
| echo "❌ Build failed - required files missing after build" | |
| ls -la packages/mobile-sdk-alpha/dist/ || echo "mobile-sdk-alpha dist not found" | |
| ls -la common/dist/ || echo "common dist not found" | |
| exit 1 | |
| fi | |
| echo "✅ Build completed successfully" | |
| - name: Force Build Dependencies If Missing | |
| run: | | |
| # Force build if required files don't exist, regardless of cache status | |
| if [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "common/dist/cjs/index.cjs" ]; then | |
| echo "❌ Required dependency files missing, forcing rebuild..." | |
| echo "Missing files:" | |
| [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] && echo " - packages/mobile-sdk-alpha/dist/cjs/index.cjs" | |
| [ ! -f "common/dist/cjs/index.cjs" ] && echo " - common/dist/cjs/index.cjs" | |
| pnpm --filter @selfxyz/mobile-app run build:deps | |
| # Verify build completed successfully | |
| if [ ! -f "packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "common/dist/cjs/index.cjs" ]; then | |
| echo "❌ Forced build failed - required files still missing" | |
| ls -la packages/mobile-sdk-alpha/ || echo "packages/mobile-sdk-alpha not found" | |
| ls -la packages/mobile-sdk-alpha/dist/ || echo "mobile-sdk-alpha dist not found" | |
| ls -la common/ || echo "common not found" | |
| ls -la common/dist/ || echo "common dist not found" | |
| exit 1 | |
| fi | |
| echo "✅ Forced build completed successfully" | |
| else | |
| echo "✅ All required dependency files exist" | |
| fi | |
| - name: Check for nested require() in tests | |
| uses: ./.github/actions/check-nested-requires | |
| with: | |
| paths: | | |
| app/tests/ | |
| - name: App Tests | |
| env: | |
| # Increase Node.js memory to prevent hermes-parser WASM memory errors | |
| NODE_OPTIONS: --max-old-space-size=4096 | |
| # Override production NODE_ENV for tests - React's production build doesn't include testing utilities | |
| NODE_ENV: test | |
| run: | | |
| # Final verification from app directory perspective | |
| echo "Final verification before running tests (from app directory)..." | |
| if [ ! -f "../packages/mobile-sdk-alpha/dist/cjs/index.cjs" ] || [ ! -f "../common/dist/cjs/index.cjs" ]; then | |
| echo "❌ Dependencies still not found from app directory" | |
| ls -la ../packages/mobile-sdk-alpha/dist/ || echo "mobile-sdk-alpha dist not found" | |
| ls -la ../common/dist/ || echo "common dist not found" | |
| exit 1 | |
| fi | |
| echo "✅ All dependencies verified, running tests..." | |
| # Run jest through pnpm to avoid the build:deps step since CI already built dependencies | |
| pnpm test:ci | |
| working-directory: ./app |