From 8f4ab2783ec37278af6cb1aa6ed89ccb3f450f6d Mon Sep 17 00:00:00 2001 From: Agzamus Date: Thu, 3 Sep 2026 00:06:07 +0300 Subject: [PATCH] ci: autorelease --- .gitea/workflows/release.yml | 96 ++++++++++++++++++++++++++++++++++++ app/build.gradle.kts | 18 +++++++ 2 files changed, 114 insertions(+) create mode 100644 .gitea/workflows/release.yml diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..a371dc0 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,96 @@ +# Требуемые секреты репозитория (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: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + # Версия по дате (ГГГГ.ММ.ДД), при совпадении тега добавляем уникальный суффикс. + - 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: Upload APK as artifact + uses: actions/upload-artifact@v4 + with: + name: vyatsu-schedule-${{ steps.version.outputs.version_name }} + path: ${{ steps.apk.outputs.apk_path }} + + - name: Create Gitea Release + uses: gitea/actions/release-action@v1 + with: + body: ${{ github.event.inputs.release_notes }} + files: ${{ steps.apk.outputs.apk_path }} + title: ${{ steps.version.outputs.version_name }} + tag: ${{ steps.version.outputs.version_tag }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b27cb56..648dd19 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,6 +22,20 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + // Релизная подпись, ключ и пароли читаются из переменных окружения + // release-сборка не подписывается + signingConfigs { + create("release") { + val storePath = System.getenv("ANDROID_KEYSTORE_PATH") + if (!storePath.isNullOrBlank()) { + storeFile = file(storePath) + storePassword = System.getenv("ANDROID_KEYSTORE_PASSWORD") + keyAlias = System.getenv("ANDROID_KEY_ALIAS") + keyPassword = System.getenv("ANDROID_KEY_PASSWORD") + } + } + } + buildTypes { release { isMinifyEnabled = false @@ -29,6 +43,10 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) + // Подпись (если есть) + if (!System.getenv("ANDROID_KEYSTORE_PATH").isNullOrBlank()) { + signingConfig = signingConfigs.getByName("release") + } } } testOptions {