Skip to content

Build & Release APK #118

Build & Release APK

Build & Release APK #118

Workflow file for this run

name: Build & Release APK
on:
push:
tags:
- 'v*'
branches:
- main
workflow_dispatch:
inputs:
ref:
description: 'Branch o commit da buildare'
required: false
default: 'main'
version_override:
description: 'Tag release (es. v2.6.2). Vuoto = legge app.json'
required: false
default: ''
permissions:
contents: write
env:
# Force Node 24 for any JS-based actions still declaring Node 20 in their action.yml.
# Node 20 is being removed from runners on 2026-09-16.
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
jobs:
build:
runs-on: ubuntu-latest
env:
RELEASE_STORE_FILE: ${{ github.workspace }}/android/app/release.keystore
RELEASE_STORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
RELEASE_KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
RELEASE_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
steps:
- name: Compute checkout ref
id: co
run: |
if [[ -n "${{ github.event.inputs.ref }}" ]]; then
echo "ref=${{ github.event.inputs.ref }}" >> "$GITHUB_OUTPUT"
elif [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "ref=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
else
echo "ref=main" >> "$GITHUB_OUTPUT"
fi
- name: Checkout
uses: actions/checkout@v5
with:
ref: ${{ steps.co.outputs.ref }}
- name: Setup Node
uses: actions/setup-node@v5
with:
node-version: 22
cache: npm
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 21
- name: Cache Gradle
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('android/**/*.gradle*', 'android/gradle.properties') }}
restore-keys: gradle-
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Install SDK components
run: |
echo "y" | sdkmanager \
"ndk;27.1.12297006" \
"build-tools;37.0.0" \
"platforms;android-37.0" \
"cmake;3.22.1"
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Fix expo-modules-core Gradle bugs
run: |
FILE="node_modules/expo-modules-core/android/build.gradle"
sed -i "s|apply plugin: 'com.android.library'|// Fix: project-level re-declaration\ndef _coreFeatures = project.findProperty(\"coreFeatures\") ?: []\next.shouldIncludeCompose = _coreFeatures.contains(\"compose\")\n\napply plugin: 'com.android.library'|" "$FILE"
sed -i 's/^\s*compose shouldIncludeCompose\s*$/ compose = shouldIncludeCompose/' "$FILE"
- name: Compute release tag
id: meta
run: |
VERSION=$(node -p "require('./app.json').expo.version")
if [[ -n "${{ github.event.inputs.version_override }}" ]]; then
TAG="${{ github.event.inputs.version_override }}"
elif [[ "${{ github.ref }}" == refs/tags/* ]]; then
TAG="${{ github.ref_name }}"
else
TAG="v${VERSION}"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
- name: Make gradlew executable
run: chmod +x android/gradlew
- name: Restore release keystore
run: |
if [[ -z "${{ secrets.KEYSTORE_BASE64 }}" ]]; then
echo "Missing KEYSTORE_BASE64 secret"
exit 1
fi
for var in RELEASE_STORE_PASSWORD RELEASE_KEY_ALIAS RELEASE_KEY_PASSWORD; do
if [[ -z "${!var}" ]]; then
echo "Missing $var secret"
exit 1
fi
done
mkdir -p android/app
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > "$RELEASE_STORE_FILE"
- name: Build release APK
run: |
cd android
./gradlew :app:assembleRelease \
--no-daemon \
-Pandroid.overridePathCheck=true
env:
ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }}
GRADLE_OPTS: "-Xmx4g -XX:MaxMetaspaceSize=512m"
- name: Rename APK
run: |
APK=$(find android/app/build/outputs/apk/release -name "*.apk" -type f | head -1)
DEST="AeroStaffPro-${{ steps.meta.outputs.tag }}.apk"
cp "$APK" "$DEST"
echo "apk=$DEST" >> "$GITHUB_ENV"
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.meta.outputs.tag }}
name: "AeroStaff Pro ${{ steps.meta.outputs.tag }}"
generate_release_notes: true
files: ${{ env.apk }}
draft: false
prerelease: false