stages: - build - test - deploy variables: GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs='-Xmx2048m' -Dorg.gradle.parallel=false" build:torrent-engine: stage: build image: mingc/android-build-box:latest before_script: - echo "sdk.dir=${ANDROID_SDK_ROOT:-/opt/android-sdk}" > android/local.properties script: - cd android - chmod +x gradlew - ./gradlew :torrentengine:assembleRelease --no-daemon --stacktrace artifacts: paths: - android/torrentengine/build/outputs/aar/*.aar expire_in: 30 days rules: - if: $CI_COMMIT_BRANCH == "dev" - if: $CI_COMMIT_BRANCH == "main" - if: $CI_COMMIT_BRANCH =~ /^feature\// - if: $CI_COMMIT_TAG - if: $CI_PIPELINE_SOURCE == "merge_request_event" build:apk-debug: stage: build image: ghcr.io/cirruslabs/flutter:stable script: - flutter pub get - flutter build apk --debug artifacts: paths: - build/app/outputs/flutter-apk/app-debug.apk expire_in: 1 week rules: - if: $CI_COMMIT_BRANCH == "dev" - if: $CI_COMMIT_BRANCH =~ /^feature\// - if: $CI_PIPELINE_SOURCE == "merge_request_event" allow_failure: true build:apk-release: stage: build image: ghcr.io/cirruslabs/flutter:stable script: - flutter pub get - flutter build apk --release --split-per-abi artifacts: paths: - build/app/outputs/flutter-apk/app-arm64-v8a-release.apk - build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk - build/app/outputs/flutter-apk/app-x86_64-release.apk expire_in: 30 days rules: - if: $CI_COMMIT_BRANCH == "dev" - if: $CI_COMMIT_BRANCH == "main" - if: $CI_COMMIT_BRANCH =~ /^feature\// - if: $CI_COMMIT_TAG allow_failure: true test:flutter-analyze: stage: test image: ghcr.io/cirruslabs/flutter:stable script: - flutter pub get - flutter analyze rules: - if: $CI_COMMIT_BRANCH == "dev" - if: $CI_PIPELINE_SOURCE == "merge_request_event" allow_failure: true test:android-lint: stage: test image: mingc/android-build-box:latest script: - cd android - chmod +x gradlew - ./gradlew lint --no-daemon artifacts: paths: - android/app/build/reports/lint-*.html - android/torrentengine/build/reports/lint-*.html expire_in: 1 week when: always rules: - if: $CI_COMMIT_BRANCH == "dev" - if: $CI_PIPELINE_SOURCE == "merge_request_event" allow_failure: true deploy:release: stage: deploy image: alpine:latest needs: - build:apk-release - build:torrent-engine before_script: - apk add --no-cache curl jq script: - | # Определяем версию релиза if [ -n "$CI_COMMIT_TAG" ]; then VERSION="$CI_COMMIT_TAG" else # Автоматическая версия из коммита VERSION="v0.0.${CI_PIPELINE_ID}" fi echo "📦 Creating GitLab Release: $VERSION" echo "📝 Commit: ${CI_COMMIT_SHORT_SHA}" echo "🔗 Branch: ${CI_COMMIT_BRANCH}" # Проверяем наличие APK файлов APK_ARM64="build/app/outputs/flutter-apk/app-arm64-v8a-release.apk" APK_ARM32="build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk" APK_X86="build/app/outputs/flutter-apk/app-x86_64-release.apk" AAR_TORRENT="android/torrentengine/build/outputs/aar/torrentengine-release.aar" # Создаем описание релиза RELEASE_DESCRIPTION="## NeoMovies Mobile ${VERSION} **Build Info:** - Commit: \`${CI_COMMIT_SHORT_SHA}\` - Branch: \`${CI_COMMIT_BRANCH}\` - Pipeline: [#${CI_PIPELINE_ID}](${CI_PIPELINE_URL}) **Downloads:** " # Подсчитываем файлы FILE_COUNT=0 [ -f "$APK_ARM64" ] && FILE_COUNT=$((FILE_COUNT+1)) && RELEASE_DESCRIPTION="${RELEASE_DESCRIPTION}\n- ARM64 APK: \`app-arm64-v8a-release.apk\`" [ -f "$APK_ARM32" ] && FILE_COUNT=$((FILE_COUNT+1)) && RELEASE_DESCRIPTION="${RELEASE_DESCRIPTION}\n- ARM32 APK: \`app-armeabi-v7a-release.apk\`" [ -f "$APK_X86" ] && FILE_COUNT=$((FILE_COUNT+1)) && RELEASE_DESCRIPTION="${RELEASE_DESCRIPTION}\n- x86_64 APK: \`app-x86_64-release.apk\`" [ -f "$AAR_TORRENT" ] && FILE_COUNT=$((FILE_COUNT+1)) && RELEASE_DESCRIPTION="${RELEASE_DESCRIPTION}\n- TorrentEngine Library: \`torrentengine-release.aar\`" if [ $FILE_COUNT -eq 0 ]; then echo "❌ No release artifacts found!" exit 1 fi echo "✅ Found $FILE_COUNT artifact(s) to release" # Создаем релиз через GitLab API RELEASE_PAYLOAD=$(cat <