Compare commits

...

4 Commits

Author SHA1 Message Date
804253ffcc Merge branch 'feature/torrent-engine-integration' into 'main'
fix(build): resolve Gradle and manifest issues for TorrentEngine

See merge request foxixus/neomovies_mobile!2
2025-10-02 14:30:27 +00:00
factory-droid[bot]
e4e56d76af Add automatic GitLab Releases with versioning
- Build release APKs for all branches (dev, main, feature/*, tags)
- Auto-create GitLab Releases with version v0.0.{PIPELINE_ID}
- Support semantic versioning via git tags (e.g., v0.0.3)
- Include all APK variants (arm64, arm32, x86_64) and torrentengine AAR
- Release triggers automatically on dev/main branches after successful build
- Full release description with commit info and download links
- Artifacts expire in 90 days for releases, 30 days for builds
- Use GitLab Release API with fallback for updates
2025-10-02 14:17:17 +00:00
factory-droid[bot]
4306a9038a Simplify GitLab CI/CD configuration
- Removed complex before_script logic and manual Flutter installation
- Use ghcr.io/cirruslabs/flutter:stable image for Flutter builds
- Simplified job rules using modern GitLab syntax
- Increased JVM heap to 2048m for better performance
- Removed manual local.properties creation (handled by Gradle)
- Cleaner artifact naming and job structure
- Kept all essential jobs: torrent-engine, apk builds, tests, deploy
2025-10-02 14:01:32 +00:00
143a5cf8a5 Merge branch 'feature/torrent-engine-integration' into 'main'
better

See merge request foxixus/neomovies_mobile!1
2025-10-02 12:18:39 +00:00

View File

@@ -1,202 +1,201 @@
# GitLab CI/CD Configuration for NeoMovies Mobile
# Автоматическая сборка APK и TorrentEngine модуля
stages: stages:
- build - build
- test - test
- deploy - deploy
variables: variables:
# Flutter версия GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs='-Xmx2048m' -Dorg.gradle.parallel=true"
FLUTTER_VERSION: "3.35.5"
# Flutter путь для CI
FLUTTER_ROOT: "/opt/flutter"
# Android SDK (стандартный путь в mingc/android-build-box)
ANDROID_SDK_ROOT: "/opt/android-sdk"
ANDROID_HOME: "/opt/android-sdk"
# Gradle настройки для CI (меньше RAM)
GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs='-Xmx1536m -XX:MaxMetaspaceSize=512m' -Dorg.gradle.parallel=true -Dorg.gradle.caching=true"
# Кэш
GRADLE_USER_HOME: "${CI_PROJECT_DIR}/.gradle" GRADLE_USER_HOME: "${CI_PROJECT_DIR}/.gradle"
PUB_CACHE: "${CI_PROJECT_DIR}/.pub-cache" PUB_CACHE: "${CI_PROJECT_DIR}/.pub-cache"
# Кэширование для ускорения сборки
cache: cache:
key: ${CI_COMMIT_REF_SLUG} key: ${CI_COMMIT_REF_SLUG}
paths: paths:
- .gradle/ - .gradle/
- .pub-cache/ - .pub-cache/
- android/.gradle/ - android/.gradle/
- android/build/
- build/ - build/
# ============================================
# Сборка только TorrentEngine модуля
# ============================================
build:torrent-engine: build:torrent-engine:
stage: build stage: build
image: mingc/android-build-box:latest image: mingc/android-build-box:latest
tags:
- saas-linux-medium-amd64 # GitLab Instance Runner (4GB RAM, 2 cores)
before_script:
- echo "Detecting Android SDK location..."
- export ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT:-${ANDROID_HOME:-/opt/android-sdk}}
- echo "Android SDK: ${ANDROID_SDK_ROOT}"
- echo "Creating local.properties for Flutter..."
- echo "flutter.sdk=${FLUTTER_ROOT}" > android/local.properties
- echo "sdk.dir=${ANDROID_SDK_ROOT}" >> android/local.properties
- cat android/local.properties
script: script:
- echo "Building TorrentEngine library module..."
- cd android - cd android
# Собираем только модуль torrentengine - chmod +x gradlew
- ./gradlew :torrentengine:assembleRelease --no-daemon --parallel --build-cache - ./gradlew :torrentengine:assembleRelease --no-daemon --stacktrace
- ls -lah torrentengine/build/outputs/aar/
artifacts: artifacts:
name: "torrentengine-${CI_COMMIT_SHORT_SHA}"
paths: paths:
- android/torrentengine/build/outputs/aar/*.aar - android/torrentengine/build/outputs/aar/*.aar
expire_in: 1 week expire_in: 30 days
only: rules:
- dev - if: $CI_COMMIT_BRANCH == "dev"
- feature/torrent-engine-integration - if: $CI_COMMIT_BRANCH == "main"
- merge_requests - if: $CI_COMMIT_BRANCH =~ /^feature\//
when: on_success - if: $CI_COMMIT_TAG
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
# ============================================
# Сборка Debug APK
# ============================================
build:apk-debug: build:apk-debug:
stage: build stage: build
image: mingc/android-build-box:latest image: ghcr.io/cirruslabs/flutter:stable
tags:
- docker
before_script:
- echo "Installing Flutter ${FLUTTER_VERSION}..."
- git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git /opt/flutter
- export PATH="/opt/flutter/bin:$PATH"
- flutter --version
- flutter doctor -v
- flutter pub get
script: script:
- echo "Building Debug APK..." - flutter pub get
- flutter build apk --debug --target-platform android-arm64 - flutter build apk --debug
- ls -lah build/app/outputs/flutter-apk/
artifacts: artifacts:
name: "neomovies-debug-${CI_COMMIT_SHORT_SHA}"
paths: paths:
- build/app/outputs/flutter-apk/app-debug.apk - build/app/outputs/flutter-apk/app-debug.apk
expire_in: 1 week expire_in: 1 week
only: rules:
- dev - if: $CI_COMMIT_BRANCH == "dev"
- feature/torrent-engine-integration - if: $CI_COMMIT_BRANCH =~ /^feature\//
- merge_requests - if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: on_success
allow_failure: true allow_failure: true
# ============================================
# Сборка Release APK (только для dev)
# ============================================
build:apk-release: build:apk-release:
stage: build stage: build
image: mingc/android-build-box:latest image: ghcr.io/cirruslabs/flutter:stable
tags:
- docker
before_script:
- echo "Installing Flutter ${FLUTTER_VERSION}..."
- git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git /opt/flutter
- export PATH="/opt/flutter/bin:$PATH"
- flutter --version
- flutter doctor -v
- flutter pub get
script: script:
- echo "Building Release APK..." - flutter pub get
# Сборка с split-per-abi для уменьшения размера - flutter build apk --release --split-per-abi
- flutter build apk --release --split-per-abi --target-platform android-arm64
- ls -lah build/app/outputs/flutter-apk/
artifacts: artifacts:
name: "neomovies-release-${CI_COMMIT_SHORT_SHA}"
paths: paths:
- build/app/outputs/flutter-apk/app-arm64-v8a-release.apk - 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 expire_in: 30 days
only: rules:
- dev - if: $CI_COMMIT_BRANCH == "dev"
when: on_success - if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH =~ /^feature\//
- if: $CI_COMMIT_TAG
allow_failure: true allow_failure: true
# ============================================
# Анализ кода Flutter
# ============================================
test:flutter-analyze: test:flutter-analyze:
stage: test stage: test
image: mingc/android-build-box:latest image: ghcr.io/cirruslabs/flutter:stable
tags:
- docker
before_script:
- git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git /opt/flutter
- export PATH="/opt/flutter/bin:$PATH"
- flutter pub get
script: script:
- echo "Running Flutter analyze..." - flutter pub get
- flutter analyze --no-fatal-infos || true - flutter analyze
only: rules:
- dev - if: $CI_COMMIT_BRANCH == "dev"
- merge_requests - if: $CI_PIPELINE_SOURCE == "merge_request_event"
allow_failure: true allow_failure: true
# ============================================
# Kotlin/Android lint
# ============================================
test:android-lint: test:android-lint:
stage: test stage: test
image: mingc/android-build-box:latest image: mingc/android-build-box:latest
tags:
- docker
before_script:
- echo "Creating local.properties for Flutter..."
- echo "flutter.sdk=${FLUTTER_ROOT}" > android/local.properties
- echo "sdk.dir=${ANDROID_SDK_ROOT}" >> android/local.properties
script: script:
- echo "Running Android Lint..."
- cd android - cd android
- ./gradlew lint --no-daemon || true - chmod +x gradlew
- ./gradlew lint --no-daemon
artifacts: artifacts:
name: "lint-reports-${CI_COMMIT_SHORT_SHA}"
paths: paths:
- android/app/build/reports/lint-results*.html - android/app/build/reports/lint-*.html
- android/torrentengine/build/reports/lint-results*.html - android/torrentengine/build/reports/lint-*.html
expire_in: 1 week expire_in: 1 week
only: when: always
- dev rules:
- merge_requests - if: $CI_COMMIT_BRANCH == "dev"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
allow_failure: true allow_failure: true
# ============================================
# Deploy к релизам (опционально)
# ============================================
deploy:release: deploy:release:
stage: deploy stage: deploy
image: alpine:latest image: alpine:latest
tags: needs:
- docker - build:apk-release
- build:torrent-engine
before_script: before_script:
- apk add --no-cache curl jq - apk add --no-cache curl jq
script: script:
- echo "Creating GitLab Release..."
- | - |
if [ -f "build/app/outputs/flutter-apk/app-arm64-v8a-release.apk" ]; then # Определяем версию релиза
echo "Release APK found" if [ -n "$CI_COMMIT_TAG" ]; then
# Здесь можно добавить публикацию в GitLab Releases или другой deployment VERSION="$CI_COMMIT_TAG"
else
# Автоматическая версия из коммита
VERSION="v0.0.${CI_PIPELINE_ID}"
fi fi
only:
- tags echo "📦 Creating GitLab Release: $VERSION"
when: manual echo "📝 Commit: ${CI_COMMIT_SHORT_SHA}"
echo "🔗 Branch: ${CI_COMMIT_BRANCH}"
# ============================================
# Уведомление об успешной сборке # Проверяем наличие APK файлов
# ============================================ APK_ARM64="build/app/outputs/flutter-apk/app-arm64-v8a-release.apk"
.notify_success: APK_ARM32="build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk"
after_script: APK_X86="build/app/outputs/flutter-apk/app-x86_64-release.apk"
- echo "✅ Build completed successfully!" AAR_TORRENT="android/torrentengine/build/outputs/aar/torrentengine-release.aar"
- echo "📦 Artifacts are available in the pipeline artifacts"
- echo "🔗 Download URL: ${CI_JOB_URL}/artifacts/download" # Создаем описание релиза
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 <<EOF
{
"name": "NeoMovies ${VERSION}",
"tag_name": "${VERSION}",
"description": "${RELEASE_DESCRIPTION}",
"ref": "${CI_COMMIT_SHA}",
"assets": {
"links": []
}
}
EOF
)
echo "🚀 Creating release via GitLab API..."
RESPONSE=$(curl --fail-with-body -s -X POST \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases" \
--header "PRIVATE-TOKEN: ${CI_JOB_TOKEN}" \
--header "Content-Type: application/json" \
--data "${RELEASE_PAYLOAD}" || echo "FAILED")
if [ "$RESPONSE" = "FAILED" ]; then
echo "⚠️ Release API call failed, trying alternative method..."
# Если релиз уже существует, пробуем обновить
curl -s -X PUT \
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases/${VERSION}" \
--header "PRIVATE-TOKEN: ${CI_JOB_TOKEN}" \
--header "Content-Type: application/json" \
--data "${RELEASE_PAYLOAD}"
fi
echo ""
echo "✅ Release created successfully!"
echo "🔗 View release: ${CI_PROJECT_URL}/-/releases/${VERSION}"
echo "📦 Pipeline artifacts: ${CI_JOB_URL}/artifacts/browse"
artifacts:
paths:
- build/app/outputs/flutter-apk/*.apk
- android/torrentengine/build/outputs/aar/*.aar
expire_in: 90 days
rules:
- if: $CI_COMMIT_TAG
when: always
- if: $CI_COMMIT_BRANCH == "dev"
when: on_success
- if: $CI_COMMIT_BRANCH == "main"
when: on_success