# Требуемые секреты репозитория (Settings → Actions → Secrets): # ANDROID_KEYSTORE — содержимое .jks файла (base64-кодированное) # ANDROID_KEYSTORE_PASSWORD # ANDROID_KEY_ALIAS # ANDROID_KEY_PASSWORD # # Релиз публикуется через официальный Gitea REST API с использованием # встроенного токена GITEA_TOKEN (право releases: write задано ниже). name: Release APK on: workflow_dispatch: inputs: release_notes: description: 'Текст описания релиза (Markdown), можно оставить пустым' required: false default: '' type: string jobs: build: 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: | apt-get update apt-get install -y openjdk-17-jdk-headless unzip wget echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> "$GITHUB_ENV" - 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: # Переменные окружения, которые читает 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 id: create_release run: | API="${{ gitea.server_url }}/api/v1/repos/${{ github.repository }}/releases" BODY=$(jq -n \ --arg tag "${{ steps.version.outputs.version_tag }}" \ --arg name "${{ steps.version.outputs.version_name }}" \ --arg notes "${{ github.event.inputs.release_notes }}" \ '{tag_name: $tag, name: $name, body: $notes}') RESP=$(curl -sS -X POST "$API" \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ -H "Content-Type: application/json" \ -d "$BODY") echo "$RESP" | jq -e .id >/dev/null || { echo "Ошибка создания релиза:"; echo "$RESP"; exit 1; } RELEASE_ID=$(echo "$RESP" | jq -r .id) echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT" echo "Создан релиз ${{ steps.version.outputs.version_name }} (id=$RELEASE_ID)" - name: Upload APK as release asset run: | ASSET_API="${{ gitea.server_url }}/api/v1/repos/${{ github.repository }}/releases/${{ steps.create_release.outputs.release_id }}/assets" curl -sS -X POST "$ASSET_API?name=${{ steps.version.outputs.version_name }}.apk" \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ -H "Content-Type: application/vnd.android.package-archive" \ --data-binary "@${{ steps.apk.outputs.apk_path }}" echo echo "APK загружен в релиз." - name: Upload APK as artifact uses: actions/upload-artifact@v4 with: name: vyatsu-schedule-${{ steps.version.outputs.version_name }} path: ${{ steps.apk.outputs.apk_path }}