name: Build and Release APK on: push: branches: [main] workflow_dispatch: env: ANDROID_HOME: ${{ runner.tool_cache }}/android-sdk ANDROID_SDK_ROOT: ${{ runner.tool_cache }}/android-sdk permissions: contents: write jobs: build: runs-on: ubuntu-latest outputs: apk-path: ${{ steps.upload-apk.outputs.path }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Node uses: actions/setup-node@v4 with: node-version: 22 - name: Set up JDK uses: actions/setup-java@v4 with: distribution: temurin java-version: 17 - name: Install Android SDK run: | if [ -x "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" ]; then echo "Android SDK already present in cache" else rm -rf "$ANDROID_HOME/cmdline-tools" mkdir -p "$ANDROID_HOME/cmdline-tools" wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/cmdtools.zip unzip -q /tmp/cmdtools.zip -d "$ANDROID_HOME/cmdline-tools" mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/latest" fi # Accept all licenses by writing known license hashes mkdir -p "$ANDROID_HOME/licenses" echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_HOME/licenses/android-sdk-license" echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" >> "$ANDROID_HOME/licenses/android-sdk-license" "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" \ "platform-tools" \ "platforms;android-36" \ "build-tools;36.0.0" \ "ndk;27.1.12297006" mkdir -p carry-your-live/android/app echo "sdk.dir=$ANDROID_HOME" > carry-your-live/android/app/local.properties - name: Install JS dependencies working-directory: carry-your-live run: | for i in {1..3}; do npm ci && break || sleep 10 done - name: Generate debug keystore (signs the release APK) run: | mkdir -p carry-your-live/android/app rm -f carry-your-live/android/app/debug.keystore keytool -genkeypair -v \ -keystore carry-your-live/android/app/debug.keystore \ -alias androiddebugkey -storepass android -keypass android \ -keyalg RSA -keysize 2048 -validity 10000 \ -dname "CN=Android Debug,O=Android,C=US" - name: Build release APK run: | cd carry-your-live/android ./gradlew assembleRelease - name: Upload APK id: upload-apk uses: actions/upload-artifact@v4 with: name: carry-your-live-release path: carry-your-live/android/app/build/outputs/release/app-release.apk release: needs: build runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download APK artifact uses: actions/download-artifact@v4 with: name: carry-your-live-release path: . - name: Compute next version id: version run: | latest=$(git tag --list 'v[0-9]*' --sort=-v:refname | head -n 1) if [ -z "$latest" ]; then next="v1.0.0" else latest=${latest#v} IFS='.' read -r major minor patch <<< "$latest" next="v${major}.${minor}.$((patch + 1))" fi echo "next=${next}" >> "$GITHUB_OUTPUT" - name: Build changelog id: changelog run: | prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "") if [ -z "$prev_tag" ]; then log=$(git log --oneline --no-merges main | head -n 40) else log=$(git log --oneline --no-merges "$prev_tag"..main | head -n 40) fi { echo "body<> "$GITHUB_OUTPUT" - name: Create release uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.version.outputs.next }} name: ${{ steps.version.outputs.next }} body: ${{ steps.changelog.outputs.body }} files: ./app-release.apk generate_release_notes: false