# Требуемые секреты репозитория (Settings → Actions → Secrets): # ANDROID_KEYSTORE — содержимое .jks файла (base64-кодированное) # ANDROID_KEYSTORE_PASSWORD # ANDROID_KEY_ALIAS # ANDROID_KEY_PASSWORD name: Release APK on: workflow_dispatch: inputs: release_notes: description: 'Текст описания релиза (Markdown), можно оставить пустым' required: false default: '' type: string jobs: build: needs: tests runs-on: ubuntu-latest permissions: contents: read releases: write steps: - name: Checkout uses: actions/checkout@v4 - name: Set up JDK 17 # Ставим JDK вручную и явно прописываем JAVA_HOME. # actions/setup-java не всегда передаёт JAVA_HOME дальше в Gitea Actions. run: | set -euxo pipefail cd /tmp wget -q https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz -C /opt mv /opt/jdk-17.0.12+7 /opt/java17 export JAVA_HOME=/opt/java17 export PATH=$JAVA_HOME/bin:$PATH echo "JAVA_HOME=/opt/java17" >> $GITHUB_ENV echo "$JAVA_HOME/bin" >> $GITHUB_PATH java -version javac -version - name: Install Android SDK # Устанавливаем command-line tools и нужные компоненты SDK, # затем прописываем ANDROID_HOME (читается Gradle/AGP). run: | set -euxo pipefail echo "ANDROID_HOME=/opt/android-sdk" >> "$GITHUB_ENV" mkdir -p /opt/android-sdk/cmdline-tools wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/clt.zip unzip -q /tmp/clt.zip -d /tmp/clt mv /tmp/clt/cmdline-tools /opt/android-sdk/cmdline-tools/latest yes | /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses >/dev/null 2>&1 || true /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager \ "platform-tools" \ "platforms;android-36.1" \ "build-tools;36.1.0" - name: Grant execute permission for gradlew run: | chmod +x gradlew java -version # Версия по дате (ГГГГ.ММ.ДД), при совпадении тега добавляем уникальный суффикс. - name: Generate version from date id: version run: | BASE="$(date +%Y.%m.%d)" TAG="v$BASE" SUFFIX=0 while git ls-remote --tags origin "$TAG" 2>/dev/null | grep -q "$TAG"; do SUFFIX=$((SUFFIX + 1)) TAG="v${BASE}.${SUFFIX}" done echo "version_name=$BASE" >> "$GITHUB_OUTPUT" echo "version_tag=$TAG" >> "$GITHUB_OUTPUT" echo "Generated version: $BASE (tag: $TAG)" - name: Restore keystore from secret # Ключ подписи передаётся как base64-секрет и декодируется в файл. run: | if [ -n "$ANDROID_KEYSTORE" ]; then echo "$ANDROID_KEYSTORE" | base64 -d > keystore.jks echo "keystore restored" else echo "::warning::ANDROID_KEYSTORE not set, building unsigned release" fi env: ANDROID_KEYSTORE: ${{ secrets.ANDROID_KEYSTORE }} - name: Build release APK run: ./gradlew assembleRelease env: # Версия приложения — дата, сгенерированная на предыдущем шаге. # Читается в app/build.gradle.kts как versionName (для BuildConfig). APP_VERSION: ${{ steps.version.outputs.version_name }} # Переменные окружения, которые читает signingConfig в app/build.gradle.kts ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/keystore.jks ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} ORG_GRADLE_JVMARGS: '-Xmx2048m' GRADLE_OPTS: '-Dorg.gradle.daemon=false' - name: Determine APK path id: apk run: | APK=$(find app/build/outputs/apk/release -name "*.apk" ! -name "*unsigned*" ! -name "*unaligned*" | head -n 1) if [ -z "$APK" ]; then APK=$(find app/build/outputs/apk/release -name "*.apk" | head -n 1) fi echo "apk_path=$APK" >> "$GITHUB_OUTPUT" echo "APK path: $APK" - name: Create Gitea Release uses: https://gitea.com/actions/gitea-release-action@v1 with: tag_name: ${{ steps.version.outputs.version_tag }} name: ${{ steps.version.outputs.version_name }} body: ${{ github.event.inputs.release_notes }} files: ${{ steps.apk.outputs.apk_path }} token: ${{ secrets.GITEA_TOKEN }} server_url: ${{ gitea.server_url }}