From a585f0efd8dedd239c32f1087cf60b322779552d Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 13:47:16 +0500 Subject: [PATCH 01/64] Add automated deployment setup for iOS and Android - Configure Fastlane for iOS (TestFlight & App Store) - Configure Fastlane for Android (Google Play) - Add GitHub Actions workflows for CI/CD - Set up Fastlane Match for iOS code signing - Add deployment documentation and guides - Add deployment npm scripts - Secure Android keystore configuration Co-Authored-By: Claude Sonnet 4.5 --- .env.fastlane.example | 34 ++ .github/workflows/android-deploy.yml | 116 ++++++ .github/workflows/build-check.yml | 115 ++++++ .github/workflows/ios-deploy.yml | 107 ++++++ .gitignore | 5 + DEPLOYMENT_QUICK_START.md | 184 ++++++++++ DEPLOYMENT_SETUP.md | 343 ++++++++++++++++++ Gemfile | 1 + Gemfile.lock | 204 +++++++++++ ...e.properties => gradle.properties.example} | 9 +- fastlane/Appfile | 15 + fastlane/Fastfile | 239 ++++++++++++ fastlane/Matchfile | 28 ++ fastlane/README.md | 85 +++++ ios/Podfile.lock | 2 +- ios/flash_pos.xcodeproj/project.pbxproj | 34 +- package.json | 8 +- 17 files changed, 1512 insertions(+), 17 deletions(-) create mode 100644 .env.fastlane.example create mode 100644 .github/workflows/android-deploy.yml create mode 100644 .github/workflows/build-check.yml create mode 100644 .github/workflows/ios-deploy.yml create mode 100644 DEPLOYMENT_QUICK_START.md create mode 100644 DEPLOYMENT_SETUP.md rename android/{gradle.properties => gradle.properties.example} (86%) create mode 100644 fastlane/Appfile create mode 100644 fastlane/Fastfile create mode 100644 fastlane/Matchfile create mode 100644 fastlane/README.md diff --git a/.env.fastlane.example b/.env.fastlane.example new file mode 100644 index 0000000..ad45e65 --- /dev/null +++ b/.env.fastlane.example @@ -0,0 +1,34 @@ +# Fastlane Environment Variables Example +# Copy this file to .env.fastlane and fill in your values +# DO NOT commit .env.fastlane to git - it contains sensitive data! + +# ==================== iOS ==================== +# Apple ID (email) +APPLE_ID=your.email@example.com + +# Apple Developer Team ID +TEAM_ID=XXXXXXXXXX + +# iTunes Connect Team ID (usually same as TEAM_ID) +ITC_TEAM_ID=XXXXXXXXXX + +# Apple ID password +FASTLANE_PASSWORD=your-apple-id-password + +# App-specific password from appleid.apple.com +FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx + +# Fastlane Match +MATCH_PASSWORD=your-match-password +MATCH_GIT_URL=https://github.com/YOUR_USERNAME/flash-pos-certificates +MATCH_GIT_BASIC_AUTHORIZATION=base64-of-username:token + +# ==================== Android ==================== +# Path to Google Play service account JSON key +GOOGLE_PLAY_JSON_KEY_PATH=/path/to/google-play-key.json + +# Android keystore details (set in android/gradle.properties instead) +# MYAPP_UPLOAD_STORE_FILE=release.keystore +# MYAPP_UPLOAD_KEY_ALIAS=flash-pos-release +# MYAPP_UPLOAD_STORE_PASSWORD=keystore-password +# MYAPP_UPLOAD_KEY_PASSWORD=key-password diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml new file mode 100644 index 0000000..84f7a39 --- /dev/null +++ b/.github/workflows/android-deploy.yml @@ -0,0 +1,116 @@ +name: Android Deploy + +on: + push: + tags: + - 'android/v*' + workflow_dispatch: + inputs: + lane: + description: 'Fastlane lane to run (beta or release)' + required: true + default: 'beta' + type: choice + options: + - beta + - release + - promote_to_beta + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: 'gradle' + + - name: Install dependencies + run: npm ci + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Decode keystore + env: + ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} + run: | + echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > android/app/release.keystore + + - name: Create gradle.properties + env: + KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} + run: | + cat > android/gradle.properties << EOF + MYAPP_UPLOAD_STORE_FILE=release.keystore + MYAPP_UPLOAD_KEY_ALIAS=$KEY_ALIAS + MYAPP_UPLOAD_STORE_PASSWORD=$KEYSTORE_PASSWORD + MYAPP_UPLOAD_KEY_PASSWORD=$KEY_PASSWORD + EOF + + - name: Setup Google Play credentials + env: + GOOGLE_PLAY_JSON_KEY: ${{ secrets.GOOGLE_PLAY_JSON_KEY }} + run: | + echo "$GOOGLE_PLAY_JSON_KEY" > google-play-key.json + echo "GOOGLE_PLAY_JSON_KEY_PATH=$(pwd)/google-play-key.json" >> $GITHUB_ENV + + - name: Deploy to Internal Testing (Beta) + if: github.event.inputs.lane == 'beta' || contains(github.ref, 'beta') + env: + GOOGLE_PLAY_JSON_KEY_PATH: ${{ env.GOOGLE_PLAY_JSON_KEY_PATH }} + run: bundle exec fastlane android beta + + - name: Deploy to Production (Release) + if: github.event.inputs.lane == 'release' || (!contains(github.ref, 'beta') && startsWith(github.ref, 'refs/tags/android/v')) + env: + GOOGLE_PLAY_JSON_KEY_PATH: ${{ env.GOOGLE_PLAY_JSON_KEY_PATH }} + run: bundle exec fastlane android release + + - name: Promote to Beta + if: github.event.inputs.lane == 'promote_to_beta' + env: + GOOGLE_PLAY_JSON_KEY_PATH: ${{ env.GOOGLE_PLAY_JSON_KEY_PATH }} + run: bundle exec fastlane android promote_to_beta + + - name: Upload build artifacts + if: failure() + uses: actions/upload-artifact@v4 + with: + name: android-build-logs + path: | + android/app/build/outputs + fastlane/report.xml + + - name: Clean up sensitive files + if: always() + run: | + rm -f android/app/release.keystore + rm -f android/gradle.properties + rm -f google-play-key.json + + - name: Notify on failure + if: failure() + run: echo "Android deployment failed. Check the logs for details." diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml new file mode 100644 index 0000000..fd37142 --- /dev/null +++ b/.github/workflows/build-check.yml @@ -0,0 +1,115 @@ +name: Build Check + +on: + pull_request: + branches: [ main ] + push: + branches: [ main ] + +jobs: + ios-build: + name: iOS Build Check + runs-on: macos-14 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Install CocoaPods + run: | + cd ios + bundle exec pod install + + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: 'latest-stable' + + - name: Build iOS app (Debug) + run: | + xcodebuild -workspace ios/flash_pos.xcworkspace \ + -scheme flash_pos \ + -configuration Debug \ + -sdk iphonesimulator \ + -destination 'platform=iOS Simulator,name=iPhone 15' \ + build CODE_SIGNING_ALLOWED=NO + + android-build: + name: Android Build Check + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: 'gradle' + + - name: Install dependencies + run: npm ci + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Build Android app (Debug) + run: | + cd android + ./gradlew assembleDebug + + - name: Upload APK artifact + uses: actions/upload-artifact@v4 + with: + name: debug-apk + path: android/app/build/outputs/apk/debug/app-debug.apk + retention-days: 7 + + lint: + name: Lint Check + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml new file mode 100644 index 0000000..8fa6b0d --- /dev/null +++ b/.github/workflows/ios-deploy.yml @@ -0,0 +1,107 @@ +name: iOS Deploy + +on: + push: + tags: + - 'ios/v*' + workflow_dispatch: + inputs: + lane: + description: 'Fastlane lane to run (beta or release)' + required: true + default: 'beta' + type: choice + options: + - beta + - release + +jobs: + deploy: + runs-on: macos-14 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Install CocoaPods + run: | + cd ios + bundle exec pod install + + - name: Cache CocoaPods + uses: actions/cache@v4 + with: + path: ios/Pods + key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods- + + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: 'latest-stable' + + - name: Import certificates and provisioning profiles + env: + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + FASTLANE_USER: ${{ secrets.APPLE_ID }} + FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} + FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + run: bundle exec fastlane ios setup_signing + + - name: Deploy to TestFlight (Beta) + if: github.event.inputs.lane == 'beta' || contains(github.ref, 'beta') + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }} + TEAM_ID: ${{ secrets.TEAM_ID }} + FASTLANE_USER: ${{ secrets.APPLE_ID }} + FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} + FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + run: bundle exec fastlane ios beta + + - name: Deploy to App Store (Release) + if: github.event.inputs.lane == 'release' || (!contains(github.ref, 'beta') && startsWith(github.ref, 'refs/tags/ios/v')) + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }} + TEAM_ID: ${{ secrets.TEAM_ID }} + FASTLANE_USER: ${{ secrets.APPLE_ID }} + FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} + FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + run: bundle exec fastlane ios release + + - name: Upload build artifacts + if: failure() + uses: actions/upload-artifact@v4 + with: + name: ios-build-logs + path: | + ~/Library/Logs/gym + fastlane/report.xml + + - name: Notify on failure + if: failure() + run: echo "iOS deployment failed. Check the logs for details." diff --git a/.gitignore b/.gitignore index d21342c..905bf1d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ local.properties .cxx/ *.keystore !debug.keystore +android/gradle.properties # node.js # @@ -75,3 +76,7 @@ yarn-error.log # env .env +.env.fastlane +google-play-key.json +*.keystore +!debug.keystore diff --git a/DEPLOYMENT_QUICK_START.md b/DEPLOYMENT_QUICK_START.md new file mode 100644 index 0000000..cd8a22a --- /dev/null +++ b/DEPLOYMENT_QUICK_START.md @@ -0,0 +1,184 @@ +# Deployment Quick Start + +Quick reference for deploying flash_pos to App Store and Google Play. + +## First Time Setup + +Before you can use automated deployment, complete the one-time setup: + +1. **Install dependencies:** + ```bash + bundle install + ``` + +2. **Follow the complete setup guide:** [DEPLOYMENT_SETUP.md](DEPLOYMENT_SETUP.md) + - Configure Apple Developer and Google Play accounts + - Set up code signing with Fastlane Match + - Add all required secrets to GitHub + +## Daily Usage + +### Deploy to TestFlight (iOS Beta) + +```bash +npm run deploy:ios:beta +``` + +Or using Fastlane directly: +```bash +bundle exec fastlane ios beta +``` + +### Deploy to App Store (iOS Production) + +```bash +npm run deploy:ios:release +``` + +### Deploy to Google Play Internal Testing (Android Beta) + +```bash +npm run deploy:android:beta +``` + +### Deploy to Google Play Production (Android Release) + +```bash +npm run deploy:android:release +``` + +### Promote Android Internal to Beta Track + +```bash +npm run deploy:android:promote +``` + +## Automated Deployment via GitHub Actions + +### Using Tags (Recommended) + +**iOS:** +```bash +# Beta/TestFlight +git tag ios/v0.3.4-beta.1 +git push origin ios/v0.3.4-beta.1 + +# Production +git tag ios/v0.3.4 +git push origin ios/v0.3.4 +``` + +**Android:** +```bash +# Internal Testing +git tag android/v0.3.2-beta.1 +git push origin android/v0.3.2-beta.1 + +# Production +git tag android/v0.3.2 +git push origin android/v0.3.2 +``` + +### Using GitHub UI + +1. Go to your repository on GitHub +2. Click **Actions** tab +3. Select **iOS Deploy** or **Android Deploy** workflow +4. Click **Run workflow** +5. Choose the lane (beta or release) +6. Click **Run workflow** button + +## Pre-Deployment Checklist + +Before deploying: + +- [ ] All code changes are committed +- [ ] Tests are passing +- [ ] Version numbers are updated (if needed) +- [ ] Changelog is updated +- [ ] App is tested on physical devices + +## Version Bumping + +### iOS +```bash +# Update version number (e.g., 0.3.3 -> 0.3.4) +# Edit in Xcode or: +bundle exec fastlane run increment_version_number xcodeproj:"ios/flash_pos.xcodeproj" + +# Build number is auto-incremented by Fastlane +``` + +### Android +```bash +# Update versionName in android/app/build.gradle +# versionCode is auto-incremented by Fastlane +``` + +## Troubleshooting + +### Common Issues + +**"Ensure git status clean" error:** +```bash +# Commit all changes first +git add . +git commit -m "Your commit message" +``` + +**"No signing certificate" (iOS):** +```bash +# Set up code signing +npm run setup:ios:signing +``` + +**Build fails:** +```bash +# iOS: Clean build +cd ios && xcodebuild clean && cd .. +rm -rf ios/Pods ios/Podfile.lock +bundle exec pod install --project-directory=ios + +# Android: Clean build +cd android && ./gradlew clean && cd .. +``` + +## Getting Help + +- Full setup guide: [DEPLOYMENT_SETUP.md](DEPLOYMENT_SETUP.md) +- Fastlane docs: https://docs.fastlane.tools +- Check GitHub Actions logs for deployment errors + +## Deployment Workflow + +``` +┌─────────────────┐ +│ Code Changes │ +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ Run Tests │ +└────────┬────────┘ + │ + ▼ +┌─────────────────┐ +│ Bump Version │ +└────────┬────────┘ + │ + ┌────┴────┐ + ▼ ▼ +┌───────┐ ┌───────┐ +│ iOS │ │Android│ +└───┬───┘ └───┬───┘ + │ │ + ▼ ▼ +┌──────┐ ┌──────────┐ +│ Beta │ │ Beta │ +└───┬──┘ └────┬─────┘ + │ │ + ▼ ▼ +┌──────┐ ┌──────────┐ +│ Prod │ │ Prod │ +└──────┘ └──────────┘ +``` diff --git a/DEPLOYMENT_SETUP.md b/DEPLOYMENT_SETUP.md new file mode 100644 index 0000000..41a60e7 --- /dev/null +++ b/DEPLOYMENT_SETUP.md @@ -0,0 +1,343 @@ +# Automated Deployment Setup Guide + +This guide will help you set up automated deployment for both iOS (App Store) and Android (Google Play Store) using Fastlane and GitHub Actions. + +## Table of Contents +- [Prerequisites](#prerequisites) +- [iOS Setup](#ios-setup) +- [Android Setup](#android-setup) +- [GitHub Secrets Configuration](#github-secrets-configuration) +- [Usage](#usage) +- [Troubleshooting](#troubleshooting) + +## Prerequisites + +### 1. Install Fastlane Dependencies + +```bash +# Install Ruby dependencies +bundle install +``` + +### 2. Accounts Required +- **Apple Developer Account** (paid, $99/year) +- **Google Play Developer Account** (one-time $25 fee) +- **GitHub repository** with Actions enabled + +## iOS Setup + +### Step 1: Apple Developer Account Configuration + +1. **Create App in App Store Connect** + - Go to [App Store Connect](https://appstoreconnect.apple.com) + - Navigate to "My Apps" → "+" → "New App" + - Fill in app details with Bundle ID: `com.flash.pos` + +2. **Get Your Team IDs** + ```bash + # List your teams + fastlane fastlane-credentials show + ``` + - Note down your **Team ID** and **iTunes Connect Team ID** + +3. **Create App Store Connect API Key** + - Go to App Store Connect → Users and Access → Keys + - Click "+" to create a new key + - Give it "App Manager" role + - Download the `.p8` file and note the **Key ID** and **Issuer ID** + +### Step 2: Set Up Fastlane Match (Code Signing) + +Fastlane Match stores your certificates and provisioning profiles in a private Git repository. + +1. **Create a Private GitHub Repository** + - Create a new private repo (e.g., `flash-pos-certificates`) + - This will store your iOS certificates and profiles + +2. **Initialize Match** + ```bash + bundle exec fastlane match init + ``` + - Select "git" as storage mode + - Enter your certificates repo URL: `https://github.com/YOUR_USERNAME/flash-pos-certificates` + +3. **Generate Certificates and Profiles** + ```bash + # Generate App Store certificates + bundle exec fastlane match appstore + ``` + - Enter your Apple ID when prompted + - Create a strong passphrase (you'll need this for GitHub secrets) + - This creates and uploads certificates to your private repo + +4. **Create Personal Access Token for Match** + - Go to GitHub Settings → Developer settings → Personal access tokens → Tokens (classic) + - Generate new token with `repo` scope + - Save this token securely + +### Step 3: Enable Two-Factor Authentication + +1. **Set up 2FA on Apple ID** + - Go to [appleid.apple.com](https://appleid.apple.com) + - Enable two-factor authentication if not already enabled + +2. **Create App-Specific Password** + - Go to [appleid.apple.com](https://appleid.apple.com) + - Sign in → Security → App-Specific Passwords + - Generate a new password for "Fastlane" + - Save this password securely + +## Android Setup + +### Step 1: Google Play Console Configuration + +1. **Create App in Google Play Console** + - Go to [Google Play Console](https://play.google.com/console) + - Create new app with package name: `com.flash_pos` + +2. **Create a Service Account** + - Go to Google Cloud Console for your project + - Navigate to "IAM & Admin" → "Service Accounts" + - Create a new service account (e.g., "fastlane-deployer") + - Grant it the role: "Service Account User" + +3. **Grant API Access in Play Console** + - Go back to Play Console → Setup → API access + - Link the service account you created + - Grant permissions: "Admin" (for full deployment access) or "Release Manager" + +4. **Download Service Account JSON Key** + - In Google Cloud Console → Service Accounts + - Click on your service account → Keys → Add Key → Create new key + - Choose JSON format + - Download and save this file securely + - **Important:** This file contains sensitive credentials. Never commit it to Git! + +### Step 2: Android Keystore Setup + +You need a release keystore to sign your Android app. + +1. **Generate Keystore (if you don't have one)** + ```bash + keytool -genkeypair -v -storetype PKCS12 -keystore release.keystore \ + -alias flash-pos-release \ + -keyalg RSA -keysize 2048 -validity 10000 + ``` + - Enter a strong password for the keystore + - Enter details when prompted + - Save the keystore file securely + +2. **Convert Keystore to Base64** + ```bash + # On macOS/Linux + base64 -i release.keystore -o release.keystore.base64 + + # On Windows (PowerShell) + [Convert]::ToBase64String([IO.File]::ReadAllBytes("release.keystore")) | Out-File -Encoding ASCII release.keystore.base64 + ``` + - Save the content of `release.keystore.base64` for GitHub secrets + +3. **Upload First APK/AAB Manually** + - Before automation works, you need to manually upload the first version + - Build release AAB: + ```bash + cd android && ./gradlew bundleRelease + ``` + - Upload the AAB at `android/app/build/outputs/bundle/release/app-release.aab` to Play Console + - Complete the store listing and release to Internal Testing + +## GitHub Secrets Configuration + +Add these secrets to your GitHub repository (Settings → Secrets and variables → Actions → New repository secret): + +### iOS Secrets + +| Secret Name | Description | Where to Get It | +|------------|-------------|-----------------| +| `APPLE_ID` | Your Apple ID email | Your Apple Developer account | +| `TEAM_ID` | Apple Developer Team ID | App Store Connect → Membership | +| `ITC_TEAM_ID` | iTunes Connect Team ID | Usually same as TEAM_ID | +| `FASTLANE_PASSWORD` | Your Apple ID password | Your Apple ID password | +| `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD` | App-specific password | Generated at appleid.apple.com | +| `MATCH_PASSWORD` | Passphrase for match certificates | Created when running `fastlane match init` | +| `MATCH_GIT_BASIC_AUTHORIZATION` | Base64 of `username:token` | See below | + +**Creating MATCH_GIT_BASIC_AUTHORIZATION:** +```bash +echo -n "YOUR_GITHUB_USERNAME:YOUR_PERSONAL_ACCESS_TOKEN" | base64 +``` + +### Android Secrets + +| Secret Name | Description | Where to Get It | +|------------|-------------|-----------------| +| `GOOGLE_PLAY_JSON_KEY` | Service account JSON content | Copy entire content of downloaded JSON file | +| `ANDROID_KEYSTORE_BASE64` | Base64 encoded keystore | Content of `release.keystore.base64` file | +| `ANDROID_KEYSTORE_PASSWORD` | Keystore password | Password you set when creating keystore | +| `ANDROID_KEY_ALIAS` | Key alias in keystore | Alias you set (e.g., "flash-pos-release") | +| `ANDROID_KEY_PASSWORD` | Key password | Password for the key (often same as keystore) | + +## Usage + +### Deploying iOS + +#### Option 1: Manual Trigger via GitHub Actions +1. Go to your GitHub repository +2. Click "Actions" → "iOS Deploy" workflow +3. Click "Run workflow" +4. Select lane: `beta` (TestFlight) or `release` (App Store) + +#### Option 2: Git Tag (Automated) +```bash +# For beta/TestFlight +git tag ios/v0.3.3-beta.1 +git push origin ios/v0.3.3-beta.1 + +# For production +git tag ios/v0.3.3 +git push origin ios/v0.3.3 +``` + +#### Option 3: Local Fastlane +```bash +# TestFlight +bundle exec fastlane ios beta + +# App Store +bundle exec fastlane ios release +``` + +### Deploying Android + +#### Option 1: Manual Trigger via GitHub Actions +1. Go to your GitHub repository +2. Click "Actions" → "Android Deploy" workflow +3. Click "Run workflow" +4. Select lane: `beta`, `release`, or `promote_to_beta` + +#### Option 2: Git Tag (Automated) +```bash +# For internal testing +git tag android/v0.3.1-beta.1 +git push origin android/v0.3.1-beta.1 + +# For production +git tag android/v0.3.1 +git push origin android/v0.3.1 +``` + +#### Option 3: Local Fastlane +```bash +# Internal testing +bundle exec fastlane android beta + +# Production (10% rollout) +bundle exec fastlane android release + +# Promote internal to beta +bundle exec fastlane android promote_to_beta +``` + +### Deployment Tracks + +**iOS:** +- `beta` lane → TestFlight (for internal/external testing) +- `release` lane → App Store (submitted for review, not auto-released) + +**Android:** +- `beta` lane → Internal Testing track +- `promote_to_beta` lane → Beta track (open testing) +- `release` lane → Production track (10% staged rollout) + +## Version Management + +### iOS +- Version number (e.g., 0.3.3) is in [ios/flash_pos.xcodeproj](ios/flash_pos.xcodeproj) +- Build number is auto-incremented by Fastlane +- Update version manually in Xcode or via: + ```bash + bundle exec fastlane run increment_version_number xcodeproj:"ios/flash_pos.xcodeproj" + ``` + +### Android +- Version name (e.g., 0.3.1) is in [android/app/build.gradle](android/app/build.gradle#L87) +- Version code is auto-incremented by Fastlane +- Update version name manually in build.gradle + +## Troubleshooting + +### iOS Issues + +**"Could not find or download user credentials"** +- Check your `APPLE_ID` and `FASTLANE_PASSWORD` secrets +- Verify app-specific password is correct + +**"No signing certificate found"** +- Run `bundle exec fastlane match appstore` locally first +- Check `MATCH_PASSWORD` and `MATCH_GIT_BASIC_AUTHORIZATION` secrets + +**"Provisioning profile doesn't match"** +- Make sure bundle identifier is exactly `com.flash.pos` +- Re-run match: `bundle exec fastlane match appstore --force` + +### Android Issues + +**"Package not found"** +- Make sure you uploaded the first version manually to Play Console +- Verify package name is `com.flash_pos` + +**"Google Play API error"** +- Check service account has correct permissions in Play Console +- Verify `GOOGLE_PLAY_JSON_KEY` secret is correct JSON + +**"Failed to sign APK"** +- Verify keystore password and alias are correct +- Check `ANDROID_KEYSTORE_BASE64` is properly encoded + +### General + +**"Git dirty" error** +- Some lanes require clean git state +- Commit all changes before deploying + +**Workflow doesn't trigger** +- Check tag format: `ios/v*` or `android/v*` +- Verify workflows are enabled in repository settings + +## Security Best Practices + +1. **Never commit sensitive files:** + - `*.keystore` files + - Service account JSON files + - `.p8` API key files + - Passwords or tokens + +2. **Rotate credentials periodically:** + - App-specific passwords + - Service account keys + - Personal access tokens + +3. **Limit access:** + - Use minimum required permissions for service accounts + - Restrict repository access to deployment secrets + +4. **Monitor deployments:** + - Check GitHub Actions logs regularly + - Set up notifications for failed workflows + +## Next Steps + +After setup: +1. Test beta deployments first +2. Verify apps appear in TestFlight/Internal Testing +3. Test the full release process with production +4. Set up automated testing before deployment (optional) +5. Configure automatic changelog generation (optional) + +## Support + +For issues with: +- **Fastlane:** [fastlane.tools/docs](https://docs.fastlane.tools) +- **GitHub Actions:** [docs.github.com/actions](https://docs.github.com/en/actions) +- **App Store Connect:** [developer.apple.com/support](https://developer.apple.com/support) +- **Google Play Console:** [support.google.com/googleplay](https://support.google.com/googleplay/android-developer) diff --git a/Gemfile b/Gemfile index 85d7f68..8547f61 100644 --- a/Gemfile +++ b/Gemfile @@ -7,3 +7,4 @@ ruby ">= 2.6.10" gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' gem 'xcodeproj', '< 1.26.0' +gem 'fastlane' diff --git a/Gemfile.lock b/Gemfile.lock index b9b24bd..8191311 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,7 @@ GEM base64 nkf rexml + abbrev (0.1.2) activesupport (7.1.5.1) base64 benchmark (>= 0.3) @@ -23,7 +24,28 @@ GEM algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) + artifactory (3.0.17) atomos (0.1.3) + aws-eventstream (1.4.0) + aws-partitions (1.1262.0) + aws-sdk-core (3.252.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal + jmespath (~> 1, >= 1.6.1) + logger + aws-sdk-kms (1.129.0) + aws-sdk-core (~> 3, >= 3.248.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.226.0) + aws-sdk-core (~> 3, >= 3.248.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) base64 (0.2.0) benchmark (0.4.0) bigdecimal (3.1.9) @@ -65,37 +87,214 @@ GEM nap (>= 0.8, < 2.0) netrc (~> 0.11) cocoapods-try (1.2.0) + colored (1.2) colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) concurrent-ruby (1.3.5) connection_pool (2.5.0) + csv (3.3.5) + declarative (0.0.20) + digest-crc (0.7.0) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.6.20240107) + dotenv (2.8.1) drb (2.2.1) + emoji_regex (3.2.3) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) + excon (0.112.0) + faraday (1.10.5) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.8) + faraday (>= 0.8.0) + http-cookie (>= 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.1) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.2.0) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.4) + faraday_middleware (1.2.1) + faraday (~> 1.0) + fastimage (2.4.1) + fastlane (2.236.1) + CFPropertyList (>= 2.3, < 5.0.0) + abbrev (~> 0.1) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.197) + babosa (>= 1.0.3, < 2.0.0) + base64 (~> 0.2) + benchmark (>= 0.1.0) + bundler (>= 2.4.0, < 5.0.0) + colored (~> 1.2) + commander (~> 4.6) + csv (~> 3.3) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.1.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-env (>= 1.6.0, < 2.3.0) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + http-cookie (~> 1.0.5) + json (< 3.0.0) + jwt (>= 2.10.3, < 4) + logger (>= 1.6, < 2.0) + mini_magick (>= 4.9.4, < 5.0.0) + multi_json (~> 1.12) + multipart-post (>= 2.0.0, < 3.0.0) + mutex_m (~> 0.3) + naturally (~> 2.2) + nkf (~> 0.2) + optparse (>= 0.1.1, < 1.0.0) + ostruct (>= 0.1.0) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.5) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (~> 3) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.4.1) + xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) + fastlane-sirp (1.1.0) ffi (1.17.1) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.103.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-core (0.18.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 1.9) + httpclient (>= 2.8.3, < 3.a) + mini_mime (~> 1.0) + mutex_m + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + google-apis-iamcredentials_v1 (0.28.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-playcustomapp_v1 (0.18.0) + google-apis-core (>= 0.15.0, < 2.a) + google-apis-storage_v1 (0.64.0) + google-apis-core (>= 0.15.0, < 2.a) + google-cloud-core (1.9.0) + google-cloud-env (>= 1.0, < 3.a) + google-cloud-errors (~> 1.0) + google-cloud-env (2.2.2) + base64 (~> 0.2) + faraday (>= 1.0, < 3.a) + google-cloud-errors (1.6.0) + google-cloud-storage (1.61.0) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-core (>= 0.18, < 2) + google-apis-iamcredentials_v1 (~> 0.18) + google-apis-storage_v1 (>= 0.42) + google-cloud-core (~> 1.6) + googleauth (~> 1.9) + mini_mime (~> 1.0) + google-logging-utils (0.2.0) + googleauth (1.17.1) + faraday (>= 1.0, < 3.a) + google-cloud-env (~> 2.2) + google-logging-utils (~> 0.1) + jwt (>= 1.4, < 4.0) + os (>= 0.9, < 2.0) + pstore (~> 0.1) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.8) + domain_name (~> 0.5) httpclient (2.8.3) i18n (1.14.6) concurrent-ruby (~> 1.0) + jmespath (1.6.2) json (2.9.1) + jwt (3.2.0) + base64 logger (1.6.5) + mini_magick (4.13.2) + mini_mime (1.1.5) minitest (5.25.4) molinillo (0.8.0) + multi_json (1.21.1) + multipart-post (2.4.1) mutex_m (0.3.0) nanaimo (0.3.0) nap (1.1.0) + naturally (2.3.0) netrc (0.11.0) nkf (0.2.0) + optparse (0.8.1) + os (1.1.4) + ostruct (0.6.3) + plist (3.7.2) + pstore (0.2.1) public_suffix (4.0.7) + rake (13.4.2) + representable (3.2.0) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.8.0) rexml (3.4.0) + rouge (3.28.0) ruby-macho (2.5.1) + ruby2_keywords (0.0.5) + rubyzip (2.4.1) securerandom (0.3.2) + security (0.1.5) + signet (0.22.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) + jwt (>= 1.5, < 4.0) + simctl (1.6.10) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.2) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) + uber (0.1.0) + unicode-display_width (2.6.0) + word_wrap (1.0.0) xcodeproj (1.25.1) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) @@ -103,6 +302,10 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (>= 3.3.6, < 4.0) + xcpretty (0.4.1) + rouge (~> 3.28.0) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) PLATFORMS ruby @@ -110,6 +313,7 @@ PLATFORMS DEPENDENCIES activesupport (>= 6.1.7.5, != 7.1.0) cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + fastlane xcodeproj (< 1.26.0) RUBY VERSION diff --git a/android/gradle.properties b/android/gradle.properties.example similarity index 86% rename from android/gradle.properties rename to android/gradle.properties.example index 31c8102..6993689 100644 --- a/android/gradle.properties +++ b/android/gradle.properties.example @@ -38,7 +38,10 @@ newArchEnabled=true # If set to false, you will be using JSC instead. hermesEnabled=true +# Android signing configuration +# Copy this file to gradle.properties and fill in your actual values +# DO NOT commit gradle.properties with real passwords! MYAPP_UPLOAD_STORE_FILE=release.keystore -MYAPP_UPLOAD_KEY_ALIAS=flash-pos-release -MYAPP_UPLOAD_STORE_PASSWORD=mortal2 -MYAPP_UPLOAD_KEY_PASSWORD=mortal2 +MYAPP_UPLOAD_KEY_ALIAS=your-key-alias +MYAPP_UPLOAD_STORE_PASSWORD=your-keystore-password +MYAPP_UPLOAD_KEY_PASSWORD=your-key-password diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 0000000..45c987b --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,15 @@ +# iOS App Identifier +app_identifier("com.flash.pos") + +# Apple ID for App Store Connect +apple_id(ENV["APPLE_ID"]) + +# iOS Team ID +itc_team_id(ENV["ITC_TEAM_ID"]) +team_id(ENV["TEAM_ID"]) + +# Android package name +package_name("com.flash_pos") + +# JSON key file path for Google Play +json_key_file(ENV["GOOGLE_PLAY_JSON_KEY_PATH"]) diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000..6e16c7c --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,239 @@ +# Fastfile for flash_pos +# This file contains the fastlane configuration for iOS and Android deployments + +default_platform(:ios) + +# ==================== iOS Platform ==================== +platform :ios do + desc "Push a new beta build to TestFlight" + lane :beta do + # Ensure we're on a clean git state + ensure_git_status_clean + + # Increment build number + increment_build_number( + xcodeproj: "ios/flash_pos.xcodeproj" + ) + + # Install CocoaPods dependencies + cocoapods( + podfile: "ios/Podfile" + ) + + # Build the app + build_app( + workspace: "ios/flash_pos.xcworkspace", + scheme: "flash_pos", + export_method: "app-store", + export_options: { + provisioningProfiles: { + "com.flash.pos" => "match AppStore com.flash.pos" + } + } + ) + + # Upload to TestFlight + upload_to_testflight( + skip_waiting_for_build_processing: true, + apple_id: ENV["APPLE_ID"] + ) + + # Commit version bump + commit_version_bump( + message: "Bump iOS build number [skip ci]", + xcodeproj: "ios/flash_pos.xcodeproj" + ) + + # Add git tag + add_git_tag( + tag: "ios/v#{get_version_number(xcodeproj: 'ios/flash_pos.xcodeproj')}-#{get_build_number(xcodeproj: 'ios/flash_pos.xcodeproj')}" + ) + end + + desc "Deploy a new version to the App Store" + lane :release do + # Ensure we're on a clean git state + ensure_git_status_clean + + # Increment version number (optional - comment out if managing manually) + # increment_version_number(xcodeproj: "ios/flash_pos.xcodeproj") + + # Increment build number + increment_build_number( + xcodeproj: "ios/flash_pos.xcodeproj" + ) + + # Install CocoaPods dependencies + cocoapods( + podfile: "ios/Podfile" + ) + + # Build the app + build_app( + workspace: "ios/flash_pos.xcworkspace", + scheme: "flash_pos", + export_method: "app-store", + export_options: { + provisioningProfiles: { + "com.flash.pos" => "match AppStore com.flash.pos" + } + } + ) + + # Upload to App Store + upload_to_app_store( + force: true, + submit_for_review: false, + automatic_release: false, + skip_metadata: false, + skip_screenshots: false, + precheck_include_in_app_purchases: false + ) + + # Commit version bump + commit_version_bump( + message: "Release iOS v#{get_version_number(xcodeproj: 'ios/flash_pos.xcodeproj')} [skip ci]", + xcodeproj: "ios/flash_pos.xcodeproj" + ) + + # Add git tag + add_git_tag( + tag: "ios/v#{get_version_number(xcodeproj: 'ios/flash_pos.xcodeproj')}" + ) + end + + desc "Setup code signing using match" + lane :setup_signing do + match( + type: "appstore", + app_identifier: "com.flash.pos", + readonly: is_ci + ) + end +end + +# ==================== Android Platform ==================== +platform :android do + desc "Deploy a new beta version to Google Play Internal Testing" + lane :beta do + # Ensure we're on a clean git state + ensure_git_status_clean + + # Increment version code + increment_version_code( + gradle_file_path: "android/app/build.gradle" + ) + + # Build the Android app bundle + gradle( + task: "bundle", + build_type: "Release", + project_dir: "android/" + ) + + # Upload to Google Play Internal Testing + upload_to_play_store( + track: "internal", + aab: "android/app/build/outputs/bundle/release/app-release.aab", + skip_upload_metadata: true, + skip_upload_images: true, + skip_upload_screenshots: true + ) + + # Commit version bump + git_commit( + path: ["android/app/build.gradle"], + message: "Bump Android version code [skip ci]" + ) + + # Add git tag + version_name = get_version_name( + gradle_file_path: "android/app/build.gradle" + ) + version_code = get_version_code( + gradle_file_path: "android/app/build.gradle" + ) + add_git_tag( + tag: "android/v#{version_name}-#{version_code}" + ) + end + + desc "Deploy a new version to Google Play Production" + lane :release do + # Ensure we're on a clean git state + ensure_git_status_clean + + # Increment version code + increment_version_code( + gradle_file_path: "android/app/build.gradle" + ) + + # Build the Android app bundle + gradle( + task: "bundle", + build_type: "Release", + project_dir: "android/" + ) + + # Upload to Google Play Production (staged rollout) + upload_to_play_store( + track: "production", + aab: "android/app/build/outputs/bundle/release/app-release.aab", + rollout: "0.1", # Start with 10% rollout + skip_upload_metadata: false, + skip_upload_images: false, + skip_upload_screenshots: false + ) + + # Commit version bump + version_name = get_version_name( + gradle_file_path: "android/app/build.gradle" + ) + git_commit( + path: ["android/app/build.gradle"], + message: "Release Android v#{version_name} [skip ci]" + ) + + # Add git tag + add_git_tag( + tag: "android/v#{version_name}" + ) + end + + desc "Promote internal testing to beta" + lane :promote_to_beta do + upload_to_play_store( + track: "internal", + track_promote_to: "beta", + skip_upload_aab: true, + skip_upload_metadata: true, + skip_upload_images: true, + skip_upload_screenshots: true + ) + end + + desc "Build APK for testing" + lane :build_apk do + gradle( + task: "assemble", + build_type: "Release", + project_dir: "android/" + ) + end +end + +# ==================== Helper functions ==================== + +# Helper to get version name from gradle +def get_version_name(gradle_file_path:) + gradle_file = File.read("../#{gradle_file_path}") + version_name = gradle_file.match(/versionName\s+"(.+?)"/)[1] + version_name +end + +# Helper to get version code from gradle +def get_version_code(gradle_file_path:) + gradle_file = File.read("../#{gradle_file_path}") + version_code = gradle_file.match(/versionCode\s+(\d+)/)[1] + version_code +end diff --git a/fastlane/Matchfile b/fastlane/Matchfile new file mode 100644 index 0000000..683d6a5 --- /dev/null +++ b/fastlane/Matchfile @@ -0,0 +1,28 @@ +# Matchfile - Fastlane Match Configuration +# For more information: https://docs.fastlane.tools/actions/match/ + +# Git URL for storing certificates and profiles +# Replace with your actual certificates repository +git_url(ENV["MATCH_GIT_URL"] || "https://github.com/lnflash/flash-pos-certificates") + +# App identifier +app_identifier(["com.flash.pos"]) + +# Storage mode +storage_mode("git") + +# Type of provisioning profile +type("appstore") # Can be: appstore, adhoc, development, enterprise + +# Git branch to use +git_branch("main") + +# Should the command fail if not all certificates and profiles are present? +# In CI, we want to be strict (readonly means don't create new certificates) +readonly(ENV["CI"] == "true") + +# Username (Apple ID) +username(ENV["APPLE_ID"]) + +# Team ID +team_id(ENV["TEAM_ID"]) diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 0000000..6a23220 --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,85 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios beta + +```sh +[bundle exec] fastlane ios beta +``` + +Push a new beta build to TestFlight + +### ios release + +```sh +[bundle exec] fastlane ios release +``` + +Deploy a new version to the App Store + +### ios setup_signing + +```sh +[bundle exec] fastlane ios setup_signing +``` + +Setup code signing using match + +---- + + +## Android + +### android beta + +```sh +[bundle exec] fastlane android beta +``` + +Deploy a new beta version to Google Play Internal Testing + +### android release + +```sh +[bundle exec] fastlane android release +``` + +Deploy a new version to Google Play Production + +### android promote_to_beta + +```sh +[bundle exec] fastlane android promote_to_beta +``` + +Promote internal testing to beta + +### android build_apk + +```sh +[bundle exec] fastlane android build_apk +``` + +Build APK for testing + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 4f166a6..19332ee 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2114,4 +2114,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 528389498027cce3f8c222a2e3f73c1367659c79 -COCOAPODS: 1.14.2 +COCOAPODS: 1.16.2 diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 2aefb09..cf71d2d 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -323,10 +323,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-resources.sh\"\n"; @@ -384,10 +388,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-resources-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-resources-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-resources.sh\"\n"; @@ -401,10 +409,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-frameworks.sh\"\n"; @@ -418,10 +430,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-frameworks.sh\"\n"; @@ -516,7 +532,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -527,7 +543,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.1; + MARKETING_VERSION = 0.3.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -548,7 +564,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; @@ -558,7 +574,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.1; + MARKETING_VERSION = 0.3.3; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -640,10 +656,7 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); + OTHER_LDFLAGS = "$(inherited) "; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -712,10 +725,7 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); + OTHER_LDFLAGS = "$(inherited) "; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; USE_HERMES = true; diff --git a/package.json b/package.json index f798f11..a92f123 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,13 @@ "test": "jest", "aab-android": "cd android && ./gradlew bundleRelease && cd ..", "apk-android": "cd android && ./gradlew app:assembleRelease && cd ..", - "postinstall": "patch-package" + "postinstall": "patch-package", + "deploy:ios:beta": "bundle exec fastlane ios beta", + "deploy:ios:release": "bundle exec fastlane ios release", + "deploy:android:beta": "bundle exec fastlane android beta", + "deploy:android:release": "bundle exec fastlane android release", + "deploy:android:promote": "bundle exec fastlane android promote_to_beta", + "setup:ios:signing": "bundle exec fastlane ios setup_signing" }, "dependencies": { "@apollo/client": "^3.12.6", From 607174876527039abfa173f3d36770083ff5e5e9 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 14:00:29 +0500 Subject: [PATCH 02/64] Fix: Remove incorrect apple_id parameter from upload_to_testflight --- fastlane/Fastfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 6e16c7c..58c87f2 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -34,8 +34,7 @@ platform :ios do # Upload to TestFlight upload_to_testflight( - skip_waiting_for_build_processing: true, - apple_id: ENV["APPLE_ID"] + skip_waiting_for_build_processing: true ) # Commit version bump From 6748270ee0c7dc6b7ddb3136872a205ab89fc240 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 14:03:03 +0500 Subject: [PATCH 03/64] Bump iOS build number to 9 [skip ci] --- ios/Podfile.lock | 110 ++++++++++++------------ ios/flash_pos.xcodeproj/project.pbxproj | 30 +++---- ios/flash_pos/Info.plist | 2 +- ios/flash_posTests/Info.plist | 2 +- 4 files changed, 67 insertions(+), 77 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 19332ee..0fbf74e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2047,71 +2047,71 @@ SPEC CHECKSUMS: RCTTypeSafety: 0f96bf6c99efc33eb43352212703854933f22930 React: 1d3d5bada479030961d513fb11e42659b30e97ff React-callinvoker: 682c610b9e9d3b93bd8d0075eacb2e6aa304d3e0 - React-Core: 10420b32e62acf6b3aa0a570e45566001175c777 - React-CoreModules: aad977a7dbff83aa707c4045e5db81446a511cca - React-cxxreact: 1bee1b97e7d537f1a33d9eb68c9426c1fc1a4e3c + React-Core: 9f33c0fc7776a5796d4dae09c363bd58e6a27efe + React-CoreModules: 91afb654834f0a1f48fb26dd1f4d1a1460c44def + React-cxxreact: c7491114266a70f8215306f1d0c4b54a811e77cf React-debug: 4ae2e95c2d392cca29939a3a2f2b4320ddff3e59 - React-defaultsnativemodule: b585565214178c5780b54e4d56815d65782eac81 - React-domnativemodule: 03fd1847e49505aa9024acbe4f0811e441dc89a2 - React-Fabric: fc0898bb601b03ed41ab0df3e7b1a4acd05a6cff - React-FabricComponents: 13e78253b210d112b3ffddca5b7323db7f254358 - React-FabricImage: a86ff938570a06c2a9fbf00ff0b00195f0bd4aba + React-defaultsnativemodule: 43d27f1844b4c18fc03fa4fa35ea2f1c48d64237 + React-domnativemodule: bca178dd0ce1532f75be783f6f2923f675a778ae + React-Fabric: d6bc0222335270eb76c28dd5036c03a010c04d51 + React-FabricComponents: 05eec9e2cf998be793daaee8fa8a8ea6d1187785 + React-FabricImage: 3a12374b0aedda71c7ef6bd64b59479b8bb3fe05 React-featureflags: 5670e0dcdc17ba2515963d117dacc13d5b69c431 - React-featureflagsnativemodule: 79dea40c60cdc0356aadc67a099bba0af8c34e4f - React-graphics: 04eed50a115e750e4644c1e955f32bec57f6a235 - React-hermes: add932964f5ef024c86352dcc0dc427e6309642e - React-idlecallbacksnativemodule: 3e8d5085a21eb2f70ac64ff9817f8f8a603518a9 - React-ImageManager: 3239badd14cc602baf836b5d7151ffa90393deae - React-jserrorhandler: 81ac36638e02c33a9df0bdbeec464d2e699ac8a9 - React-jsi: 690f3742db66cab8d5219bcfbc19fee112c6bb0c - React-jsiexecutor: a060f7e989da21e2478f652d7799e3b5ae5db262 - React-jsinspector: 0eb6ea6f6b1e42edeab4bcad092d37ef748e337a - React-jsitracing: 737a69a469e2bc821cf8ae11977bded522393719 - React-logger: 162c09cc432b02d4a0db31b1d98f6df5243a2679 - React-Mapbuffer: f760d2229640be48cb3c2d4832b5bbc3018123fc - React-microtasksnativemodule: 1364ae5354f51b3ecee8eb718b5b6d1686d2ff4d - react-native-html-to-pdf: 4c5c6e26819fe202971061594058877aa9b25265 - react-native-nfc-manager: f7156b2485f43a664c26f3c519408ef356b61042 - react-native-print: f704aef52d931bfce6d1d84351dbb5232d7ecb89 - react-native-safe-area-context: e62e5018aa79e6679071eab7206fb92053329c4c - react-native-webview: 2505a8acf452640e3074f638b5489816e4ba7024 + React-featureflagsnativemodule: bb13129d1427327b2eb8cc13d3879363a4cd8326 + React-graphics: 659968f797257c0071ddff28a2d094c8e5c5899c + React-hermes: 6eb81c6f72c25d9058b6030227d0fcc1f741a807 + React-idlecallbacksnativemodule: 551b7a89b46041c746640fe13eacf39c1b169709 + React-ImageManager: e3d0270c82bf39432da2aff2fcd60dd16b308689 + React-jserrorhandler: f60c9b68b4d4ac1449bddc2553610708e939ddee + React-jsi: 47528a2928f38fe15e3d06a96de886e1a779ffc7 + React-jsiexecutor: 88a141c4dc821e1b2aa7ecc7d6af7b186e8455a2 + React-jsinspector: c26cf4118ea7c1aae721d2cde5acf3b2cdceb814 + React-jsitracing: 810d0465c3455e352a71147c18332b1cba1d1410 + React-logger: d42a53754a7252cc7a851315f0da2e46b450ea92 + React-Mapbuffer: 89885d1518433a462fe64b68bf5e097997380090 + React-microtasksnativemodule: 36341e09dcd1df535503e6ed2ddf88f10da56d52 + react-native-html-to-pdf: 7a49e6c58ac5221bcc093027b195f4b214f27a9d + react-native-nfc-manager: 7057a9c593c369fa0829a0263530ff2922a7465a + react-native-print: 692e8782bc89872ea01738c6759631388e77358c + react-native-safe-area-context: bb9dd7ee24674663cc345a423409e4542eabd1a9 + react-native-webview: 67481c7bba1ac534c7d3c9bd3d69d2b8c3bcf137 React-nativeconfig: 539ff4de6ce3b694e8e751080568c281c84903ce - React-NativeModulesApple: 771cc40b086281b820fe455fedebbe4341fd0c90 - React-perflogger: 4e80a5b8d61dfb38024e7d5b8efaf9ce1037d31f - React-performancetimeline: 1dcacc31d81f790f43a2d434ec95b0f864582329 + React-NativeModulesApple: 702246817c286d057e23fe4b1302019796e62521 + React-perflogger: f260e2de95f9dbd002035251559c13bf1f0643d4 + React-performancetimeline: 957075cead70fe9536a327eb4f842b3d8982f2ec React-RCTActionSheet: ed5a845eae98fe455b9a1d71f057d626e2f3f1c5 - React-RCTAnimation: 0cda303ef8ca5a2d0ee9e425f188cc9fc1d2e20f - React-RCTAppDelegate: 1edcdebdaebf5120bdaa9d54bc40789714be3719 - React-RCTBlob: dab83a3c22210e5c7a8267834c68e6cf94bc1ce2 - React-RCTFabric: 19ba31d6b913b8b4aa8b27e4d6f5dc8ebd93a438 - React-RCTImage: b9c3d2cff3b8214322022cdf8afb92ff978bb92e - React-RCTLinking: e58c4fa216f9ac87ed3d4a0cce03905df67adec0 - React-RCTNetwork: 9f206fa039e107f51ddfac133df79105643ea2bd - React-RCTSettings: c7663cfcb3531cd438b8f73e98cd2d982a4bbd72 - React-RCTText: cfee29316f1049f016cbd81328a89a8a07410bba - React-RCTVibration: 20f5efc1b05cd3f5f7ea03489dd3766c890fb493 + React-RCTAnimation: a49bd2c28c3f32b1d01ff1163603aee3d420ce42 + React-RCTAppDelegate: f7aa2f938a6673cfd2a76e76fea8c4b38a4a5bec + React-RCTBlob: 8ddf30f97222f4d8227f64428349fd8252292cb5 + React-RCTFabric: 51fb64f7ca7ca2fa334433ba6d4f12750a481cf1 + React-RCTImage: 077a25f3a9a6b79938a01c2cfae05ea5f07fc584 + React-RCTLinking: 0c8415c600942454d663c4c4dc0d3b00aa7ba5e5 + React-RCTNetwork: 42a3c6fb5318dcc9f8796f43de081799fb905021 + React-RCTSettings: 1028522e45192515bd8c5308752d3270ee95fd66 + React-RCTText: 29ef786d78f69ec5b571634ef2ddd6ec177c958a + React-RCTVibration: 97859ed50816369f4830f623dfac8dc9877f3c5c React-rendererconsistency: ccd50d5ee6544b26cd11fff5ad1112c5058a0064 - React-rendererdebug: d8f43065459c2095f27a173121f03dcd1d1b08e5 + React-rendererdebug: 2092a1207a0023ac30877f4f730b403bfaf5ccbe React-rncore: bfe554cb773978e8b94898866964c9579cb0c70c - React-RuntimeApple: 89c319b1610d4ca8895642cf0eae1188bf864270 - React-RuntimeCore: 30399cbd2368f7e031692875275984fa42142601 + React-RuntimeApple: 80949ebe7e6a94296e0168a940832d2029b66982 + React-RuntimeCore: f04b5d1eb0534a4f4f46bc76a938a9360ad91024 React-runtimeexecutor: 26a9d14619ec1359470df391be9abb7c80a21b2b - React-RuntimeHermes: c78f07b7a599c1c9a889189c02436600e72c8b27 - React-runtimescheduler: 9f6b0b85154ed8a17a899cd1bab258a26c8db2cd + React-RuntimeHermes: 91c2a67a99f316f11a08d3d9280ab4c9fae59b56 + React-runtimescheduler: 76bb85f5ba01e800b4970fbc84eeaf10756c50c4 React-timing: c9c7c0fe2fdfc433ef208889b6191dfb45457d68 - React-utils: e6697b03f21c7ac57b075d848cda7882662cabf7 - ReactCodegen: 484b223748d7489d7036db1cbf79896d297e33a7 - ReactCommon: 832cdd669aeecd430d9ca1975d15676b38d0b263 - RNCAsyncStorage: e261f5fef2092b11db2e9dfd0cf3620b1d88dca3 - RNCClipboard: c063069de0ee3c7fbe7e0fc2eb09a62c5b972193 - RNCPicker: a026a12f053e1c15ddc645f8634144031f1e7832 - RNGestureHandler: ae770b39b94ce66e50efc46499c5917e409fb5b8 - RNScreens: 94142456c1ace0c4cf3a5f6466e87817a0229ab0 - RNSVG: 6a8141c00a6910cf065cec3f58443efed9d51d1e - RNVectorIcons: 07792a9538e8577c1263fcad187712e90d65d8fb + React-utils: 1b14c41c3edf4d96db1247a78e0ad96e7ceea011 + ReactCodegen: 0a0eef9c8cd84c932ae1868832086c6441811e84 + ReactCommon: 3c1c8c6d777103c0e60e37c6c5f08e828e2a77c9 + RNCAsyncStorage: f27db574d8d0d56438ec4e9ba345872f2d0f29f4 + RNCClipboard: 5fdc5218e7aa17c955bfc6c58264b406034ec31b + RNCPicker: 3676a8a70c9602dab839b01bd7c245a0e55e54ac + RNGestureHandler: 90a94cd1ec2680cd5811725f9ba3ab840765c497 + RNScreens: df8f6e8b613126c58f6436f9853b81717ce11a80 + RNSVG: 5e9214607f60aca5f82bd5c86ad092be4c15a870 + RNVectorIcons: a24016b773380b1aa37fca501ec6b94a951890a0 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: be6f55a028e86c83ae066f018e9b5d24ffc45436 PODFILE CHECKSUM: 528389498027cce3f8c222a2e3f73c1367659c79 -COCOAPODS: 1.16.2 +COCOAPODS: 1.15.2 diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index cf71d2d..0aaee40 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -323,14 +323,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-resources.sh\"\n"; @@ -388,14 +384,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-resources.sh\"\n"; @@ -409,14 +401,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos-flash_posTests/Pods-flash_pos-flash_posTests-frameworks.sh\"\n"; @@ -430,14 +418,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-flash_pos/Pods-flash_pos-frameworks.sh\"\n"; @@ -532,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -564,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; @@ -656,7 +640,10 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -725,7 +712,10 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; USE_HERMES = true; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 996cf1c..7193d66 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - $(CURRENT_PROJECT_VERSION) + 9 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index ba72822..0c590ff 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1 + 9 From 2b34dd1091946fc31236013695b069a559ab2696 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 17:56:48 +0500 Subject: [PATCH 04/64] Add deployment helper scripts and bump build to 10 [skip ci] --- deploy-android.sh | 16 ++++++++++++++++ deploy-ios.sh | 16 ++++++++++++++++ ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- ios/flash_pos/Info.plist | 2 +- ios/flash_posTests/Info.plist | 2 +- 5 files changed, 36 insertions(+), 4 deletions(-) create mode 100755 deploy-android.sh create mode 100755 deploy-ios.sh diff --git a/deploy-android.sh b/deploy-android.sh new file mode 100755 index 0000000..682afa4 --- /dev/null +++ b/deploy-android.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Load environment variables from .env.fastlane +if [ -f .env.fastlane ]; then + export $(cat .env.fastlane | grep -v '^#' | xargs) +else + echo "Error: .env.fastlane file not found!" + echo "Please create it with your credentials." + exit 1 +fi + +# Run the deployment +LANE=${1:-beta} + +echo "🚀 Deploying Android to $LANE..." +bundle exec fastlane android $LANE diff --git a/deploy-ios.sh b/deploy-ios.sh new file mode 100755 index 0000000..57174d7 --- /dev/null +++ b/deploy-ios.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Load environment variables from .env.fastlane +if [ -f .env.fastlane ]; then + export $(cat .env.fastlane | grep -v '^#' | xargs) +else + echo "Error: .env.fastlane file not found!" + echo "Please create it with your credentials." + exit 1 +fi + +# Run the deployment +LANE=${1:-beta} + +echo "🚀 Deploying iOS to $LANE..." +bundle exec fastlane ios $LANE diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 0aaee40..4fc56fa 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -548,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 7193d66..5ee913e 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 9 + 10 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index 0c590ff..af84f46 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 9 + 10 From 123c6b6c14ce8086e7199e08e7ca09fe5b9394cd Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 18:21:11 +0500 Subject: [PATCH 05/64] Fix commit_version_bump and bump iOS build to 11 [skip ci] --- fastlane/Fastfile | 6 ++++-- ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- ios/flash_pos/Info.plist | 2 +- ios/flash_posTests/Info.plist | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 58c87f2..c860a1c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -40,7 +40,8 @@ platform :ios do # Commit version bump commit_version_bump( message: "Bump iOS build number [skip ci]", - xcodeproj: "ios/flash_pos.xcodeproj" + xcodeproj: "ios/flash_pos.xcodeproj", + force: true ) # Add git tag @@ -92,7 +93,8 @@ platform :ios do # Commit version bump commit_version_bump( message: "Release iOS v#{get_version_number(xcodeproj: 'ios/flash_pos.xcodeproj')} [skip ci]", - xcodeproj: "ios/flash_pos.xcodeproj" + xcodeproj: "ios/flash_pos.xcodeproj", + force: true ) # Add git tag diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 4fc56fa..21d9000 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 10; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -548,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 10; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 5ee913e..768461c 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 10 + 11 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index af84f46..ac7881d 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 10 + 11 From 839777b695821a9b36a29ede8ea90950ad16bb84 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 18:30:14 +0500 Subject: [PATCH 06/64] Add git tag-based automatic versioning - Version numbers automatically set from git tags - Supports platform-specific tags (ios/v1.2.3, android/v1.2.3) - Supports generic tags (v1.2.3) for both platforms - Falls back to current version if no tag present - Updated documentation with tag workflow examples --- DEPLOYMENT_QUICK_START.md | 31 ++++++++++++++++++++ fastlane/Fastfile | 62 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/DEPLOYMENT_QUICK_START.md b/DEPLOYMENT_QUICK_START.md index cd8a22a..aec2098 100644 --- a/DEPLOYMENT_QUICK_START.md +++ b/DEPLOYMENT_QUICK_START.md @@ -18,6 +18,37 @@ Before you can use automated deployment, complete the one-time setup: ## Daily Usage +### Version Management with Git Tags + +The deployment system automatically sets version numbers from git tags: + +**Without git tag:** +- Version stays at current (e.g., 0.3.3) +- Build number auto-increments + +**With git tag:** +```bash +# Tag with new version before deploying +git tag ios/v0.4.0 +git tag android/v0.4.0 + +# Or use a single version tag for both +git tag v0.4.0 + +# Then deploy +./deploy-ios.sh +``` + +**Tag Format:** +- `ios/v1.2.3` - iOS-specific version +- `android/v1.2.3` - Android-specific version +- `v1.2.3` - Sets version for both platforms + +**When to create tags:** +- ✅ For production releases +- ✅ When version changes (0.3.3 → 0.4.0) +- ❌ Not needed for TestFlight builds with same version + ### Deploy to TestFlight (iOS Beta) ```bash diff --git a/fastlane/Fastfile b/fastlane/Fastfile index c860a1c..10ffdcb 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -3,6 +3,55 @@ default_platform(:ios) +# ==================== Helper Functions ==================== + +# Get version from latest git tag matching pattern +def version_from_git_tag(platform) + # Try to get the latest tag for this platform + tag = sh("git describe --tags --match '#{platform}/v*' --abbrev=0 2>/dev/null || echo ''").strip + + if tag.empty? + # Try generic version tag + tag = sh("git describe --tags --match 'v*' --abbrev=0 2>/dev/null || echo ''").strip + end + + if tag.empty? + return nil + end + + # Extract version number from tag (handles v1.2.3 or ios/v1.2.3 format) + version = tag.match(/v?(\d+\.\d+\.\d+)/) + version ? version[1] : nil +end + +# Set iOS version from git tag if available +def update_ios_version_from_tag + version = version_from_git_tag("ios") + if version + UI.success "📌 Setting iOS version to #{version} from git tag" + increment_version_number( + xcodeproj: "ios/flash_pos.xcodeproj", + version_number: version + ) + else + UI.message "ℹ️ No git tag found, keeping current version" + end +end + +# Set Android version from git tag if available +def update_android_version_from_tag + version = version_from_git_tag("android") + if version + UI.success "📌 Setting Android version to #{version} from git tag" + # Update versionName in build.gradle + gradle_file = File.read("../android/app/build.gradle") + new_gradle = gradle_file.gsub(/versionName\s+"[\d.]+"/, "versionName \"#{version}\"") + File.write("../android/app/build.gradle", new_gradle) + else + UI.message "ℹ️ No git tag found, keeping current version" + end +end + # ==================== iOS Platform ==================== platform :ios do desc "Push a new beta build to TestFlight" @@ -10,6 +59,9 @@ platform :ios do # Ensure we're on a clean git state ensure_git_status_clean + # Update version from git tag if present + update_ios_version_from_tag + # Increment build number increment_build_number( xcodeproj: "ios/flash_pos.xcodeproj" @@ -55,8 +107,8 @@ platform :ios do # Ensure we're on a clean git state ensure_git_status_clean - # Increment version number (optional - comment out if managing manually) - # increment_version_number(xcodeproj: "ios/flash_pos.xcodeproj") + # Update version from git tag if present + update_ios_version_from_tag # Increment build number increment_build_number( @@ -120,6 +172,9 @@ platform :android do # Ensure we're on a clean git state ensure_git_status_clean + # Update version from git tag if present + update_android_version_from_tag + # Increment version code increment_version_code( gradle_file_path: "android/app/build.gradle" @@ -164,6 +219,9 @@ platform :android do # Ensure we're on a clean git state ensure_git_status_clean + # Update version from git tag if present + update_android_version_from_tag + # Increment version code increment_version_code( gradle_file_path: "android/app/build.gradle" From e330f745f5f88f818af56494546784d6215bd395 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 20:23:22 +0500 Subject: [PATCH 07/64] Update .gitignore to ignore Google Play service account JSON files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 905bf1d..fa5354d 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ yarn-error.log google-play-key.json *.keystore !debug.keystore +flash-pos-*.json From 4d921ff94f1040b6b61d8b43ec25d6498eca3f38 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Wed, 24 Jun 2026 20:26:57 +0500 Subject: [PATCH 08/64] Fix Android version code increment with custom helper function --- fastlane/Fastfile | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 10ffdcb..f66979a 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -52,6 +52,23 @@ def update_android_version_from_tag end end +# Increment Android version code +def increment_android_version_code + gradle_file_path = "../android/app/build.gradle" + gradle_file = File.read(gradle_file_path) + + # Find current version code + current_version_code = gradle_file.match(/versionCode\s+(\d+)/)[1].to_i + new_version_code = current_version_code + 1 + + # Update version code + new_gradle = gradle_file.gsub(/versionCode\s+\d+/, "versionCode #{new_version_code}") + File.write(gradle_file_path, new_gradle) + + UI.success "Incremented Android version code: #{current_version_code} → #{new_version_code}" + new_version_code +end + # ==================== iOS Platform ==================== platform :ios do desc "Push a new beta build to TestFlight" @@ -176,9 +193,7 @@ platform :android do update_android_version_from_tag # Increment version code - increment_version_code( - gradle_file_path: "android/app/build.gradle" - ) + increment_android_version_code # Build the Android app bundle gradle( @@ -223,9 +238,7 @@ platform :android do update_android_version_from_tag # Increment version code - increment_version_code( - gradle_file_path: "android/app/build.gradle" - ) + increment_android_version_code # Build the Android app bundle gradle( From 65c8efc3db6f398581b9cc3e8575a4b328601c70 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 09:26:41 +0500 Subject: [PATCH 09/64] Fix Android upload to skip APK and only upload AAB --- fastlane/Fastfile | 1 + 1 file changed, 1 insertion(+) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index f66979a..1f34ac6 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -206,6 +206,7 @@ platform :android do upload_to_play_store( track: "internal", aab: "android/app/build/outputs/bundle/release/app-release.aab", + skip_upload_apk: true, skip_upload_metadata: true, skip_upload_images: true, skip_upload_screenshots: true From 72d008a689dba521777118e19e0e70d83c9dd910 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 09:30:07 +0500 Subject: [PATCH 10/64] Bump Android version code to 14 [skip ci] --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e3a9364..3e8f32a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 13 + versionCode 14 versionName "0.3.1" } signingConfigs { From 359782396cb107892237690e85ac42737805722d Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 10:24:43 +0500 Subject: [PATCH 11/64] docs: add comprehensive deployment system documentation - Add docs/ARCHITECTURE.md with complete system overview - Add docs/README.md as documentation index - Add docs/CHANGELOG.md for version tracking - Document all tools, workflows, and processes - Include troubleshooting and maintenance guides --- docs/ARCHITECTURE.md | 713 +++++++++++++++++++++++++++++++++++++++++++ docs/CHANGELOG.md | 27 ++ docs/README.md | 110 +------ 3 files changed, 755 insertions(+), 95 deletions(-) create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/CHANGELOG.md diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..4208e17 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,713 @@ +# Automated Deployment Architecture + +> **Last Updated:** June 24, 2026 +> **System Version:** 1.0 +> **Platforms:** iOS (TestFlight/App Store), Android (Google Play) + +## Table of Contents + +1. [Overview](#overview) +2. [System Architecture](#system-architecture) +3. [Tools & Technologies](#tools--technologies) +4. [File Structure](#file-structure) +5. [Deployment Workflows](#deployment-workflows) +6. [Security & Credentials](#security--credentials) +7. [Version Management](#version-management) +8. [Platform Details](#platform-details) +9. [Troubleshooting](#troubleshooting) + +--- + +## Overview + +This document describes the complete automated deployment system for flash_pos, a React Native mobile application deployed to both Apple App Store and Google Play Store. + +### What We Built + +A **fully automated CI/CD pipeline** featuring: +- ✅ One-command local deployments +- ✅ GitHub Actions for cloud-based releases +- ✅ Git tag-based automatic versioning +- ✅ Secure credential management +- ✅ iOS code signing automation (Fastlane Match) +- ✅ Cross-platform unified workflow + +### Key Achievements + +- **Zero-Touch Deployment**: Single command deploys to app stores +- **Version Automation**: Git tags automatically control app versions +- **Security**: All credentials encrypted and never in code +- **Team-Ready**: Certificate syncing via Match +- **Fully Documented**: Complete setup and usage guides + +--- + +## System Architecture + +### High-Level Flow + +``` +┌─────────────────────────────────────────────────────────┐ +│ Developer Action │ +│ (./deploy-ios.sh or git tag or GitHub UI) │ +└───────────────────────┬─────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────┐ +│ Fastlane Deployment Engine │ +│ • Validates git state │ +│ • Checks for version tags │ +│ • Increments build numbers │ +│ • Manages dependencies │ +└───────────────────────┬─────────────────────────────────┘ + │ + ┌───────────────┴───────────────┐ + ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ +│ iOS Build │ │ Android Build │ +│ │ │ │ +│ • CocoaPods │ │ • Gradle │ +│ • Match certs │ │ • Keystore │ +│ • Xcode build │ │ • AAB bundle │ +└────────┬────────┘ └────────┬────────┘ + │ │ + ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ +│ TestFlight │ │ Google Play │ +│ App Store │ │ Internal/Beta │ +└─────────────────┘ └─────────────────┘ +``` + +### Component Diagram + +``` +Repository +├── Source Code (React Native) +├── Fastlane Configuration +│ ├── Fastfile (deployment logic) +│ ├── Appfile (app identifiers) +│ └── Matchfile (iOS signing) +├── CI/CD Workflows +│ └── .github/workflows/ +│ ├── ios-deploy.yml +│ ├── android-deploy.yml +│ └── build-check.yml +├── Deployment Scripts +│ ├── deploy-ios.sh +│ └── deploy-android.sh +└── Documentation + ├── docs/ARCHITECTURE.md (this file) + ├── DEPLOYMENT_SETUP.md + └── DEPLOYMENT_QUICK_START.md +``` + +--- + +## Tools & Technologies + +### Core Technologies + +| Tool | Purpose | Version | Docs | +|------|---------|---------|------| +| **Fastlane** | Mobile deployment automation | 2.236.1 | [docs.fastlane.tools](https://docs.fastlane.tools) | +| **Fastlane Match** | iOS code signing management | Built-in | [match docs](https://docs.fastlane.tools/actions/match) | +| **GitHub Actions** | CI/CD platform | N/A | [github.com/actions](https://docs.github.com/en/actions) | +| **Ruby** | Fastlane runtime | 3.2+ | [ruby-lang.org](https://www.ruby-lang.org) | +| **Bundler** | Ruby dependency management | Latest | [bundler.io](https://bundler.io) | +| **Gradle** | Android build system | 8.x | [gradle.org](https://gradle.org) | +| **CocoaPods** | iOS dependency management | 1.13+ | [cocoapods.org](https://cocoapods.org) | + +### Tool Responsibilities + +#### 1. Fastlane (Core Automation) + +**What it does:** +- Orchestrates entire deployment process +- Builds iOS and Android apps +- Manages code signing +- Uploads to app stores +- Increments version numbers +- Creates git tags + +**Key files:** +- `fastlane/Fastfile` - Deployment lanes (workflows) +- `fastlane/Appfile` - App identifiers and team configuration +- `fastlane/Matchfile` - Code signing configuration + +**Custom Functions Created:** +```ruby +version_from_git_tag(platform) # Extract version from git tags +update_ios_version_from_tag() # Set iOS version from tag +update_android_version_from_tag() # Set Android version from tag +increment_android_version_code() # Increment Android build number +``` + +#### 2. Fastlane Match (iOS Code Signing) + +**What it does:** +- Stores iOS certificates in private Git repository +- Syncs certificates across team members and CI +- Automatically provisions code signing in builds + +**Configuration:** +- **Storage:** `github.com/lnflash/flash-pos-certificates` (private) +- **Encryption:** Passphrase-protected +- **Access:** Automatic via `MATCH_PASSWORD` secret + +**Workflow:** +``` +Developer runs: fastlane match appstore + ↓ +Creates/downloads certificates + ↓ +Stores in encrypted Git repo + ↓ +CI/CD pulls same certificates + ↓ +Everyone uses same signing identity +``` + +#### 3. GitHub Actions (CI/CD) + +**What it does:** +- Runs deployments in cloud +- Triggered by git tags or manual dispatch +- Manages secrets securely +- Provides build logs and artifacts + +**Workflows:** + +**iOS Deploy** (`.github/workflows/ios-deploy.yml`) +- Triggers: `ios/v*` tags or manual +- Runs on: macOS (Xcode required) +- Lanes: `beta` (TestFlight) or `release` (App Store) + +**Android Deploy** (`.github/workflows/android-deploy.yml`) +- Triggers: `android/v*` tags or manual +- Runs on: Ubuntu (faster, cheaper) +- Lanes: `beta` (Internal) or `release` (Production) + +**Build Check** (`.github/workflows/build-check.yml`) +- Triggers: Pull requests +- Validates: iOS/Android builds, linting +- Purpose: Pre-merge validation + +#### 4. Ruby & Bundler + +**What they do:** +- Ruby: Runtime for Fastlane (Ruby-based tool) +- Bundler: Manages Fastlane and plugin versions + +**Key files:** +- `Gemfile` - Ruby dependencies +- `Gemfile.lock` - Locked versions + +#### 5. Build Systems + +**Gradle** (Android) +- Builds Android App Bundles (AAB) +- Manages dependencies +- Signs release builds +- Configured via `android/app/build.gradle` + +**Xcode** (iOS via Fastlane) +- Builds iOS app archives +- Links CocoaPods dependencies +- Signs with Match certificates +- Configured via `ios/flash_pos.xcodeproj` + +--- + +## File Structure + +### Deployment Files + +``` +flash_pos/ +├── fastlane/ +│ ├── Fastfile # Main deployment logic +│ ├── Appfile # App identifiers and team info +│ ├── Matchfile # iOS code signing config +│ └── README.md # Auto-generated by Fastlane +│ +├── .github/workflows/ +│ ├── ios-deploy.yml # iOS CI/CD workflow +│ ├── android-deploy.yml # Android CI/CD workflow +│ └── build-check.yml # PR validation workflow +│ +├── deploy-ios.sh # Local iOS deployment script +├── deploy-android.sh # Local Android deployment script +│ +├── .env.fastlane # Local credentials (git-ignored) +├── .env.fastlane.example # Credential template +│ +├── docs/ +│ ├── ARCHITECTURE.md # This file +│ ├── WORKFLOWS.md # Detailed workflow documentation +│ └── CHANGELOG.md # System changes log +│ +├── DEPLOYMENT_SETUP.md # First-time setup guide +├── DEPLOYMENT_QUICK_START.md # Daily usage reference +│ +├── Gemfile # Ruby dependencies +└── Gemfile.lock # Locked Ruby versions +``` + +### Ignored Files (Security) + +``` +.gitignore includes: +├── .env.fastlane # Local credentials +├── google-play-key.json # Google Play service account +├── flash-pos-*.json # Google service accounts +├── *.keystore # Android signing keys +├── android/gradle.properties # Android signing config +└── fastlane/report.xml # Build reports +``` + +--- + +## Deployment Workflows + +### Fastlane Lanes + +#### iOS Lanes + +**`ios beta`** - Deploy to TestFlight +```ruby +lane :beta do + ensure_git_status_clean # Verify clean git state + update_ios_version_from_tag # Set version from git tag + increment_build_number # Auto-increment build + cocoapods # Install dependencies + build_app # Build IPA with Match certs + upload_to_testflight # Upload to TestFlight + commit_version_bump # Commit version changes + add_git_tag # Tag with version+build +end +``` + +**`ios release`** - Deploy to App Store +- Same as beta but uploads to App Store +- Does NOT auto-submit for review +- Creates version-only git tag + +**`ios setup_signing`** - Download Certificates +- Used by CI/CD before building +- Downloads Match certificates +- Readonly mode in CI + +#### Android Lanes + +**`android beta`** - Deploy to Internal Testing +```ruby +lane :beta do + ensure_git_status_clean # Verify clean git state + update_android_version_from_tag # Set version from git tag + increment_android_version_code # Auto-increment version code + gradle(task: "bundle") # Build AAB + upload_to_play_store(track: "internal") # Upload + git_commit # Commit version changes + add_git_tag # Tag with version+code +end +``` + +**`android release`** - Deploy to Production +- Same as beta but uploads to Production +- Uses 10% staged rollout +- Creates version-only git tag + +**`android promote_to_beta`** - Promote to Open Testing +- Promotes Internal Testing → Beta track +- No new build, just track change + +### Deployment Methods + +#### Method 1: Local Scripts (Recommended for Development) + +```bash +# iOS +./deploy-ios.sh # Deploy to TestFlight +./deploy-ios.sh release # Deploy to App Store + +# Android +./deploy-android.sh # Deploy to Internal Testing +./deploy-android.sh release # Deploy to Production +./deploy-android.sh promote_to_beta # Promote to Beta +``` + +**How it works:** +1. Script loads `.env.fastlane` +2. Exports environment variables +3. Runs `bundle exec fastlane ` + +**When to use:** +- Quick deployments +- Testing changes +- Local development + +#### Method 2: NPM Scripts + +```bash +npm run deploy:ios:beta +npm run deploy:ios:release +npm run deploy:android:beta +npm run deploy:android:release +``` + +**When to use:** +- Consistent with npm-based workflows +- Preference for npm over shell scripts + +#### Method 3: Git Tags (Automated via GitHub Actions) + +```bash +# iOS +git tag ios/v0.4.0 +git push origin ios/v0.4.0 + +# Android +git tag android/v0.4.0 +git push origin android/v0.4.0 + +# Both platforms +git tag v0.4.0 +git push origin v0.4.0 +``` + +**How it works:** +1. Tag push triggers GitHub Actions +2. Workflow detects platform from tag +3. Runs deployment automatically +4. Version set from tag automatically + +**When to use:** +- Production releases +- Version bumps +- Automated deployments + +#### Method 4: GitHub UI (Manual Trigger) + +1. Go to repository → Actions +2. Select workflow (iOS Deploy / Android Deploy) +3. Click "Run workflow" +4. Choose lane (beta / release) +5. Click "Run workflow" button + +**When to use:** +- Non-technical team members +- Manual control needed +- Troubleshooting + +--- + +## Security & Credentials + +### Credential Storage + +#### Local Development +**File:** `.env.fastlane` (git-ignored) + +**Contents:** +```bash +APPLE_ID=your@email.com +TEAM_ID=ABC123XYZ +FASTLANE_PASSWORD=your-apple-password +FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx +MATCH_PASSWORD=match-encryption-password +GOOGLE_PLAY_JSON_KEY_PATH=path/to/key.json +``` + +**Access:** Loaded by deployment scripts + +#### CI/CD (GitHub Actions) +**Storage:** GitHub Secrets (Settings → Secrets → Actions) + +**iOS Secrets (7):** +- `APPLE_ID` - Apple ID email +- `TEAM_ID` - Developer team ID +- `ITC_TEAM_ID` - iTunes Connect team ID +- `FASTLANE_PASSWORD` - Apple ID password +- `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD` - 2FA bypass +- `MATCH_PASSWORD` - Certificate encryption passphrase +- `MATCH_GIT_BASIC_AUTHORIZATION` - Base64 of username:token + +**Android Secrets (5):** +- `GOOGLE_PLAY_JSON_KEY` - Service account JSON content +- `ANDROID_KEYSTORE_BASE64` - Base64-encoded keystore +- `ANDROID_KEYSTORE_PASSWORD` - Keystore password +- `ANDROID_KEY_ALIAS` - Key alias in keystore +- `ANDROID_KEY_PASSWORD` - Key password + +**Access:** Injected as environment variables during workflow + +#### iOS Certificates (Fastlane Match) +**Storage:** `github.com/lnflash/flash-pos-certificates` (private repo) + +**Contents:** +- Distribution certificates +- Provisioning profiles +- Encrypted with passphrase + +**Access:** +- Local: `bundle exec fastlane match appstore` +- CI: Automatic via `setup_signing` lane + +### Security Best Practices + +✅ **DO:** +- Keep `.env.fastlane` git-ignored +- Rotate credentials periodically +- Use app-specific passwords (not main password) +- Restrict GitHub secret access +- Use minimum required permissions + +❌ **DON'T:** +- Commit credentials to git +- Share credentials in plain text +- Use same password everywhere +- Give admin access when not needed + +--- + +## Version Management + +### Git Tag-Based Versioning + +#### How It Works + +```ruby +def version_from_git_tag(platform) + # 1. Try platform-specific tag: ios/v1.2.3 + tag = sh("git describe --tags --match '#{platform}/v*'") + + # 2. If not found, try generic tag: v1.2.3 + if tag.empty? + tag = sh("git describe --tags --match 'v*'") + end + + # 3. Extract version number (handles both formats) + version = tag.match(/v?(\d+\.\d+\.\d+)/) + + # 4. Return version or nil + version ? version[1] : nil +end +``` + +#### Tag Format + +| Tag Format | iOS Version | Android Version | +|------------|-------------|-----------------| +| `v1.2.3` | 1.2.3 | 1.2.3 | +| `ios/v1.2.3` | 1.2.3 | (unchanged) | +| `android/v1.2.3` | (unchanged) | 1.2.3 | +| No tag | (unchanged) | (unchanged) | + +**Priority:** Platform-specific > Generic > Current + +#### Build Number Management + +**iOS:** +- **Version:** From git tag or manual (e.g., 0.3.3) +- **Build:** Auto-incremented (e.g., 11, 12, 13) +- **Format:** `0.3.3 (11)` + +**Android:** +- **versionName:** From git tag or manual (e.g., 0.3.1) +- **versionCode:** Auto-incremented (e.g., 13, 14, 15) +- **Format:** `0.3.1 (13)` + +#### Version Bump Workflow + +**Scenario 1: TestFlight/Internal Testing (No version change)** +```bash +./deploy-ios.sh # Build 11 → 0.3.3 (11) +./deploy-ios.sh # Build 12 → 0.3.3 (12) +./deploy-ios.sh # Build 13 → 0.3.3 (13) +``` + +**Scenario 2: Production Release (Version bump)** +```bash +git tag ios/v0.4.0 +./deploy-ios.sh release # Build 14 → 0.4.0 (14) +``` + +**Scenario 3: Different Versions Per Platform** +```bash +git tag ios/v0.4.0 +git tag android/v1.2.0 + +./deploy-ios.sh # iOS: 0.4.0 +./deploy-android.sh # Android: 1.2.0 +``` + +--- + +## Platform Details + +### iOS (Apple App Store) + +**Bundle Identifier:** `com.flash.pos` + +**Distribution:** +- **TestFlight:** Beta testing (via `ios beta` lane) + - Internal: Up to 100 testers, instant + - External: Unlimited testers, requires review +- **App Store:** Production (via `ios release` lane) + - Submitted for review + - Not auto-released (manual control) + +**Code Signing:** +- **Method:** Fastlane Match +- **Certificate:** Distribution certificate +- **Profile:** App Store provisioning profile +- **Storage:** Private Git repository +- **Team ID:** H7UAM79QQP + +**Build Process:** +1. CocoaPods install dependencies +2. Match downloads certificates +3. Xcode builds archive +4. Export IPA with App Store profile +5. Upload via App Store Connect API + +### Android (Google Play Store) + +**Package Name:** `com.flash_pos` + +**Distribution:** +- **Internal Testing:** Up to 100 testers (via `android beta` lane) +- **Open Testing (Beta):** Unlimited, opt-in +- **Production:** Public release (via `android release` lane) + - 10% staged rollout by default + +**Signing:** +- **Keystore:** `release.keystore` +- **Alias:** `flash-pos-release` +- **Format:** PKCS12 +- **Storage:** Base64 in GitHub Secrets + +**Build Process:** +1. Gradle resolves dependencies +2. React Native bundles JavaScript +3. Gradle builds AAB (Android App Bundle) +4. Signs with release keystore +5. Upload via Google Play API + +--- + +## Troubleshooting + +### Common Issues + +#### Git Repository Dirty +**Error:** "Git repository is dirty!" + +**Cause:** Uncommitted changes in working directory + +**Solution:** +```bash +git status # Check what changed +git add . # Stage all changes +git commit -m "msg" # Commit changes +``` + +#### iOS Certificate Issues +**Error:** "No signing certificate found" + +**Solution:** +```bash +# Re-run match +bundle exec fastlane match appstore --force + +# Verify secrets in GitHub +# Check MATCH_PASSWORD and MATCH_GIT_BASIC_AUTHORIZATION +``` + +#### Android Upload Failed +**Error:** "Google Play API error" + +**Solution:** +- Verify `GOOGLE_PLAY_JSON_KEY` is correct JSON +- Check service account has correct permissions +- Ensure first version uploaded manually + +#### Version Already Exists +**Error:** "Version already exists in store" + +**Solution:** +- Increment version: `git tag ios/v0.4.1` +- Or just increment build (auto-increments) + +### Debug Mode + +Enable verbose Fastlane output: +```bash +# Add to .env.fastlane +FASTLANE_VERBOSE=true + +# Or run directly +bundle exec fastlane ios beta --verbose +``` + +### Logs Location + +**Local:** +- `fastlane/report.xml` - Detailed report +- `~/Library/Logs/gym/` - iOS build logs + +**GitHub Actions:** +- Actions tab → Select workflow run → View logs + +--- + +## Maintenance + +### Regular Tasks + +**Weekly:** +- Check GitHub Actions workflows are passing +- Review app store feedback + +**Monthly:** +- Review credential expiration dates +- Update Fastlane: `bundle update fastlane` + +**Quarterly:** +- Rotate app-specific passwords +- Review and update documentation +- Check for iOS certificate expiration + +### Updating This Documentation + +When making changes to the deployment system: + +1. Update relevant sections in this file +2. Update version and "Last Updated" date at top +3. Document breaking changes in CHANGELOG.md +4. Update DEPLOYMENT_SETUP.md if setup changes +5. Commit with message: `docs: update deployment architecture` + +--- + +## Future Enhancements + +### Potential Improvements + +- [ ] Automated changelog generation from git commits +- [ ] Screenshot automation with Fastlane Snapshot +- [ ] App Store metadata management +- [ ] Slack/Discord notifications on deploy +- [ ] Automatic rollback on failed deploys +- [ ] Pre-deploy automated testing +- [ ] Multi-environment support (staging/production) + +### Version History + +| Version | Date | Changes | +|---------|------|---------| +| 1.0 | 2026-06-24 | Initial deployment system | + +--- + +**Questions or issues?** See [DEPLOYMENT_SETUP.md](../DEPLOYMENT_SETUP.md) for detailed setup instructions or [DEPLOYMENT_QUICK_START.md](../DEPLOYMENT_QUICK_START.md) for daily usage. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..84e01cb --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,27 @@ +# Deployment System Changelog + +All notable changes to the automated deployment system. + +## [1.0.0] - 2026-06-24 + +### Added +- Fastlane integration (iOS & Android) +- Fastlane Match for iOS code signing +- Git tag-based automatic versioning +- GitHub Actions workflows +- Local deployment scripts +- Complete documentation + +### Features +- ✅ iOS: TestFlight & App Store deployment +- ✅ Android: Google Play deployment +- ✅ Automated version management +- ✅ CI/CD ready + +### Known Issues +- Android: Requires 16KB page size support +- Android: Google Play declarations needed + +--- + +**Maintained by:** Development Team diff --git a/docs/README.md b/docs/README.md index 3683507..9e0234d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,101 +1,21 @@ -# Flash POS Documentation +# Deployment System Documentation -Welcome to the Flash POS documentation. This directory contains comprehensive documentation for the Flash Point of Sale application - a React Native Bitcoin/Lightning Network payment solution with NFC flashcard integration and advanced rewards system. +> **flash_pos** automated deployment documentation -## Documentation Structure +## 📚 Documentation Index -### Core Documentation -- **[01. Project Overview](./01-project-overview.md)** - High-level architecture and project description -- **[02. Development Setup](./02-development-setup.md)** - Environment setup and configuration -- **[03. Architecture](./03-architecture.md)** - Technical architecture and design patterns -- **[04. API Integration](./04-api-integration.md)** - GraphQL and external API integrations -- **[05. Screens & Navigation](./05-screens-navigation.md)** - User interface and navigation flow -- **[06. NFC Integration](./06-nfc-integration.md)** - NFC flashcard implementation -- **[07. Rewards System](./07-rewards-system.md)** - Comprehensive rewards documentation including Event Mode -- **[08. Printing System](./08-printing-system.md)** - Receipt printing capabilities -- **[09. State Management](./09-state-management.md)** - Redux store and data flow -- **[10. Testing](./10-testing.md)** - Testing approach and guidelines -- **[11. Deployment](./11-deployment.md)** - Build and deployment process -- **[12. Security](./12-security.md)** - Security features including PIN protection and fraud prevention +| Document | Description | +|----------|-------------| +| **[ARCHITECTURE.md](./ARCHITECTURE.md)** | Complete system architecture and technical details | +| **[CHANGELOG.md](./CHANGELOG.md)** | Version history and system changes | +| **[../DEPLOYMENT_SETUP.md](../DEPLOYMENT_SETUP.md)** | First-time setup guide | +| **[../DEPLOYMENT_QUICK_START.md](../DEPLOYMENT_QUICK_START.md)** | Daily usage reference | -### Configuration -- **[Environment Configuration](./environment-configuration.md)** - Complete `.env` setup guide with Event Mode +## 🚀 Quick Commands -## Quick Start +```bash +./deploy-ios.sh # iOS TestFlight +./deploy-android.sh # Android Internal Testing +``` -1. Copy the [Environment Configuration](./environment-configuration.md) template to create your `.env` file -2. Read the [Development Setup](./02-development-setup.md) guide -3. Review the [Project Overview](./01-project-overview.md) for context -4. Check the [Architecture](./03-architecture.md) for technical details -5. Follow screen-specific documentation for feature implementation - -## Key Features - -### Payment Processing -- ⚡ Bitcoin/Lightning Network payments -- 💵 External payment support (cash/card) -- 💰 Multi-currency with real-time conversion -- 📊 Transaction history tracking - -### Customer Engagement -- 📱 NFC flashcard integration -- 🎁 Dynamic rewards system -- 🎉 Event Mode for promotions -- 🔄 Customer loyalty tracking - -### Business Operations -- 🧾 Silent receipt printing -- 🔄 Receipt reprinting system -- 🔒 PIN-protected settings -- 📈 Real-time monitoring - -### Security Features -- 🔐 4-digit PIN protection -- 🛡️ Fraud prevention -- 💸 Budget controls -- 🔍 Transaction validation - -## Technology Stack - -- **Framework**: React Native 0.76.6 -- **Language**: TypeScript -- **State Management**: Redux Toolkit + Redux Persist -- **API**: Apollo Client GraphQL -- **Navigation**: React Navigation 7 -- **Styling**: Styled Components -- **NFC**: react-native-nfc-manager -- **Printing**: Custom native modules -- **Security**: SHA-256 hashing, local encryption - -## Recent Updates - -### Event Mode (Phase 1) -- Temporary promotional campaigns -- Custom reward rates and limits -- Real-time progress tracking -- Budget and customer controls -- PIN-protected configuration - -### Enhanced Security -- Consolidated security documentation -- Improved fraud prevention -- Transaction validation layers -- Comprehensive audit trails - -## Getting Help - -- Check the relevant documentation section first -- Review code comments and type definitions -- Look at existing implementations for patterns -- Examine test files for usage examples -- Consult the [Security](./12-security.md) guide for best practices - -## Contributing - -When adding new features: -1. Update relevant documentation -2. Add security considerations -3. Include testing guidelines -4. Follow existing patterns - -Last updated: January 2025 \ No newline at end of file +**Last Updated:** June 24, 2026 From 9f5da308af9cfa00a033ab198775ca282130d653 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 10:36:19 +0500 Subject: [PATCH 12/64] docs: simplify structure - keep only DEPLOYMENT.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename ARCHITECTURE.md → DEPLOYMENT.md - Remove README.md and CHANGELOG.md for simplicity - Single comprehensive doc easier to maintain --- android/app/build.gradle | 2 +- docs/CHANGELOG.md | 27 ------------------------- docs/{ARCHITECTURE.md => DEPLOYMENT.md} | 0 docs/README.md | 21 ------------------- 4 files changed, 1 insertion(+), 49 deletions(-) delete mode 100644 docs/CHANGELOG.md rename docs/{ARCHITECTURE.md => DEPLOYMENT.md} (100%) delete mode 100644 docs/README.md diff --git a/android/app/build.gradle b/android/app/build.gradle index 3e8f32a..68c0235 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 14 + versionCode 15 versionName "0.3.1" } signingConfigs { diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md deleted file mode 100644 index 84e01cb..0000000 --- a/docs/CHANGELOG.md +++ /dev/null @@ -1,27 +0,0 @@ -# Deployment System Changelog - -All notable changes to the automated deployment system. - -## [1.0.0] - 2026-06-24 - -### Added -- Fastlane integration (iOS & Android) -- Fastlane Match for iOS code signing -- Git tag-based automatic versioning -- GitHub Actions workflows -- Local deployment scripts -- Complete documentation - -### Features -- ✅ iOS: TestFlight & App Store deployment -- ✅ Android: Google Play deployment -- ✅ Automated version management -- ✅ CI/CD ready - -### Known Issues -- Android: Requires 16KB page size support -- Android: Google Play declarations needed - ---- - -**Maintained by:** Development Team diff --git a/docs/ARCHITECTURE.md b/docs/DEPLOYMENT.md similarity index 100% rename from docs/ARCHITECTURE.md rename to docs/DEPLOYMENT.md diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 9e0234d..0000000 --- a/docs/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Deployment System Documentation - -> **flash_pos** automated deployment documentation - -## 📚 Documentation Index - -| Document | Description | -|----------|-------------| -| **[ARCHITECTURE.md](./ARCHITECTURE.md)** | Complete system architecture and technical details | -| **[CHANGELOG.md](./CHANGELOG.md)** | Version history and system changes | -| **[../DEPLOYMENT_SETUP.md](../DEPLOYMENT_SETUP.md)** | First-time setup guide | -| **[../DEPLOYMENT_QUICK_START.md](../DEPLOYMENT_QUICK_START.md)** | Daily usage reference | - -## 🚀 Quick Commands - -```bash -./deploy-ios.sh # iOS TestFlight -./deploy-android.sh # Android Internal Testing -``` - -**Last Updated:** June 24, 2026 From 20d399afa4f109fe9452f093b4170b383522a767 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 14:02:38 +0500 Subject: [PATCH 13/64] Bump Android version code [skip ci] --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 68c0235..26ad966 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 15 + versionCode 16 versionName "0.3.1" } signingConfigs { From 14b95518e62bfe1740e3080495ddbf84d758b8a3 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 17:54:34 +0500 Subject: [PATCH 14/64] Add essential gradle properties for GitHub Actions Android build --- .github/workflows/android-deploy.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 84f7a39..7676216 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -64,6 +64,8 @@ jobs: KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} run: | cat > android/gradle.properties << EOF + android.useAndroidX=true + hermesEnabled=true MYAPP_UPLOAD_STORE_FILE=release.keystore MYAPP_UPLOAD_KEY_ALIAS=$KEY_ALIAS MYAPP_UPLOAD_STORE_PASSWORD=$KEYSTORE_PASSWORD From 7de21598d22e224210f2ecc6ad8d764f7aae704b Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 18:24:36 +0500 Subject: [PATCH 15/64] Fix: Update workflows to use Yarn instead of npm --- .github/workflows/android-deploy.yml | 4 ++-- .github/workflows/build-check.yml | 12 ++++++------ .github/workflows/ios-deploy.yml | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 7676216..1d1f855 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -36,7 +36,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: '18' - cache: 'npm' + cache: 'yarn' - name: Set up JDK 17 uses: actions/setup-java@v4 @@ -46,7 +46,7 @@ jobs: cache: 'gradle' - name: Install dependencies - run: npm ci + run: yarn install --frozen-lockfile - name: Setup Android SDK uses: android-actions/setup-android@v3 diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index fd37142..65e64ed 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -25,10 +25,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: '18' - cache: 'npm' + cache: 'yarn' - name: Install dependencies - run: npm ci + run: yarn install --frozen-lockfile - name: Install CocoaPods run: | @@ -67,7 +67,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: '18' - cache: 'npm' + cache: 'yarn' - name: Set up JDK 17 uses: actions/setup-java@v4 @@ -77,7 +77,7 @@ jobs: cache: 'gradle' - name: Install dependencies - run: npm ci + run: yarn install --frozen-lockfile - name: Setup Android SDK uses: android-actions/setup-android@v3 @@ -106,10 +106,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: '18' - cache: 'npm' + cache: 'yarn' - name: Install dependencies - run: npm ci + run: yarn install --frozen-lockfile - name: Run ESLint run: npm run lint diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 8fa6b0d..fd21f56 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -35,10 +35,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: '18' - cache: 'npm' + cache: 'yarn' - name: Install dependencies - run: npm ci + run: yarn install --frozen-lockfile - name: Install CocoaPods run: | From 2b5834444add862d361264718273d85b21ad48dc Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 18:33:26 +0500 Subject: [PATCH 16/64] Fix: Update Node.js version to 20 in workflows --- .github/workflows/android-deploy.yml | 2 +- .github/workflows/build-check.yml | 6 +++--- .github/workflows/ios-deploy.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 1d1f855..6ef25a9 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -35,7 +35,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' cache: 'yarn' - name: Set up JDK 17 diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 65e64ed..5ff4d90 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -24,7 +24,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' cache: 'yarn' - name: Install dependencies @@ -66,7 +66,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' cache: 'yarn' - name: Set up JDK 17 @@ -105,7 +105,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' cache: 'yarn' - name: Install dependencies diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index fd21f56..64509a3 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -34,7 +34,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' cache: 'yarn' - name: Install dependencies From e0fe3c447b8e7cbccffc74f7f42df9c29b6366cf Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 18:38:07 +0500 Subject: [PATCH 17/64] Fix: Skip git status check in CI environment --- fastlane/Fastfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1f34ac6..b0f7a86 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -73,8 +73,8 @@ end platform :ios do desc "Push a new beta build to TestFlight" lane :beta do - # Ensure we're on a clean git state - ensure_git_status_clean + # Ensure we're on a clean git state (skip in CI) + ensure_git_status_clean unless ENV['CI'] # Update version from git tag if present update_ios_version_from_tag @@ -186,8 +186,8 @@ end platform :android do desc "Deploy a new beta version to Google Play Internal Testing" lane :beta do - # Ensure we're on a clean git state - ensure_git_status_clean + # Ensure we're on a clean git state (skip in CI) + ensure_git_status_clean unless ENV['CI'] # Update version from git tag if present update_android_version_from_tag From adaf66b68beeded8f0bebfb10272435d23f6a420 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 18:47:35 +0500 Subject: [PATCH 18/64] Fix: Add Gradle JVM memory settings for CI builds --- .github/workflows/android-deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 6ef25a9..b78618a 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -64,6 +64,7 @@ jobs: KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} run: | cat > android/gradle.properties << EOF + org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=2g android.useAndroidX=true hermesEnabled=true MYAPP_UPLOAD_STORE_FILE=release.keystore From 25acd36366e8ba5be060759120a1e42b994313c8 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 18:58:15 +0500 Subject: [PATCH 19/64] Add .env file creation from GitHub Secrets for builds --- .github/workflows/android-deploy.yml | 10 ++++++++++ .github/workflows/ios-deploy.yml | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index b78618a..bf14e41 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -48,6 +48,16 @@ jobs: - name: Install dependencies run: yarn install --frozen-lockfile + - name: Create .env file + env: + FLASH_GRAPHQL_URI: ${{ secrets.FLASH_GRAPHQL_URI }} + FLASH_GRAPHQL_WS_URI: ${{ secrets.FLASH_GRAPHQL_WS_URI }} + run: | + cat > .env << EOF + FLASH_GRAPHQL_URI=$FLASH_GRAPHQL_URI + FLASH_GRAPHQL_WS_URI=$FLASH_GRAPHQL_WS_URI + EOF + - name: Setup Android SDK uses: android-actions/setup-android@v3 diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 64509a3..7ae0cc5 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -40,6 +40,16 @@ jobs: - name: Install dependencies run: yarn install --frozen-lockfile + - name: Create .env file + env: + FLASH_GRAPHQL_URI: ${{ secrets.FLASH_GRAPHQL_URI }} + FLASH_GRAPHQL_WS_URI: ${{ secrets.FLASH_GRAPHQL_WS_URI }} + run: | + cat > .env << EOF + FLASH_GRAPHQL_URI=$FLASH_GRAPHQL_URI + FLASH_GRAPHQL_WS_URI=$FLASH_GRAPHQL_WS_URI + EOF + - name: Install CocoaPods run: | cd ios From 1e4cdf5f4d7417b24b1d9b73c0d204f6e2dfa15d Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 19:34:38 +0500 Subject: [PATCH 20/64] Fix: Use DOT_ENV secret for .env file creation in CI workflows The previous heredoc approach had indented lines causing leading whitespace in variable names, and was missing required env variables. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 9 +-------- .github/workflows/ios-deploy.yml | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index bf14e41..cbbec64 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -49,14 +49,7 @@ jobs: run: yarn install --frozen-lockfile - name: Create .env file - env: - FLASH_GRAPHQL_URI: ${{ secrets.FLASH_GRAPHQL_URI }} - FLASH_GRAPHQL_WS_URI: ${{ secrets.FLASH_GRAPHQL_WS_URI }} - run: | - cat > .env << EOF - FLASH_GRAPHQL_URI=$FLASH_GRAPHQL_URI - FLASH_GRAPHQL_WS_URI=$FLASH_GRAPHQL_WS_URI - EOF + run: echo "${{ secrets.DOT_ENV }}" > .env - name: Setup Android SDK uses: android-actions/setup-android@v3 diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 7ae0cc5..9f1418b 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -41,14 +41,7 @@ jobs: run: yarn install --frozen-lockfile - name: Create .env file - env: - FLASH_GRAPHQL_URI: ${{ secrets.FLASH_GRAPHQL_URI }} - FLASH_GRAPHQL_WS_URI: ${{ secrets.FLASH_GRAPHQL_WS_URI }} - run: | - cat > .env << EOF - FLASH_GRAPHQL_URI=$FLASH_GRAPHQL_URI - FLASH_GRAPHQL_WS_URI=$FLASH_GRAPHQL_WS_URI - EOF + run: echo "${{ secrets.DOT_ENV }}" > .env - name: Install CocoaPods run: | From a19ff1a37fc2958df451c0db451c287839e075c9 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 19:47:13 +0500 Subject: [PATCH 21/64] Fix: Pass DOT_ENV secret via env var and add .env verification step Direct ${{ secrets }} interpolation in shell commands can mangle multiline values. Pass through env var instead and add a verification step to catch .env issues before the build starts. Also fix gradle.properties heredoc leading whitespace. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 16 ++++++++++++++-- .github/workflows/ios-deploy.yml | 13 ++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index cbbec64..caa9296 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -49,7 +49,18 @@ jobs: run: yarn install --frozen-lockfile - name: Create .env file - run: echo "${{ secrets.DOT_ENV }}" > .env + env: + DOT_ENV: ${{ secrets.DOT_ENV }} + run: printf '%s\n' "$DOT_ENV" > .env + + - name: Verify .env file + run: | + echo "=== .env file check ===" + echo "File exists: $(test -f .env && echo yes || echo no)" + echo "File size: $(wc -c < .env) bytes" + echo "Line count: $(wc -l < .env)" + echo "Variables found:" + grep -oP '^[A-Z_]+=' .env || echo "WARNING: No variables found in .env!" - name: Setup Android SDK uses: android-actions/setup-android@v3 @@ -66,7 +77,7 @@ jobs: KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} run: | - cat > android/gradle.properties << EOF + cat > android/gradle.properties < .env + env: + DOT_ENV: ${{ secrets.DOT_ENV }} + run: printf '%s\n' "$DOT_ENV" > .env + + - name: Verify .env file + run: | + echo "=== .env file check ===" + echo "File exists: $(test -f .env && echo yes || echo no)" + echo "File size: $(wc -c < .env) bytes" + echo "Line count: $(wc -l < .env)" + echo "Variables found:" + grep -oP '^[A-Z_]+=' .env || echo "WARNING: No variables found in .env!" - name: Install CocoaPods run: | From 74215c47d48e48709f07a4d014feec91f4cafe27 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 20:20:48 +0500 Subject: [PATCH 22/64] Fix: Add Kotlin daemon memory settings to prevent OOM in CI Disable parallel Gradle execution and configure Kotlin daemon with dedicated heap to prevent out-of-memory during native compilation. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index caa9296..76806cf 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -78,7 +78,9 @@ jobs: KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} run: | cat > android/gradle.properties < Date: Thu, 25 Jun 2026 20:35:53 +0500 Subject: [PATCH 23/64] Fix: Add newArchEnabled and reactNativeArchitectures to CI gradle.properties react-native-gesture-handler 2.27.1 requires new architecture codegen (ViewManagerWithGeneratedInterface). The project uses newArchEnabled=true locally but it was missing from the CI-generated gradle.properties. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 76806cf..44e3222 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -82,7 +82,9 @@ jobs: org.gradle.parallel=false kotlin.daemon.jvmargs=-Xmx2g android.useAndroidX=true + newArchEnabled=true hermesEnabled=true + reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 MYAPP_UPLOAD_STORE_FILE=release.keystore MYAPP_UPLOAD_KEY_ALIAS=$KEY_ALIAS MYAPP_UPLOAD_STORE_PASSWORD=$KEYSTORE_PASSWORD From d35c50169a16e1491c89feb031ac895a011cec39 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Thu, 25 Jun 2026 21:25:35 +0500 Subject: [PATCH 24/64] Fix: Pin react-native-gesture-handler to ~2.25.0 for RN 0.76.6 compat Version 2.26+ requires ViewManagerWithGeneratedInterface which is not available with React Native 0.76.6, causing Kotlin compilation failures. Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- yarn.lock | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a92f123..19f0cae 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "react": "18.3.1", "react-native": "0.76.6", "react-native-animatable": "^1.4.0", - "react-native-gesture-handler": "^2.26.0", + "react-native-gesture-handler": "~2.25.0", "react-native-html-to-pdf": "^0.12.0", "react-native-indicators": "^0.17.0", "react-native-keyboard-aware-scroll-view": "^0.9.5", diff --git a/yarn.lock b/yarn.lock index 1928e4b..54aa5c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1063,7 +1063,20 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3", "@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" + +"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== @@ -6823,10 +6836,10 @@ react-native-animatable@^1.4.0: dependencies: prop-types "^15.8.1" -react-native-gesture-handler@^2.26.0: - version "2.27.1" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.27.1.tgz#8865b2345f4c65536517f20cedc420481fc72d49" - integrity sha512-57TUWerhdz589OcDD21e/YlL923Ma4OIpyWsP0hy7gItBCPm5d7qIUW7Yo/cS2wo1qDdOhJaNlvlBD1lDou1fA== +react-native-gesture-handler@~2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.25.0.tgz#3a5a8912ea4f5e68ab211a9fa5a191c08ad50883" + integrity sha512-NPjJi6mislXxvjxQPU9IYwBjb1Uejp8GvAbE1Lhh+xMIMEvmgAvVIp5cz1P+xAbV6uYcRRArm278+tEInGOqWg== dependencies: "@egjs/hammerjs" "^2.0.17" hoist-non-react-statics "^3.3.0" From d4c408fca5c80985683da97e06f56f617b320fc8 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 11:30:37 +0500 Subject: [PATCH 25/64] Fix: Add git push for version bumps in CI and bump versionCode - Add git config and push step to both Android and iOS workflows so Fastlane's version code/build number commits persist after CI runs - Checkout main branch instead of detached HEAD from tag - Bump Android versionCode to 17 (CI will increment to 18) since 17 was already uploaded to Google Play Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 12 ++++++++++++ .github/workflows/ios-deploy.yml | 12 ++++++++++++ android/app/build.gradle | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 44e3222..f4222df 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -25,6 +25,13 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: main + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" - name: Set up Ruby uses: ruby/setup-ruby@v1 @@ -117,6 +124,11 @@ jobs: GOOGLE_PLAY_JSON_KEY_PATH: ${{ env.GOOGLE_PLAY_JSON_KEY_PATH }} run: bundle exec fastlane android promote_to_beta + - name: Push version bump + if: success() + run: | + git push origin main --follow-tags + - name: Upload build artifacts if: failure() uses: actions/upload-artifact@v4 diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 967bf4a..2f8dca6 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -24,6 +24,13 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: main + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" - name: Set up Ruby uses: ruby/setup-ruby@v1 @@ -107,6 +114,11 @@ jobs: MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} run: bundle exec fastlane ios release + - name: Push version bump + if: success() + run: | + git push origin main --follow-tags + - name: Upload build artifacts if: failure() uses: actions/upload-artifact@v4 diff --git a/android/app/build.gradle b/android/app/build.gradle index 26ad966..c18d913 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 16 + versionCode 17 versionName "0.3.1" } signingConfigs { From 291062a551f38923a3e7c032c0571c9cfc94d070 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 11:34:28 +0500 Subject: [PATCH 26/64] Fix: Use feat/automated-deployment branch for CI checkout and push Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 4 ++-- .github/workflows/ios-deploy.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index f4222df..5df9416 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: main + ref: feat/automated-deployment token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -127,7 +127,7 @@ jobs: - name: Push version bump if: success() run: | - git push origin main --follow-tags + git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts if: failure() diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 2f8dca6..58de4d2 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: main + ref: feat/automated-deployment token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -117,7 +117,7 @@ jobs: - name: Push version bump if: success() run: | - git push origin main --follow-tags + git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts if: failure() From a1a2f41a14087eb3f8572eb64f130d0cb15ca40d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 06:52:33 +0000 Subject: [PATCH 27/64] Bump Android version code [skip ci] --- android/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index c18d913..1c566fc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,8 +83,8 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 17 - versionName "0.3.1" + versionCode 18 + versionName "0.3.3" } signingConfigs { debug { From 7d746aebc6a81e485950e31afd37d5124ebd2fe2 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 12:31:07 +0500 Subject: [PATCH 28/64] Trigger deployment From 3ca3a3ce3566858f656dcb1b8427a569c7ccd9e5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 07:50:11 +0000 Subject: [PATCH 29/64] Bump Android version code [skip ci] --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 1c566fc..1000316 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 18 + versionCode 19 versionName "0.3.3" } signingConfigs { From 2ac8f27bba6b4f0a8fcec657d83207d8c268387b Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 14:30:16 +0500 Subject: [PATCH 30/64] update Podfile.lock --- ios/Podfile.lock | 112 +++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0fbf74e..70092fe 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1665,7 +1665,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNGestureHandler (2.27.1): + - RNGestureHandler (2.25.0): - DoubleConversion - glog - hermes-engine @@ -2047,71 +2047,71 @@ SPEC CHECKSUMS: RCTTypeSafety: 0f96bf6c99efc33eb43352212703854933f22930 React: 1d3d5bada479030961d513fb11e42659b30e97ff React-callinvoker: 682c610b9e9d3b93bd8d0075eacb2e6aa304d3e0 - React-Core: 9f33c0fc7776a5796d4dae09c363bd58e6a27efe - React-CoreModules: 91afb654834f0a1f48fb26dd1f4d1a1460c44def - React-cxxreact: c7491114266a70f8215306f1d0c4b54a811e77cf + React-Core: 10420b32e62acf6b3aa0a570e45566001175c777 + React-CoreModules: aad977a7dbff83aa707c4045e5db81446a511cca + React-cxxreact: 1bee1b97e7d537f1a33d9eb68c9426c1fc1a4e3c React-debug: 4ae2e95c2d392cca29939a3a2f2b4320ddff3e59 - React-defaultsnativemodule: 43d27f1844b4c18fc03fa4fa35ea2f1c48d64237 - React-domnativemodule: bca178dd0ce1532f75be783f6f2923f675a778ae - React-Fabric: d6bc0222335270eb76c28dd5036c03a010c04d51 - React-FabricComponents: 05eec9e2cf998be793daaee8fa8a8ea6d1187785 - React-FabricImage: 3a12374b0aedda71c7ef6bd64b59479b8bb3fe05 + React-defaultsnativemodule: b585565214178c5780b54e4d56815d65782eac81 + React-domnativemodule: 03fd1847e49505aa9024acbe4f0811e441dc89a2 + React-Fabric: fc0898bb601b03ed41ab0df3e7b1a4acd05a6cff + React-FabricComponents: 13e78253b210d112b3ffddca5b7323db7f254358 + React-FabricImage: a86ff938570a06c2a9fbf00ff0b00195f0bd4aba React-featureflags: 5670e0dcdc17ba2515963d117dacc13d5b69c431 - React-featureflagsnativemodule: bb13129d1427327b2eb8cc13d3879363a4cd8326 - React-graphics: 659968f797257c0071ddff28a2d094c8e5c5899c - React-hermes: 6eb81c6f72c25d9058b6030227d0fcc1f741a807 - React-idlecallbacksnativemodule: 551b7a89b46041c746640fe13eacf39c1b169709 - React-ImageManager: e3d0270c82bf39432da2aff2fcd60dd16b308689 - React-jserrorhandler: f60c9b68b4d4ac1449bddc2553610708e939ddee - React-jsi: 47528a2928f38fe15e3d06a96de886e1a779ffc7 - React-jsiexecutor: 88a141c4dc821e1b2aa7ecc7d6af7b186e8455a2 - React-jsinspector: c26cf4118ea7c1aae721d2cde5acf3b2cdceb814 - React-jsitracing: 810d0465c3455e352a71147c18332b1cba1d1410 - React-logger: d42a53754a7252cc7a851315f0da2e46b450ea92 - React-Mapbuffer: 89885d1518433a462fe64b68bf5e097997380090 - React-microtasksnativemodule: 36341e09dcd1df535503e6ed2ddf88f10da56d52 - react-native-html-to-pdf: 7a49e6c58ac5221bcc093027b195f4b214f27a9d - react-native-nfc-manager: 7057a9c593c369fa0829a0263530ff2922a7465a - react-native-print: 692e8782bc89872ea01738c6759631388e77358c - react-native-safe-area-context: bb9dd7ee24674663cc345a423409e4542eabd1a9 - react-native-webview: 67481c7bba1ac534c7d3c9bd3d69d2b8c3bcf137 + React-featureflagsnativemodule: 79dea40c60cdc0356aadc67a099bba0af8c34e4f + React-graphics: 04eed50a115e750e4644c1e955f32bec57f6a235 + React-hermes: add932964f5ef024c86352dcc0dc427e6309642e + React-idlecallbacksnativemodule: 3e8d5085a21eb2f70ac64ff9817f8f8a603518a9 + React-ImageManager: 3239badd14cc602baf836b5d7151ffa90393deae + React-jserrorhandler: 81ac36638e02c33a9df0bdbeec464d2e699ac8a9 + React-jsi: 690f3742db66cab8d5219bcfbc19fee112c6bb0c + React-jsiexecutor: a060f7e989da21e2478f652d7799e3b5ae5db262 + React-jsinspector: 0eb6ea6f6b1e42edeab4bcad092d37ef748e337a + React-jsitracing: 737a69a469e2bc821cf8ae11977bded522393719 + React-logger: 162c09cc432b02d4a0db31b1d98f6df5243a2679 + React-Mapbuffer: f760d2229640be48cb3c2d4832b5bbc3018123fc + React-microtasksnativemodule: 1364ae5354f51b3ecee8eb718b5b6d1686d2ff4d + react-native-html-to-pdf: 4c5c6e26819fe202971061594058877aa9b25265 + react-native-nfc-manager: f7156b2485f43a664c26f3c519408ef356b61042 + react-native-print: f704aef52d931bfce6d1d84351dbb5232d7ecb89 + react-native-safe-area-context: e62e5018aa79e6679071eab7206fb92053329c4c + react-native-webview: 2505a8acf452640e3074f638b5489816e4ba7024 React-nativeconfig: 539ff4de6ce3b694e8e751080568c281c84903ce - React-NativeModulesApple: 702246817c286d057e23fe4b1302019796e62521 - React-perflogger: f260e2de95f9dbd002035251559c13bf1f0643d4 - React-performancetimeline: 957075cead70fe9536a327eb4f842b3d8982f2ec + React-NativeModulesApple: 771cc40b086281b820fe455fedebbe4341fd0c90 + React-perflogger: 4e80a5b8d61dfb38024e7d5b8efaf9ce1037d31f + React-performancetimeline: 1dcacc31d81f790f43a2d434ec95b0f864582329 React-RCTActionSheet: ed5a845eae98fe455b9a1d71f057d626e2f3f1c5 - React-RCTAnimation: a49bd2c28c3f32b1d01ff1163603aee3d420ce42 - React-RCTAppDelegate: f7aa2f938a6673cfd2a76e76fea8c4b38a4a5bec - React-RCTBlob: 8ddf30f97222f4d8227f64428349fd8252292cb5 - React-RCTFabric: 51fb64f7ca7ca2fa334433ba6d4f12750a481cf1 - React-RCTImage: 077a25f3a9a6b79938a01c2cfae05ea5f07fc584 - React-RCTLinking: 0c8415c600942454d663c4c4dc0d3b00aa7ba5e5 - React-RCTNetwork: 42a3c6fb5318dcc9f8796f43de081799fb905021 - React-RCTSettings: 1028522e45192515bd8c5308752d3270ee95fd66 - React-RCTText: 29ef786d78f69ec5b571634ef2ddd6ec177c958a - React-RCTVibration: 97859ed50816369f4830f623dfac8dc9877f3c5c + React-RCTAnimation: 0cda303ef8ca5a2d0ee9e425f188cc9fc1d2e20f + React-RCTAppDelegate: 1edcdebdaebf5120bdaa9d54bc40789714be3719 + React-RCTBlob: dab83a3c22210e5c7a8267834c68e6cf94bc1ce2 + React-RCTFabric: 19ba31d6b913b8b4aa8b27e4d6f5dc8ebd93a438 + React-RCTImage: b9c3d2cff3b8214322022cdf8afb92ff978bb92e + React-RCTLinking: e58c4fa216f9ac87ed3d4a0cce03905df67adec0 + React-RCTNetwork: 9f206fa039e107f51ddfac133df79105643ea2bd + React-RCTSettings: c7663cfcb3531cd438b8f73e98cd2d982a4bbd72 + React-RCTText: cfee29316f1049f016cbd81328a89a8a07410bba + React-RCTVibration: 20f5efc1b05cd3f5f7ea03489dd3766c890fb493 React-rendererconsistency: ccd50d5ee6544b26cd11fff5ad1112c5058a0064 - React-rendererdebug: 2092a1207a0023ac30877f4f730b403bfaf5ccbe + React-rendererdebug: d8f43065459c2095f27a173121f03dcd1d1b08e5 React-rncore: bfe554cb773978e8b94898866964c9579cb0c70c - React-RuntimeApple: 80949ebe7e6a94296e0168a940832d2029b66982 - React-RuntimeCore: f04b5d1eb0534a4f4f46bc76a938a9360ad91024 + React-RuntimeApple: 89c319b1610d4ca8895642cf0eae1188bf864270 + React-RuntimeCore: 30399cbd2368f7e031692875275984fa42142601 React-runtimeexecutor: 26a9d14619ec1359470df391be9abb7c80a21b2b - React-RuntimeHermes: 91c2a67a99f316f11a08d3d9280ab4c9fae59b56 - React-runtimescheduler: 76bb85f5ba01e800b4970fbc84eeaf10756c50c4 + React-RuntimeHermes: c78f07b7a599c1c9a889189c02436600e72c8b27 + React-runtimescheduler: 9f6b0b85154ed8a17a899cd1bab258a26c8db2cd React-timing: c9c7c0fe2fdfc433ef208889b6191dfb45457d68 - React-utils: 1b14c41c3edf4d96db1247a78e0ad96e7ceea011 - ReactCodegen: 0a0eef9c8cd84c932ae1868832086c6441811e84 - ReactCommon: 3c1c8c6d777103c0e60e37c6c5f08e828e2a77c9 - RNCAsyncStorage: f27db574d8d0d56438ec4e9ba345872f2d0f29f4 - RNCClipboard: 5fdc5218e7aa17c955bfc6c58264b406034ec31b - RNCPicker: 3676a8a70c9602dab839b01bd7c245a0e55e54ac - RNGestureHandler: 90a94cd1ec2680cd5811725f9ba3ab840765c497 - RNScreens: df8f6e8b613126c58f6436f9853b81717ce11a80 - RNSVG: 5e9214607f60aca5f82bd5c86ad092be4c15a870 - RNVectorIcons: a24016b773380b1aa37fca501ec6b94a951890a0 + React-utils: e6697b03f21c7ac57b075d848cda7882662cabf7 + ReactCodegen: 484b223748d7489d7036db1cbf79896d297e33a7 + ReactCommon: 832cdd669aeecd430d9ca1975d15676b38d0b263 + RNCAsyncStorage: e261f5fef2092b11db2e9dfd0cf3620b1d88dca3 + RNCClipboard: c063069de0ee3c7fbe7e0fc2eb09a62c5b972193 + RNCPicker: a026a12f053e1c15ddc645f8634144031f1e7832 + RNGestureHandler: 84ced02c8a2bcf880c272fe9f022661f170b7a8c + RNScreens: 94142456c1ace0c4cf3a5f6466e87817a0229ab0 + RNSVG: 6a8141c00a6910cf065cec3f58443efed9d51d1e + RNVectorIcons: 07792a9538e8577c1263fcad187712e90d65d8fb SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: be6f55a028e86c83ae066f018e9b5d24ffc45436 PODFILE CHECKSUM: 528389498027cce3f8c222a2e3f73c1367659c79 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 From a8a68cc2d861edea549f0e732df2acf4f9add615 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 14:49:23 +0500 Subject: [PATCH 31/64] Fix: Create temporary keychain for iOS code signing in CI The CI runner has no UI to approve keychain access, so match needs a dedicated keychain with a known password to store certificates. Co-Authored-By: Claude Opus 4.6 --- fastlane/Fastfile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index b0f7a86..32d412c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -174,10 +174,23 @@ platform :ios do desc "Setup code signing using match" lane :setup_signing do + if is_ci + create_keychain( + name: "ci_keychain", + password: ENV["MATCH_PASSWORD"], + default_keychain: true, + unlock: true, + timeout: 3600, + lock_when_sleeps: false + ) + end + match( type: "appstore", app_identifier: "com.flash.pos", - readonly: is_ci + readonly: is_ci, + keychain_name: is_ci ? "ci_keychain" : nil, + keychain_password: is_ci ? ENV["MATCH_PASSWORD"] : nil ) end end From cdd4bd07469cec325a869e92261e089074b27558 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 14:56:02 +0500 Subject: [PATCH 32/64] Fix iOS code signing: override Xcode project settings for CI builds Co-Authored-By: Claude Opus 4.6 --- fastlane/Fastfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 32d412c..deb60f5 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -94,6 +94,7 @@ platform :ios do workspace: "ios/flash_pos.xcworkspace", scheme: "flash_pos", export_method: "app-store", + xcargs: "CODE_SIGN_STYLE=Manual PROVISIONING_PROFILE_SPECIFIER='match AppStore com.flash.pos' CODE_SIGN_IDENTITY='Apple Distribution'", export_options: { provisioningProfiles: { "com.flash.pos" => "match AppStore com.flash.pos" @@ -142,6 +143,7 @@ platform :ios do workspace: "ios/flash_pos.xcworkspace", scheme: "flash_pos", export_method: "app-store", + xcargs: "CODE_SIGN_STYLE=Manual PROVISIONING_PROFILE_SPECIFIER='match AppStore com.flash.pos' CODE_SIGN_IDENTITY='Apple Distribution'", export_options: { provisioningProfiles: { "com.flash.pos" => "match AppStore com.flash.pos" From 432a379af4d2aa3ea5942efd2e6878ae03d192cb Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 20:55:13 +0500 Subject: [PATCH 33/64] Switch iOS deployment to App Store Connect API Key authentication Co-Authored-By: Claude Opus 4.6 --- .github/workflows/ios-deploy.yml | 21 ++++++--------------- fastlane/Fastfile | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 58de4d2..0fbbc18 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -83,20 +83,14 @@ jobs: env: MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} - FASTLANE_USER: ${{ secrets.APPLE_ID }} - FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} - FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} run: bundle exec fastlane ios setup_signing - name: Deploy to TestFlight (Beta) if: github.event.inputs.lane == 'beta' || contains(github.ref, 'beta') env: - APPLE_ID: ${{ secrets.APPLE_ID }} - ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }} - TEAM_ID: ${{ secrets.TEAM_ID }} - FASTLANE_USER: ${{ secrets.APPLE_ID }} - FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} - FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }} + APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }} + APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }} MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} run: bundle exec fastlane ios beta @@ -104,12 +98,9 @@ jobs: - name: Deploy to App Store (Release) if: github.event.inputs.lane == 'release' || (!contains(github.ref, 'beta') && startsWith(github.ref, 'refs/tags/ios/v')) env: - APPLE_ID: ${{ secrets.APPLE_ID }} - ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }} - TEAM_ID: ${{ secrets.TEAM_ID }} - FASTLANE_USER: ${{ secrets.APPLE_ID }} - FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} - FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} + APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }} + APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }} + APP_STORE_CONNECT_API_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }} MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} run: bundle exec fastlane ios release diff --git a/fastlane/Fastfile b/fastlane/Fastfile index deb60f5..a4311f8 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -76,6 +76,14 @@ platform :ios do # Ensure we're on a clean git state (skip in CI) ensure_git_status_clean unless ENV['CI'] + # Setup App Store Connect API Key + api_key = app_store_connect_api_key( + key_id: ENV["APP_STORE_CONNECT_API_KEY_ID"], + issuer_id: ENV["APP_STORE_CONNECT_API_ISSUER_ID"], + key_content: ENV["APP_STORE_CONNECT_API_KEY_CONTENT"], + is_key_content_base64: true + ) + # Update version from git tag if present update_ios_version_from_tag @@ -104,6 +112,7 @@ platform :ios do # Upload to TestFlight upload_to_testflight( + api_key: api_key, skip_waiting_for_build_processing: true ) @@ -125,6 +134,14 @@ platform :ios do # Ensure we're on a clean git state ensure_git_status_clean + # Setup App Store Connect API Key + api_key = app_store_connect_api_key( + key_id: ENV["APP_STORE_CONNECT_API_KEY_ID"], + issuer_id: ENV["APP_STORE_CONNECT_API_ISSUER_ID"], + key_content: ENV["APP_STORE_CONNECT_API_KEY_CONTENT"], + is_key_content_base64: true + ) + # Update version from git tag if present update_ios_version_from_tag @@ -153,6 +170,7 @@ platform :ios do # Upload to App Store upload_to_app_store( + api_key: api_key, force: true, submit_for_review: false, automatic_release: false, From 2ce3f6f9b7be2d698d855eb8706288a65f40a65e Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 21:23:56 +0500 Subject: [PATCH 34/64] Update iOS CI runner to macos-15 for Xcode 26 / iOS 26 SDK Co-Authored-By: Claude Opus 4.6 --- .github/workflows/ios-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 0fbbc18..9e56080 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -17,7 +17,7 @@ on: jobs: deploy: - runs-on: macos-14 + runs-on: macos-15 steps: - name: Checkout repository From 7a36018e0780d7443205af2e93ca71cf95217deb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 16:39:54 +0000 Subject: [PATCH 35/64] Bump iOS build number [skip ci] --- ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- ios/flash_pos/Info.plist | 4 ++-- ios/flash_posTests/Info.plist | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 21d9000..3e50daa 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 11; + CURRENT_PROJECT_VERSION = 12; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -548,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 11; + CURRENT_PROJECT_VERSION = 12; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 768461c..b5561b8 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - $(MARKETING_VERSION) + 0.3.3 CFBundleSignature ???? CFBundleVersion - 11 + 12 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index ac7881d..cf61665 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.0 + 0.3.3 CFBundleSignature ???? CFBundleVersion - 11 + 12 From b67191bbf6e5e8eaf7f8d13a396c6883e7d49a01 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Fri, 26 Jun 2026 21:46:13 +0500 Subject: [PATCH 36/64] Clean up deployment workflows: remove debug steps, fix cache order Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 9 --------- .github/workflows/ios-deploy.yml | 19 +++++-------------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 5df9416..bb6dedc 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -60,15 +60,6 @@ jobs: DOT_ENV: ${{ secrets.DOT_ENV }} run: printf '%s\n' "$DOT_ENV" > .env - - name: Verify .env file - run: | - echo "=== .env file check ===" - echo "File exists: $(test -f .env && echo yes || echo no)" - echo "File size: $(wc -c < .env) bytes" - echo "Line count: $(wc -l < .env)" - echo "Variables found:" - grep -oP '^[A-Z_]+=' .env || echo "WARNING: No variables found in .env!" - - name: Setup Android SDK uses: android-actions/setup-android@v3 diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 9e56080..86abc6d 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -52,20 +52,6 @@ jobs: DOT_ENV: ${{ secrets.DOT_ENV }} run: printf '%s\n' "$DOT_ENV" > .env - - name: Verify .env file - run: | - echo "=== .env file check ===" - echo "File exists: $(test -f .env && echo yes || echo no)" - echo "File size: $(wc -c < .env) bytes" - echo "Line count: $(wc -l < .env)" - echo "Variables found:" - grep -oP '^[A-Z_]+=' .env || echo "WARNING: No variables found in .env!" - - - name: Install CocoaPods - run: | - cd ios - bundle exec pod install - - name: Cache CocoaPods uses: actions/cache@v4 with: @@ -74,6 +60,11 @@ jobs: restore-keys: | ${{ runner.os }}-pods- + - name: Install CocoaPods + run: | + cd ios + bundle exec pod install + - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1 with: From c057fb9bda2e3586e6cb41052711fa8b9cb68b2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 17:18:55 +0000 Subject: [PATCH 37/64] Bump Android version code [skip ci] --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 1000316..76f8fb3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 19 + versionCode 20 versionName "0.3.3" } signingConfigs { From 0c023621ead112790bfb9ef376bab7d46fecd01f Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Sun, 28 Jun 2026 19:07:07 +0500 Subject: [PATCH 38/64] Fix CI push: pull --rebase before pushing version bump Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 1 + .github/workflows/ios-deploy.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index bb6dedc..970eed5 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -118,6 +118,7 @@ jobs: - name: Push version bump if: success() run: | + git pull --rebase origin feat/automated-deployment git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 86abc6d..53ebcd8 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -99,6 +99,7 @@ jobs: - name: Push version bump if: success() run: | + git pull --rebase origin feat/automated-deployment git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts From 4aa7a069ea17684b816d825bb01fdb3365f9c020 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Sun, 28 Jun 2026 19:53:25 +0500 Subject: [PATCH 39/64] Fix CI: bump iOS build number to 13, add --autostash to git pull Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 2 +- .github/workflows/ios-deploy.yml | 2 +- ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 970eed5..7d1db34 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -118,7 +118,7 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase origin feat/automated-deployment + git pull --rebase --autostash origin feat/automated-deployment git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 53ebcd8..395d906 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -99,7 +99,7 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase origin feat/automated-deployment + git pull --rebase --autostash origin feat/automated-deployment git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 3e50daa..2218ea3 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -548,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; From df320b9c9209ead7d246092cb1740fdc91853386 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 28 Jun 2026 15:10:06 +0000 Subject: [PATCH 40/64] Bump iOS build number [skip ci] --- ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- ios/flash_pos/Info.plist | 2 +- ios/flash_posTests/Info.plist | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 2218ea3..9aab91b 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 14; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -548,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 13; + CURRENT_PROJECT_VERSION = 14; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index b5561b8..75fafbb 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 12 + 14 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index cf61665..e2a2763 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 12 + 14 From 8ea6652d13bbc687faab8b643568cad83ddb6254 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Mon, 29 Jun 2026 16:49:05 +0500 Subject: [PATCH 41/64] Bump Android versionCode to 21 to sync with Google Play Co-Authored-By: Claude Opus 4.6 --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 76f8fb3..4c8eb46 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 20 + versionCode 21 versionName "0.3.3" } signingConfigs { From ca29ec5c7a89b6ad039c3870c44001471f811024 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 12:05:02 +0000 Subject: [PATCH 42/64] Bump Android version code [skip ci] --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 4c8eb46..c31037d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -83,7 +83,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 21 + versionCode 22 versionName "0.3.3" } signingConfigs { From a832ef5eed299e1534ec26844a899ab657c7d731 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 12:08:57 +0000 Subject: [PATCH 43/64] Bump iOS build number [skip ci] --- ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- ios/flash_pos/Info.plist | 2 +- ios/flash_posTests/Info.plist | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 9aab91b..e25804d 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -516,7 +516,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 15; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -548,7 +548,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 14; + CURRENT_PROJECT_VERSION = 15; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 75fafbb..15a48c9 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 14 + 15 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index e2a2763..dda49d6 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 14 + 15 From b20e8b75f1d8754bfb2f0950dc2c3247ac687e44 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Mon, 29 Jun 2026 17:21:29 +0500 Subject: [PATCH 44/64] Update deployment workflows to use main branch Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 6 +++--- .github/workflows/ios-deploy.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 7d1db34..f61371e 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: feat/automated-deployment + ref: main token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -118,8 +118,8 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase --autostash origin feat/automated-deployment - git push origin feat/automated-deployment --follow-tags + git pull --rebase --autostash origin main + git push origin main --follow-tags - name: Upload build artifacts if: failure() diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 395d906..78fd50f 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: feat/automated-deployment + ref: main token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -99,8 +99,8 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase --autostash origin feat/automated-deployment - git push origin feat/automated-deployment --follow-tags + git pull --rebase --autostash origin main + git push origin main --follow-tags - name: Upload build artifacts if: failure() From 35f0d7b99482e9971f64a4fe445756bd5b64ee36 Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:12:38 +0500 Subject: [PATCH 45/64] Update fastlane/Fastfile Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- fastlane/Fastfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index a4311f8..46f60a0 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -188,7 +188,8 @@ platform :ios do # Add git tag add_git_tag( - tag: "ios/v#{get_version_number(xcodeproj: 'ios/flash_pos.xcodeproj')}" + tag: "ios/v#{get_version_number(xcodeproj: 'ios/flash_pos.xcodeproj')}", + force: true ) end From abd3d8ed80004d3721cc9958eabddcba9cc7c3d5 Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:12:51 +0500 Subject: [PATCH 46/64] Update fastlane/Fastfile Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- fastlane/Fastfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 46f60a0..94640bb 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -303,7 +303,8 @@ platform :android do # Add git tag add_git_tag( - tag: "android/v#{version_name}" + tag: "android/v#{version_name}", + force: true ) end From 2591fbdc77f4cfc44a30ab7a9e975f401bd4261b Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:13:01 +0500 Subject: [PATCH 47/64] Update fastlane/Fastfile Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 94640bb..7e9987c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -132,7 +132,7 @@ platform :ios do desc "Deploy a new version to the App Store" lane :release do # Ensure we're on a clean git state - ensure_git_status_clean + ensure_git_status_clean unless ENV['CI'] # Setup App Store Connect API Key api_key = app_store_connect_api_key( From 2ad2adb86d33ad88cdfce4fb5fca3ae1b6fb9c65 Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:13:58 +0500 Subject: [PATCH 48/64] Update fastlane/Fastfile Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- fastlane/Fastfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 7e9987c..20ece64 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -267,7 +267,7 @@ platform :android do desc "Deploy a new version to Google Play Production" lane :release do # Ensure we're on a clean git state - ensure_git_status_clean + ensure_git_status_clean unless ENV['CI'] # Update version from git tag if present update_android_version_from_tag From 3cb6227e70e871b143ceedc366bd6bdbad2930d0 Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:14:15 +0500 Subject: [PATCH 49/64] Update fastlane/Fastfile Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- fastlane/Fastfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 20ece64..d88bded 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -174,8 +174,8 @@ platform :ios do force: true, submit_for_review: false, automatic_release: false, - skip_metadata: false, - skip_screenshots: false, + skip_metadata: true, + skip_screenshots: true, precheck_include_in_app_purchases: false ) From 6f23890001370ab08deebb06c11d093d017c77b1 Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:16:01 +0500 Subject: [PATCH 50/64] Update fastlane/Fastfile Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- fastlane/Fastfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index d88bded..a269b17 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -287,9 +287,9 @@ platform :android do track: "production", aab: "android/app/build/outputs/bundle/release/app-release.aab", rollout: "0.1", # Start with 10% rollout - skip_upload_metadata: false, - skip_upload_images: false, - skip_upload_screenshots: false + skip_upload_metadata: true, + skip_upload_images: true, + skip_upload_screenshots: true ) # Commit version bump From 3274ba7d7001ed1b8627eed38de1c9f786adb419 Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:16:13 +0500 Subject: [PATCH 51/64] Update deploy-ios.sh Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- deploy-ios.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy-ios.sh b/deploy-ios.sh index 57174d7..1a2d8ad 100755 --- a/deploy-ios.sh +++ b/deploy-ios.sh @@ -2,7 +2,7 @@ # Load environment variables from .env.fastlane if [ -f .env.fastlane ]; then - export $(cat .env.fastlane | grep -v '^#' | xargs) + set -a; . ./.env.fastlane; set +a else echo "Error: .env.fastlane file not found!" echo "Please create it with your credentials." From 2fee0dcd1a2e95ebc17bdec603ff0f99d66d816d Mon Sep 17 00:00:00 2001 From: Nodirbek <57404324+Nodirbek75@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:16:23 +0500 Subject: [PATCH 52/64] Update deploy-android.sh Co-authored-by: Island Bitcoin <34528298+islandbitcoin@users.noreply.github.com> --- deploy-android.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy-android.sh b/deploy-android.sh index 682afa4..7fdf3aa 100755 --- a/deploy-android.sh +++ b/deploy-android.sh @@ -2,7 +2,7 @@ # Load environment variables from .env.fastlane if [ -f .env.fastlane ]; then - export $(cat .env.fastlane | grep -v '^#' | xargs) + set -a; . ./.env.fastlane; set +a else echo "Error: .env.fastlane file not found!" echo "Please create it with your credentials." From f559e54711ad46cd78ab3b00cac693385d45e948 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 11:18:12 +0500 Subject: [PATCH 53/64] Revert react-native-gesture-handler to ^2.26.0 Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4e72171..e569bfa 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "react": "18.3.1", "react-native": "0.77.1", "react-native-animatable": "^1.4.0", - "react-native-gesture-handler": "~2.25.0", + "react-native-gesture-handler": "^2.26.0", "react-native-html-to-pdf": "^0.12.0", "react-native-indicators": "^0.17.0", "react-native-keyboard-aware-scroll-view": "^0.9.5", From 1417476d01c2b3d33e81f401f7bd97581ecd286e Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 11:19:48 +0500 Subject: [PATCH 54/64] Temporarily switch workflows to feat/automated-deployment for testing Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 6 +++--- .github/workflows/ios-deploy.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index f61371e..7d1db34 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: main + ref: feat/automated-deployment token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -118,8 +118,8 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase --autostash origin main - git push origin main --follow-tags + git pull --rebase --autostash origin feat/automated-deployment + git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts if: failure() diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 78fd50f..395d906 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: main + ref: feat/automated-deployment token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -99,8 +99,8 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase --autostash origin main - git push origin main --follow-tags + git pull --rebase --autostash origin feat/automated-deployment + git push origin feat/automated-deployment --follow-tags - name: Upload build artifacts if: failure() From 287c85530961d3386852bebb4cbf35b5fc9d121f Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 11:26:32 +0500 Subject: [PATCH 55/64] Update Gemfile.lock for concurrent-ruby constraint Co-Authored-By: Claude Opus 4.6 --- Gemfile.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8191311..2dd0e1f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -91,7 +91,7 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) - concurrent-ruby (1.3.5) + concurrent-ruby (1.3.3) connection_pool (2.5.0) csv (3.3.5) declarative (0.0.20) @@ -313,6 +313,7 @@ PLATFORMS DEPENDENCIES activesupport (>= 6.1.7.5, != 7.1.0) cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + concurrent-ruby (< 1.3.4) fastlane xcodeproj (< 1.26.0) From d624ec67972ac07d346ab2ab907be17a22761821 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 11:32:02 +0500 Subject: [PATCH 56/64] Update yarn.lock for react-native-gesture-handler ^2.26.0 Co-Authored-By: Claude Opus 4.6 --- yarn.lock | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4435f55..428bd4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1268,20 +1268,16 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" - integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.0" - debug "^4.3.1" + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== @@ -2590,6 +2586,13 @@ dependencies: "@types/react" "^18" +"@types/react-test-renderer@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz#1d0af8f2e1b5931e245b8b5b234d1502b854dc10" + integrity sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ== + dependencies: + "@types/react" "*" + "@types/react@*": version "19.1.8" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.8.tgz#ff8395f2afb764597265ced15f8dddb0720ae1c3" @@ -7071,12 +7074,13 @@ react-native-animatable@^1.4.0: dependencies: prop-types "^15.8.1" -react-native-gesture-handler@~2.25.0: - version "2.25.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.25.0.tgz#3a5a8912ea4f5e68ab211a9fa5a191c08ad50883" - integrity sha512-NPjJi6mislXxvjxQPU9IYwBjb1Uejp8GvAbE1Lhh+xMIMEvmgAvVIp5cz1P+xAbV6uYcRRArm278+tEInGOqWg== +react-native-gesture-handler@^2.26.0: + version "2.32.0" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.32.0.tgz#59b8658a4e1586ce6fb0ca0053ac80f6acf7f882" + integrity sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA== dependencies: "@egjs/hammerjs" "^2.0.17" + "@types/react-test-renderer" "^19.1.0" hoist-non-react-statics "^3.3.0" invariant "^2.2.4" From a5536acc78e1eeb4151331b6c981952d6e965fa2 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 11:49:18 +0500 Subject: [PATCH 57/64] Pin react-native-gesture-handler to ~2.25.0 for Kotlin 2.0.21 compat ^2.26.0 resolves to 2.32.0 which fails to compile with Kotlin 2.0.21. ~2.25.0 keeps it at 2.25.x which builds successfully. Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- yarn.lock | 16 ++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index e569bfa..4e72171 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "react": "18.3.1", "react-native": "0.77.1", "react-native-animatable": "^1.4.0", - "react-native-gesture-handler": "^2.26.0", + "react-native-gesture-handler": "~2.25.0", "react-native-html-to-pdf": "^0.12.0", "react-native-indicators": "^0.17.0", "react-native-keyboard-aware-scroll-view": "^0.9.5", diff --git a/yarn.lock b/yarn.lock index 428bd4c..86bdbf5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2586,13 +2586,6 @@ dependencies: "@types/react" "^18" -"@types/react-test-renderer@^19.1.0": - version "19.1.0" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz#1d0af8f2e1b5931e245b8b5b234d1502b854dc10" - integrity sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ== - dependencies: - "@types/react" "*" - "@types/react@*": version "19.1.8" resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.8.tgz#ff8395f2afb764597265ced15f8dddb0720ae1c3" @@ -7074,13 +7067,12 @@ react-native-animatable@^1.4.0: dependencies: prop-types "^15.8.1" -react-native-gesture-handler@^2.26.0: - version "2.32.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.32.0.tgz#59b8658a4e1586ce6fb0ca0053ac80f6acf7f882" - integrity sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA== +react-native-gesture-handler@~2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.25.0.tgz#3a5a8912ea4f5e68ab211a9fa5a191c08ad50883" + integrity sha512-NPjJi6mislXxvjxQPU9IYwBjb1Uejp8GvAbE1Lhh+xMIMEvmgAvVIp5cz1P+xAbV6uYcRRArm278+tEInGOqWg== dependencies: "@egjs/hammerjs" "^2.0.17" - "@types/react-test-renderer" "^19.1.0" hoist-non-react-statics "^3.3.0" invariant "^2.2.4" From f2e07c0768f4ccc690c6b6f2091e47e6f776c6c0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 07:06:44 +0000 Subject: [PATCH 58/64] Bump iOS build number [skip ci] --- ios/flash_pos.xcodeproj/project.pbxproj | 8 ++++---- ios/flash_pos/Info.plist | 4 ++-- ios/flash_posTests/Info.plist | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index 46a86af..b4c5363 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -518,7 +518,7 @@ CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -529,7 +529,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.3; + MARKETING_VERSION = 1.0.4; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -551,7 +551,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; @@ -561,7 +561,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.3; + MARKETING_VERSION = 1.0.4; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 83d922c..5fc7f08 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.3.3 + 1.0.4 CFBundleSignature ???? CFBundleVersion - 15 + 2 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index dda49d6..f2e0682 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.3.3 + 1.0.4 CFBundleSignature ???? CFBundleVersion - 15 + 2 From d3d066c11794cefabb7b6a0548499057e3882014 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 07:10:40 +0000 Subject: [PATCH 59/64] Bump Android version code [skip ci] --- android/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index a931fba..e60e99c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -91,8 +91,8 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 22 - versionName "0.3.3" + versionCode 23 + versionName "1.0.4" } signingConfigs { debug { From 583d0b8ea5c2c1ee93966b60a7eab43c092e9d1a Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 17:21:13 +0500 Subject: [PATCH 60/64] Fix build-check workflow: update iOS simulator and Android gradle.properties - iOS: Use macos-15 runner and iPhone 16 simulator (iPhone 15 not available at iOS 18.2) - Android: Copy gradle.properties from example before build (hermesEnabled property needed) Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-check.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 5ff4d90..6fea28f 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -9,7 +9,7 @@ on: jobs: ios-build: name: iOS Build Check - runs-on: macos-14 + runs-on: macos-15 steps: - name: Checkout repository @@ -46,7 +46,7 @@ jobs: -scheme flash_pos \ -configuration Debug \ -sdk iphonesimulator \ - -destination 'platform=iOS Simulator,name=iPhone 15' \ + -destination 'platform=iOS Simulator,name=iPhone 16' \ build CODE_SIGNING_ALLOWED=NO android-build: @@ -82,6 +82,9 @@ jobs: - name: Setup Android SDK uses: android-actions/setup-android@v3 + - name: Create gradle.properties + run: cp android/gradle.properties.example android/gradle.properties + - name: Build Android app (Debug) run: | cd android From 62645ae99d1e059313b504d38f5de4870405ed32 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 12:41:20 +0000 Subject: [PATCH 61/64] Bump iOS build number [skip ci] --- ios/flash_pos.xcodeproj/project.pbxproj | 4 ++-- ios/flash_pos/Info.plist | 2 +- ios/flash_posTests/Info.plist | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/flash_pos.xcodeproj/project.pbxproj b/ios/flash_pos.xcodeproj/project.pbxproj index b4c5363..0c5cd8a 100644 --- a/ios/flash_pos.xcodeproj/project.pbxproj +++ b/ios/flash_pos.xcodeproj/project.pbxproj @@ -518,7 +518,7 @@ CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = H7UAM79QQP; ENABLE_BITCODE = NO; INFOPLIST_FILE = flash_pos/Info.plist; @@ -551,7 +551,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = flash_pos/flash_pos.entitlements; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = H7UAM79QQP; INFOPLIST_FILE = flash_pos/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Flash POS"; diff --git a/ios/flash_pos/Info.plist b/ios/flash_pos/Info.plist index 5fc7f08..27bee73 100644 --- a/ios/flash_pos/Info.plist +++ b/ios/flash_pos/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 2 + 3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/ios/flash_posTests/Info.plist b/ios/flash_posTests/Info.plist index f2e0682..ed22cc9 100644 --- a/ios/flash_posTests/Info.plist +++ b/ios/flash_posTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 2 + 3 From 3eedffe3703b981460a0fd94de58a6d15f0f8ee5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 30 Jun 2026 12:43:16 +0000 Subject: [PATCH 62/64] Bump Android version code [skip ci] --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e60e99c..a33a058 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -91,7 +91,7 @@ android { applicationId "com.flash_pos" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 23 + versionCode 24 versionName "1.0.4" } signingConfigs { From d44d51ecee8ba6ffdb7b15a1b6dabf8696930932 Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 17:48:51 +0500 Subject: [PATCH 63/64] Fix Android build check: generate debug keystore in CI The debug signing config references a local debug.keystore that doesn't exist on CI runners. Generate one before building. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build-check.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/build-check.yml b/.github/workflows/build-check.yml index 6fea28f..defbf8a 100644 --- a/.github/workflows/build-check.yml +++ b/.github/workflows/build-check.yml @@ -85,6 +85,15 @@ jobs: - name: Create gradle.properties run: cp android/gradle.properties.example android/gradle.properties + - name: Generate debug keystore + run: | + keytool -genkeypair -v \ + -keystore android/app/debug.keystore \ + -alias androiddebugkey \ + -keyalg RSA -keysize 2048 -validity 10000 \ + -storepass android -keypass android \ + -dname "CN=Android Debug,O=Android,C=US" + - name: Build Android app (Debug) run: | cd android From 10422ffe367c3f87acfff382430d6a07fdb34b6a Mon Sep 17 00:00:00 2001 From: nodirbek75 Date: Tue, 30 Jun 2026 18:18:10 +0500 Subject: [PATCH 64/64] Change workflow branch references from feat/automated-deployment to main Co-Authored-By: Claude Opus 4.6 --- .github/workflows/android-deploy.yml | 6 +++--- .github/workflows/ios-deploy.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android-deploy.yml b/.github/workflows/android-deploy.yml index 7d1db34..f61371e 100644 --- a/.github/workflows/android-deploy.yml +++ b/.github/workflows/android-deploy.yml @@ -25,7 +25,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: feat/automated-deployment + ref: main token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -118,8 +118,8 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase --autostash origin feat/automated-deployment - git push origin feat/automated-deployment --follow-tags + git pull --rebase --autostash origin main + git push origin main --follow-tags - name: Upload build artifacts if: failure() diff --git a/.github/workflows/ios-deploy.yml b/.github/workflows/ios-deploy.yml index 395d906..78fd50f 100644 --- a/.github/workflows/ios-deploy.yml +++ b/.github/workflows/ios-deploy.yml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - ref: feat/automated-deployment + ref: main token: ${{ secrets.GITHUB_TOKEN }} - name: Configure git @@ -99,8 +99,8 @@ jobs: - name: Push version bump if: success() run: | - git pull --rebase --autostash origin feat/automated-deployment - git push origin feat/automated-deployment --follow-tags + git pull --rebase --autostash origin main + git push origin main --follow-tags - name: Upload build artifacts if: failure()