Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
a585f0e
Add automated deployment setup for iOS and Android
Nodirbek75 Jun 24, 2026
6071748
Fix: Remove incorrect apple_id parameter from upload_to_testflight
Nodirbek75 Jun 24, 2026
6748270
Bump iOS build number to 9 [skip ci]
Nodirbek75 Jun 24, 2026
2b34dd1
Add deployment helper scripts and bump build to 10 [skip ci]
Nodirbek75 Jun 24, 2026
123c6b6
Fix commit_version_bump and bump iOS build to 11 [skip ci]
Nodirbek75 Jun 24, 2026
839777b
Add git tag-based automatic versioning
Nodirbek75 Jun 24, 2026
e330f74
Update .gitignore to ignore Google Play service account JSON files
Nodirbek75 Jun 24, 2026
4d921ff
Fix Android version code increment with custom helper function
Nodirbek75 Jun 24, 2026
65c8efc
Fix Android upload to skip APK and only upload AAB
Nodirbek75 Jun 25, 2026
72d008a
Bump Android version code to 14 [skip ci]
Nodirbek75 Jun 25, 2026
3597823
docs: add comprehensive deployment system documentation
Nodirbek75 Jun 25, 2026
9f5da30
docs: simplify structure - keep only DEPLOYMENT.md
Nodirbek75 Jun 25, 2026
20d399a
Bump Android version code [skip ci]
Nodirbek75 Jun 25, 2026
14b9551
Add essential gradle properties for GitHub Actions Android build
Nodirbek75 Jun 25, 2026
7de2159
Fix: Update workflows to use Yarn instead of npm
Nodirbek75 Jun 25, 2026
2b58344
Fix: Update Node.js version to 20 in workflows
Nodirbek75 Jun 25, 2026
e0fe3c4
Fix: Skip git status check in CI environment
Nodirbek75 Jun 25, 2026
adaf66b
Fix: Add Gradle JVM memory settings for CI builds
Nodirbek75 Jun 25, 2026
25acd36
Add .env file creation from GitHub Secrets for builds
Nodirbek75 Jun 25, 2026
1e4cdf5
Fix: Use DOT_ENV secret for .env file creation in CI workflows
Nodirbek75 Jun 25, 2026
a19ff1a
Fix: Pass DOT_ENV secret via env var and add .env verification step
Nodirbek75 Jun 25, 2026
74215c4
Fix: Add Kotlin daemon memory settings to prevent OOM in CI
Nodirbek75 Jun 25, 2026
587a376
Fix: Add newArchEnabled and reactNativeArchitectures to CI gradle.pro…
Nodirbek75 Jun 25, 2026
d35c501
Fix: Pin react-native-gesture-handler to ~2.25.0 for RN 0.76.6 compat
Nodirbek75 Jun 25, 2026
d4c408f
Fix: Add git push for version bumps in CI and bump versionCode
Nodirbek75 Jun 26, 2026
291062a
Fix: Use feat/automated-deployment branch for CI checkout and push
Nodirbek75 Jun 26, 2026
a1a2f41
Bump Android version code [skip ci]
github-actions[bot] Jun 26, 2026
7d746ae
Trigger deployment
Nodirbek75 Jun 26, 2026
3ca3a3c
Bump Android version code [skip ci]
github-actions[bot] Jun 26, 2026
2ac8f27
update Podfile.lock
Nodirbek75 Jun 26, 2026
80ea8ee
Merge remote-tracking branch 'refs/remotes/origin/feat/automated-depl…
Nodirbek75 Jun 26, 2026
a8a68cc
Fix: Create temporary keychain for iOS code signing in CI
Nodirbek75 Jun 26, 2026
cdd4bd0
Fix iOS code signing: override Xcode project settings for CI builds
Nodirbek75 Jun 26, 2026
432a379
Switch iOS deployment to App Store Connect API Key authentication
Nodirbek75 Jun 26, 2026
2ce3f6f
Update iOS CI runner to macos-15 for Xcode 26 / iOS 26 SDK
Nodirbek75 Jun 26, 2026
7a36018
Bump iOS build number [skip ci]
github-actions[bot] Jun 26, 2026
b67191b
Clean up deployment workflows: remove debug steps, fix cache order
Nodirbek75 Jun 26, 2026
c057fb9
Bump Android version code [skip ci]
github-actions[bot] Jun 26, 2026
0c02362
Fix CI push: pull --rebase before pushing version bump
Nodirbek75 Jun 28, 2026
4aa7a06
Fix CI: bump iOS build number to 13, add --autostash to git pull
Nodirbek75 Jun 28, 2026
df320b9
Bump iOS build number [skip ci]
github-actions[bot] Jun 28, 2026
8ea6652
Bump Android versionCode to 21 to sync with Google Play
Nodirbek75 Jun 29, 2026
ca29ec5
Bump Android version code [skip ci]
github-actions[bot] Jun 29, 2026
a832ef5
Bump iOS build number [skip ci]
github-actions[bot] Jun 29, 2026
b20e8b7
Update deployment workflows to use main branch
Nodirbek75 Jun 29, 2026
88c5341
Merge remote-tracking branch 'origin' into feat/automated-deployment
Nodirbek75 Jun 29, 2026
35f0d7b
Update fastlane/Fastfile
Nodirbek75 Jun 30, 2026
abd3d8e
Update fastlane/Fastfile
Nodirbek75 Jun 30, 2026
2591fbd
Update fastlane/Fastfile
Nodirbek75 Jun 30, 2026
2ad2adb
Update fastlane/Fastfile
Nodirbek75 Jun 30, 2026
3cb6227
Update fastlane/Fastfile
Nodirbek75 Jun 30, 2026
6f23890
Update fastlane/Fastfile
Nodirbek75 Jun 30, 2026
3274ba7
Update deploy-ios.sh
Nodirbek75 Jun 30, 2026
2fee0dc
Update deploy-android.sh
Nodirbek75 Jun 30, 2026
f559e54
Revert react-native-gesture-handler to ^2.26.0
Nodirbek75 Jun 30, 2026
1417476
Temporarily switch workflows to feat/automated-deployment for testing
Nodirbek75 Jun 30, 2026
287c855
Update Gemfile.lock for concurrent-ruby constraint
Nodirbek75 Jun 30, 2026
d624ec6
Update yarn.lock for react-native-gesture-handler ^2.26.0
Nodirbek75 Jun 30, 2026
a5536ac
Pin react-native-gesture-handler to ~2.25.0 for Kotlin 2.0.21 compat
Nodirbek75 Jun 30, 2026
f2e07c0
Bump iOS build number [skip ci]
github-actions[bot] Jun 30, 2026
d3d066c
Bump Android version code [skip ci]
github-actions[bot] Jun 30, 2026
583d0b8
Fix build-check workflow: update iOS simulator and Android gradle.pro…
Nodirbek75 Jun 30, 2026
62645ae
Bump iOS build number [skip ci]
github-actions[bot] Jun 30, 2026
3eedffe
Bump Android version code [skip ci]
github-actions[bot] Jun 30, 2026
d44d51e
Fix Android build check: generate debug keystore in CI
Nodirbek75 Jun 30, 2026
10422ff
Change workflow branch references from feat/automated-deployment to main
Nodirbek75 Jun 30, 2026
fd476a1
Merge branch 'main' into feat/automated-deployment
islandbitcoin Jul 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .env.fastlane.example
Original file line number Diff line number Diff line change
@@ -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
142 changes: 142 additions & 0 deletions .github/workflows/android-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
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
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
with:
ruby-version: '3.2'
bundler-cache: true

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Create .env file
env:
DOT_ENV: ${{ secrets.DOT_ENV }}
run: printf '%s\n' "$DOT_ENV" > .env

- 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
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError
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
MYAPP_UPLOAD_KEY_PASSWORD=$KEY_PASSWORD
EOF
sed -i 's/^[[:space:]]*//' android/gradle.properties

- 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: Push version bump
if: success()
run: |
git pull --rebase --autostash origin main
git push origin main --follow-tags

- 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."
127 changes: 127 additions & 0 deletions .github/workflows/build-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
name: Build Check

on:
pull_request:
branches: [ main ]
push:
branches: [ main ]

jobs:
ios-build:
name: iOS Build Check
runs-on: macos-15

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: '20'
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- 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 16' \
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: '20'
cache: 'yarn'

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Setup Android SDK
uses: android-actions/setup-android@v3

- 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
./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: '20'
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Run ESLint
run: npm run lint
Loading
Loading