diff --git a/fdroid-publish/README.md b/fdroid-publish/README.md new file mode 100644 index 0000000..4661017 --- /dev/null +++ b/fdroid-publish/README.md @@ -0,0 +1,46 @@ +# fdroid-publish — публикация APK в F-Droid + +Подписывает APK (v1+v2, keystore из переменных Gitea) и публикует в F-Droid репозиторий, затем пересобирает индекс (`fdroid update`). + +## Использование + +В workflow проекта (по образцу `build-docker` / `helm-publish`): + +```yaml +- name: Build APK + uses: https://git.binom.pw/subochev/devops/build-gradle@main + with: + target: assembleRelease + +- name: Publish to F-Droid + uses: https://git.binom.pw/subochev/devops/fdroid-publish@main + with: + apk_path: "app/build/outputs/apk/release/app-release-unsigned.apk" +``` + +## Переменные (user-level, Gitea → Settings → Actions → Variables) + +| Переменная | Назначение | +|---|---| +| `ANDROID_KEYSTORE_B64` | keystore подписи приложений в base64 | +| `ANDROID_KEYSTORE_PASSWORD` | пароль keystore | +| `ANDROID_KEY_ALIAS` | алиас ключа (binom) | +| `ANDROID_KEY_PASSWORD` | пароль ключа | +| `FROID_HOST` | F-Droid LXC (192.168.76.165) | +| `FROID_SSH_USER` | root | +| `FROID_SSH_KEY` | приватный SSH-ключ CI (ed25519) | + +## Что происходит + +1. Setup Java 21 +2. Декодирует keystore, подписывает APK через uber-apk-signer (v1+v2) +3. `scp` подписанного APK в `/opt/fdroid/repo/` на F-Droid LXC +4. `ssh "cd /opt/fdroid && fdroid update"` — пересборка индекса + +После этого F-Droid-клиенты на устройствах подтянут обновление автоматически. + +## Инфраструктура (см. скилл `fdroid-repo`) + +- LXC 192.168.76.165: fdroidserver 2.4.2, репозиторий `/opt/fdroid/repo` (единый источник; nginx монтирует его в контейнер) +- URL репозитория: `https://fdroid.binom.pw/repo/` +- keystore подписи приложений: `/opt/fdroid/android-release.keystore` (alias binom) diff --git a/fdroid-publish/action.yml b/fdroid-publish/action.yml new file mode 100644 index 0000000..ce536b0 --- /dev/null +++ b/fdroid-publish/action.yml @@ -0,0 +1,58 @@ +name: "Publish APK to F-Droid" +description: "Sign APK (v1+v2) and publish to the F-Droid repository, then rebuild the index" + +inputs: + apk_path: + description: "Path to the APK to sign and publish" + required: true + +runs: + using: "composite" + steps: + - name: Setup Java + uses: actions/setup-java@v4 + with: + java-version: 21 + distribution: "adopt" + + - name: Sign APK + shell: bash + env: + KEYSTORE_B64: ${{ vars.ANDROID_KEYSTORE_B64 }} + KEYSTORE_PASS: ${{ vars.ANDROID_KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ vars.ANDROID_KEY_ALIAS }} + KEY_PASS: ${{ vars.ANDROID_KEY_PASSWORD }} + run: | + set -euo pipefail + echo "Signing ${{ inputs.apk_path }}" + echo "$KEYSTORE_B64" | base64 -d > /tmp/release.keystore + curl -sL -o /tmp/uber-apk-signer.jar \ + https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar + java -jar /tmp/uber-apk-signer.jar \ + -a "${{ inputs.apk_path }}" \ + --ks /tmp/release.keystore \ + --ksAlias "$KEY_ALIAS" \ + --ksPass "$KEYSTORE_PASS" \ + --ksKeyPass "$KEY_PASS" \ + --allowResign \ + -o /tmp/apk-out + echo "Signed APK:" + ls -la /tmp/apk-out/*.apk + + - name: Push to F-Droid repo and rebuild index + shell: bash + env: + FROID_HOST: ${{ vars.FROID_HOST }} + FROID_SSH_USER: ${{ vars.FROID_SSH_USER }} + FROID_SSH_KEY: ${{ vars.FROID_SSH_KEY }} + run: | + set -euo pipefail + mkdir -p ~/.ssh && chmod 700 ~/.ssh + echo "$FROID_SSH_KEY" > ~/.ssh/froid_ci && chmod 600 ~/.ssh/froid_ci + APK=$(ls /tmp/apk-out/*.apk | head -1) + echo "Uploading $(basename "$APK") to ${FROID_SSH_USER}@${FROID_HOST}:/opt/fdroid/repo/" + scp -i ~/.ssh/froid_ci -o StrictHostKeyChecking=accept-new "$APK" \ + "${FROID_SSH_USER}@${FROID_HOST}:/opt/fdroid/repo/" + ssh -i ~/.ssh/froid_ci "${FROID_SSH_USER}@${FROID_HOST}" \ + "cd /opt/fdroid && fdroid update" + echo "Done. F-Droid repo: https://fdroid.binom.pw/repo/"