Skip to content

Android Release

Android Release #12

name: Android Release
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Free up disk space
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force
df -h
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "yarn"
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "17"
cache: "gradle"
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Download model assets
run: node -e "require('./scripts/download-models.js').ensureModelAssets()"
- name: Clean up after model download
run: |
rm -rf ~/.npm
yarn cache clean
df -h
- name: Create .env file
run: |
cat > .env << EOF
EXPO_PUBLIC_DETOUR_API_KEY=${{ secrets.EXPO_PUBLIC_DETOUR_API_KEY }}
EXPO_PUBLIC_DETOUR_APP_ID=${{ secrets.EXPO_PUBLIC_DETOUR_APP_ID }}
EOF
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Decode keystore
run: |
# Decode keystore from base64 (secret is accessed directly, never echoed)
echo '${{ secrets.ANDROID_KEYSTORE_BASE64 }}' | base64 --decode > android/app/release.keystore
if [ -f android/app/release.keystore ]; then
echo "✓ Keystore decoded successfully"
# Verify keystore is valid
keytool -list -keystore android/app/release.keystore -storepass '${{ secrets.ANDROID_KEYSTORE_PASSWORD }}' > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✓ Keystore is valid"
else
echo "✗ Keystore is invalid or password is incorrect"
exit 1
fi
else
echo "✗ Failed to decode keystore"
exit 1
fi
- name: Create local.properties
env:
KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: |
cat > android/local.properties <<'EOF'
MYAPP_UPLOAD_STORE_FILE=release.keystore
EOF
echo "MYAPP_UPLOAD_STORE_PASSWORD=${KEYSTORE_PASSWORD}" >> android/local.properties
echo "MYAPP_UPLOAD_KEY_ALIAS=${KEY_ALIAS}" >> android/local.properties
echo "MYAPP_UPLOAD_KEY_PASSWORD=${KEY_PASSWORD}" >> android/local.properties
echo "✓ local.properties created"
echo "Key alias: ${KEY_ALIAS}"
echo "Keystore path check:"
ls -lh android/app/release.keystore
echo "Property count: $(cat android/local.properties | wc -l) lines"
- name: Make build script executable
run: chmod +x ./scripts/build-release.sh
- name: Verify signing before build
run: |
echo "Verifying keystore passwords..."
# Test keystore password
keytool -list -keystore android/app/release.keystore \
-storepass '${{ secrets.ANDROID_KEYSTORE_PASSWORD }}' > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "✗ Keystore password is incorrect"
exit 1
fi
echo "✓ Keystore password verified"
# Test key alias and key password separately
keytool -list -keystore android/app/release.keystore \
-storepass '${{ secrets.ANDROID_KEYSTORE_PASSWORD }}' \
-alias '${{ secrets.ANDROID_KEY_ALIAS }}' > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "✗ Key alias not found in keystore"
keytool -list -keystore android/app/release.keystore \
-storepass '${{ secrets.ANDROID_KEYSTORE_PASSWORD }}'
exit 1
fi
echo "✓ Key alias verified"
# Test actual key password by trying to export certificate
echo "Testing key password by attempting certificate export..."
keytool -exportcert -keystore android/app/release.keystore \
-alias '${{ secrets.ANDROID_KEY_ALIAS }}' \
-storepass '${{ secrets.ANDROID_KEYSTORE_PASSWORD }}' \
-keypass '${{ secrets.ANDROID_KEY_PASSWORD }}' \
-file /tmp/test.crt 2>&1
EXPORT_RESULT=$?
if [ $EXPORT_RESULT -eq 0 ]; then
echo "✓ Key password verified"
rm -f /tmp/test.crt
else
echo "✗ Key password is incorrect or there's an issue accessing the private key"
echo "Attempting to show detailed error..."
keytool -exportcert -keystore android/app/release.keystore \
-alias '${{ secrets.ANDROID_KEY_ALIAS }}' \
-storepass '${{ secrets.ANDROID_KEYSTORE_PASSWORD }}' \
-keypass '${{ secrets.ANDROID_KEY_PASSWORD }}' \
-file /tmp/test.crt
exit 1
fi
- name: Build Android App Bundle
run: ./scripts/build-release.sh
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: app-release-${{ github.run_number }}.aab
path: android/app/build/outputs/bundle/release/app-release.aab
retention-days: 30
- name: Clean up keystore
if: always()
run: rm -f android/app/release.keystore