name: Android Release on: push: branches: - master jobs: release: runs-on: ubuntu-latest steps: # ------------------- Checkout ------------------- - name: Checkout uses: https://git.daemonlord.ru/actions/checkout@v4 with: fetch-depth: 0 tags: true # ------------------- Setup JDK ------------------- - name: Set up JDK 17 uses: https://git.daemonlord.ru/actions/setup-java@v4 with: distribution: temurin java-version: 17 # ------------------- Install Node.js ------------------- - name: Install Node.js run: | curl -fsSL https://deb.nodesource.com/setup_22.x | bash - apt-get install -y nodejs # ------------------- Extract version ------------------- - name: Extract versionName id: extract_version run: | VERSION=$(grep -oP 'versionName\s+"[^"]+"' app/build.gradle | head -n1 | cut -d'"' -f2 | tr -d '\r\n') echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Detected version: $VERSION" # ------------------- Stop if already released ------------------- - name: Stop if version already released id: stop run: | VERSION=${{ steps.extract_version.outputs.version }} if git show-ref --tags --quiet --verify "refs/tags/$VERSION"; then echo "Version $VERSION already released, stopping job." echo "CONTINUE=false" >> $GITHUB_ENV else echo "Version $VERSION not released yet, continuing workflow..." echo "CONTINUE=true" >> $GITHUB_ENV fi # ------------------- Decode keystore ------------------- - name: Decode keystore if: env.CONTINUE == 'true' run: | echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > app/release.keystore - name: Make Gradlew executable if: env.CONTINUE == 'true' run: chmod +x ./gradlew # ------------------- Set up Android SDK ------------------- - name: Set up Android SDK if: env.CONTINUE == 'true' uses: https://git.daemonlord.ru/actions/setup-android@v3 # ------------------- Build Release APK ------------------- - name: Build Release APK if: env.CONTINUE == 'true' env: KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} run: ./gradlew --no-daemon assembleRelease # ------------------- Git tag ------------------- - name: Create git tag if: env.CONTINUE == 'true' run: | git tag $VERSION git push origin $VERSION # ------------------- Gitea release ------------------- - name: Create Gitea Release if: env.CONTINUE == 'true' uses: https://git.daemonlord.ru/actions/gitea-release-action@v1 with: server_url: https://git.daemonlord.ru repository: ${{ gitea.repository }} token: ${{ secrets.API_TOKEN }} tag_name: ${{ steps.extract_version.outputs.version }} name: Release ${{ steps.extract_version.outputs.version }} body: | Android release ${{ steps.extract_version.outputs.version }} files: | app/build/outputs/apk/release/*.apk # ------------------- Prepare F-Droid Repo ------------------- - name: Prepare F-Droid Repo if: env.CONTINUE == 'true' run: | LICENSE="MIT" mkdir -p fdroid-repo/repo fdroid-repo/metadata fdroid-repo/icons echo "${{ secrets.FDROID_KEYSTORE_BASE64 }}" | base64 -d > fdroid-repo/keystore.jks for apk in app/build/outputs/apk/release/*.apk; do APPID=$(grep 'applicationId' app/build.gradle | awk -F '"' '{print $2}') VERSION=${{ steps.extract_version.outputs.version }} NEW_NAME="${APPID}_${VERSION}.apk" cp "$apk" "fdroid-repo/repo/$NEW_NAME" done cp assets/icon.png fdroid-repo/icons/icon.png cp assets/app_icon.png fdroid-repo/icons/app_icon.png APPID=$(grep 'applicationId' app/build.gradle | awk -F '"' '{print $2}') VERSION_CODE=$(echo $VERSION | awk -F. '{ printf("%d%02d%02d", $1,$2,$3 ? $3 : 0); }') for apk in fdroid-repo/repo/*.apk; do FILENAME=$(basename "$apk") SHA256=$(sha256sum "$apk" | awk '{print $1}') SOURCECODE="https://git.daemonlord.ru/${{ gitea.repository }}" printf '%s\n' \ "Id: $APPID" \ "License: $LICENSE" \ "SourceCode: $SOURCECODE" \ "Icon: icons/app_icon.png" \ "Apk:" \ " - versionCode: $VERSION_CODE" \ " versionName: \"$VERSION\"" \ " path: \"$FILENAME\"" \ " originalFileName: \"$FILENAME\"" \ " hashes:" \ " sha256: \"$SHA256\"" \ > "fdroid-repo/metadata/$APPID.yml" done # ------------------- Generate F-Droid config.yml ------------------- - name: Generate F-Droid config.yml if: env.CONTINUE == 'true' run: | REPO_URL="https://fdroid.daemonlord.ru/" REPO_NAME="Anabasis F-Droid Repo" REPO_DESC="Automatically generated F-Droid repository" GPG_KEY_ALIAS="${{ secrets.FDROID_GPG_KEY_ALIAS }}" GPG_KEYSTORE_PATH="fdroid-repo/keystore.jks" GPG_KEY_PASSWORD="${{ secrets.FDROID_KEY_PASSWORD }}" printf "repo_url: %s\nrepo_name: %s\nrepo_description: %s\nrepo_keyalias: %s\nkeystore: %s\nkeypass: %s\n" \ "$REPO_URL" \ "$REPO_NAME" \ "$REPO_DESC" \ "$GPG_KEY_ALIAS" \ "$GPG_KEYSTORE_PATH" \ "$GPG_KEY_PASSWORD" \ > fdroid-repo/config.yml # ------------------- Generate F-Droid Index ------------------- - name: Generate F-Droid Index if: env.CONTINUE == 'true' run: | docker run --rm -v $PWD/fdroid-repo:/home/fdroid \ registry.gitlab.com/fdroid/docker-executable-fdroidserver:master update --nosign --clean # ------------------- Deploy F-Droid Repo via SCP ------------------- - name: Deploy F-Droid Repo via SCP if: env.CONTINUE == 'true' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} SCP_SERVER: ${{ secrets.SCP_SERVER }} SCP_USER: ${{ secrets.SCP_USER }} SCP_TARGET_PATH: ${{ secrets.SCP_TARGET_PATH }} SCP_PORT: ${{ secrets.SCP_PORT }} run: | mkdir -p ~/.ssh echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -p $SCP_PORT -H $SCP_SERVER >> ~/.ssh/known_hosts rsync -avz --delete -e "ssh -p $SCP_PORT" fdroid-repo/ $SCP_USER@$SCP_SERVER:$SCP_TARGET_PATH