mirror of
https://gitlab.com/foxixus/neomovies_mobile.git
synced 2025-10-28 03:58:50 +05:00
ci: optimize RAM usage and add CI/CD pipelines
- Reduce Gradle RAM from 4GB to 2GB with optimizations - Add GitLab CI/CD with separate jobs for TorrentEngine and APK - Add GitHub Actions workflow as alternative - Enable parallel builds and caching - Configure automated artifact uploads - Add comprehensive CI/CD documentation
This commit is contained in:
185
.github/workflows/build.yml
vendored
Normal file
185
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
name: Build NeoMovies Mobile
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ dev, feature/torrent-engine-integration ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ dev ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
FLUTTER_VERSION: '3.35.5'
|
||||||
|
JAVA_VERSION: '17'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# ============================================
|
||||||
|
# Сборка TorrentEngine модуля
|
||||||
|
# ============================================
|
||||||
|
build-torrent-engine:
|
||||||
|
name: Build TorrentEngine Library
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'zulu'
|
||||||
|
java-version: '17'
|
||||||
|
cache: 'gradle'
|
||||||
|
|
||||||
|
- name: Setup Gradle
|
||||||
|
uses: gradle/actions/setup-gradle@v3
|
||||||
|
with:
|
||||||
|
gradle-version: wrapper
|
||||||
|
|
||||||
|
- name: Build TorrentEngine AAR
|
||||||
|
working-directory: android
|
||||||
|
run: |
|
||||||
|
./gradlew :torrentengine:assembleRelease \
|
||||||
|
--no-daemon \
|
||||||
|
--parallel \
|
||||||
|
--build-cache \
|
||||||
|
-Dorg.gradle.jvmargs="-Xmx2g -XX:MaxMetaspaceSize=512m"
|
||||||
|
|
||||||
|
- name: Upload TorrentEngine AAR
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: torrentengine-aar
|
||||||
|
path: android/torrentengine/build/outputs/aar/*.aar
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Сборка Debug APK
|
||||||
|
# ============================================
|
||||||
|
build-debug-apk:
|
||||||
|
name: Build Debug APK
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
channel: 'stable'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'zulu'
|
||||||
|
java-version: '17'
|
||||||
|
cache: 'gradle'
|
||||||
|
|
||||||
|
- name: Flutter Doctor
|
||||||
|
run: flutter doctor -v
|
||||||
|
|
||||||
|
- name: Get Flutter dependencies
|
||||||
|
run: flutter pub get
|
||||||
|
|
||||||
|
- name: Build Debug APK
|
||||||
|
run: |
|
||||||
|
flutter build apk \
|
||||||
|
--debug \
|
||||||
|
--target-platform android-arm64
|
||||||
|
|
||||||
|
- name: Upload Debug APK
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: debug-apk
|
||||||
|
path: build/app/outputs/flutter-apk/app-debug.apk
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Сборка Release APK
|
||||||
|
# ============================================
|
||||||
|
build-release-apk:
|
||||||
|
name: Build Release APK
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.ref == 'refs/heads/dev'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
channel: 'stable'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'zulu'
|
||||||
|
java-version: '17'
|
||||||
|
cache: 'gradle'
|
||||||
|
|
||||||
|
- name: Get Flutter dependencies
|
||||||
|
run: flutter pub get
|
||||||
|
|
||||||
|
- name: Build Release APK (split per ABI)
|
||||||
|
run: |
|
||||||
|
flutter build apk \
|
||||||
|
--release \
|
||||||
|
--split-per-abi \
|
||||||
|
--target-platform android-arm64
|
||||||
|
|
||||||
|
- name: Upload Release APK (ARM64)
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: release-apk-arm64
|
||||||
|
path: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
|
||||||
|
retention-days: 30
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Анализ кода
|
||||||
|
# ============================================
|
||||||
|
code-quality:
|
||||||
|
name: Code Quality Checks
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||||
|
channel: 'stable'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Get Flutter dependencies
|
||||||
|
run: flutter pub get
|
||||||
|
|
||||||
|
- name: Flutter Analyze
|
||||||
|
run: flutter analyze --no-fatal-infos
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: 'zulu'
|
||||||
|
java-version: '17'
|
||||||
|
|
||||||
|
- name: Android Lint
|
||||||
|
working-directory: android
|
||||||
|
run: ./gradlew lint --no-daemon
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Upload Lint Reports
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: lint-reports
|
||||||
|
path: |
|
||||||
|
android/app/build/reports/lint-results*.html
|
||||||
|
android/torrentengine/build/reports/lint-results*.html
|
||||||
|
retention-days: 7
|
||||||
278
.gitlab-ci.yml
278
.gitlab-ci.yml
@@ -1,133 +1,187 @@
|
|||||||
|
# GitLab CI/CD Configuration for NeoMovies Mobile
|
||||||
|
# Автоматическая сборка APK и TorrentEngine модуля
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- test
|
|
||||||
- build
|
- build
|
||||||
|
- test
|
||||||
- deploy
|
- deploy
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
FLUTTER_VERSION: "3.16.0"
|
# Flutter версия
|
||||||
ANDROID_SDK_VERSION: "34"
|
FLUTTER_VERSION: "3.35.5"
|
||||||
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
|
# Android SDK
|
||||||
|
ANDROID_SDK_ROOT: "/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"
|
||||||
|
PUB_CACHE: "${CI_PROJECT_DIR}/.pub-cache"
|
||||||
|
|
||||||
# Кэш для оптимизации сборки
|
# Кэширование для ускорения сборки
|
||||||
cache:
|
cache:
|
||||||
key: flutter-cache
|
key: ${CI_COMMIT_REF_SLUG}
|
||||||
paths:
|
paths:
|
||||||
|
- .gradle/
|
||||||
- .pub-cache/
|
- .pub-cache/
|
||||||
- android/.gradle/
|
- android/.gradle/
|
||||||
|
- android/build/
|
||||||
- build/
|
- build/
|
||||||
|
|
||||||
# Тестирование
|
# ============================================
|
||||||
test:
|
# Сборка только TorrentEngine модуля
|
||||||
stage: test
|
# ============================================
|
||||||
image: cirrusci/flutter:${FLUTTER_VERSION}
|
build:torrent-engine:
|
||||||
before_script:
|
|
||||||
- flutter --version
|
|
||||||
- flutter pub get
|
|
||||||
script:
|
|
||||||
- flutter analyze
|
|
||||||
- flutter test
|
|
||||||
artifacts:
|
|
||||||
reports:
|
|
||||||
junit: test-results.xml
|
|
||||||
paths:
|
|
||||||
- coverage/
|
|
||||||
expire_in: 1 week
|
|
||||||
|
|
||||||
# Сборка Android APK
|
|
||||||
build_android:
|
|
||||||
stage: build
|
stage: build
|
||||||
image: cirrusci/flutter:${FLUTTER_VERSION}
|
image: mingc/android-build-box:latest
|
||||||
before_script:
|
tags:
|
||||||
- flutter --version
|
- docker
|
||||||
- flutter pub get
|
|
||||||
script:
|
|
||||||
- flutter build apk --release
|
|
||||||
- flutter build appbundle --release
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build/app/outputs/flutter-apk/app-release.apk
|
|
||||||
- build/app/outputs/bundle/release/app-release.aab
|
|
||||||
expire_in: 1 month
|
|
||||||
rules:
|
|
||||||
- if: '$CI_COMMIT_BRANCH'
|
|
||||||
- if: '$CI_COMMIT_TAG'
|
|
||||||
|
|
||||||
# Сборка Linux приложения
|
|
||||||
build_linux:
|
|
||||||
stage: build
|
|
||||||
image: ubuntu:22.04
|
|
||||||
before_script:
|
|
||||||
- apt-get update -y
|
|
||||||
- apt-get install -y curl git unzip xz-utils zip libglu1-mesa
|
|
||||||
- apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev
|
|
||||||
- apt-get install -y libblkid-dev liblzma-dev
|
|
||||||
# Установка Flutter
|
|
||||||
- git clone https://github.com/flutter/flutter.git -b stable --depth 1
|
|
||||||
- export PATH="$PATH:`pwd`/flutter/bin"
|
|
||||||
- flutter --version
|
|
||||||
- flutter config --enable-linux-desktop
|
|
||||||
- flutter pub get
|
|
||||||
script:
|
|
||||||
- flutter build linux --release
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build/linux/x64/release/bundle/
|
|
||||||
expire_in: 1 month
|
|
||||||
rules:
|
|
||||||
- if: '$CI_COMMIT_BRANCH'
|
|
||||||
- if: '$CI_COMMIT_TAG'
|
|
||||||
|
|
||||||
# Деплой в Google Play (опционально)
|
|
||||||
deploy_android:
|
|
||||||
stage: deploy
|
|
||||||
image: ruby:3.0
|
|
||||||
before_script:
|
|
||||||
- gem install fastlane
|
|
||||||
script:
|
script:
|
||||||
|
- echo "Building TorrentEngine library module..."
|
||||||
- cd android
|
- cd android
|
||||||
- fastlane supply --aab ../build/app/outputs/bundle/release/app-release.aab
|
# Собираем только модуль torrentengine
|
||||||
dependencies:
|
- ./gradlew :torrentengine:assembleRelease --no-daemon --parallel --build-cache
|
||||||
- build_android
|
- ls -lah torrentengine/build/outputs/aar/
|
||||||
rules:
|
artifacts:
|
||||||
- if: '$CI_COMMIT_TAG'
|
name: "torrentengine-${CI_COMMIT_SHORT_SHA}"
|
||||||
when: manual
|
paths:
|
||||||
|
- android/torrentengine/build/outputs/aar/*.aar
|
||||||
|
expire_in: 1 week
|
||||||
|
only:
|
||||||
|
- dev
|
||||||
|
- feature/torrent-engine-integration
|
||||||
|
- merge_requests
|
||||||
|
when: on_success
|
||||||
|
|
||||||
# Деплой Linux приложения в GitLab Package Registry
|
# ============================================
|
||||||
deploy_linux:
|
# Сборка Debug APK
|
||||||
stage: deploy
|
# ============================================
|
||||||
image: ubuntu:22.04
|
build:apk-debug:
|
||||||
|
stage: build
|
||||||
|
image: mingc/android-build-box:latest
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
before_script:
|
before_script:
|
||||||
- apt-get update -y
|
- echo "Installing Flutter ${FLUTTER_VERSION}..."
|
||||||
- apt-get install -y curl zip
|
- 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:
|
||||||
- cd build/linux/x64/release/bundle
|
- echo "Building Debug APK..."
|
||||||
- zip -r ../../../../../${CI_PROJECT_NAME}-linux-${CI_COMMIT_TAG}.zip .
|
- flutter build apk --debug --target-platform android-arm64
|
||||||
- cd ../../../../../
|
- ls -lah build/app/outputs/flutter-apk/
|
||||||
- |
|
artifacts:
|
||||||
curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
|
name: "neomovies-debug-${CI_COMMIT_SHORT_SHA}"
|
||||||
--upload-file ${CI_PROJECT_NAME}-linux-${CI_COMMIT_TAG}.zip \
|
paths:
|
||||||
"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/${CI_PROJECT_NAME}-linux-${CI_COMMIT_TAG}.zip"
|
- build/app/outputs/flutter-apk/app-debug.apk
|
||||||
dependencies:
|
expire_in: 1 week
|
||||||
- build_linux
|
only:
|
||||||
rules:
|
- dev
|
||||||
- if: '$CI_COMMIT_TAG'
|
- feature/torrent-engine-integration
|
||||||
when: manual
|
- merge_requests
|
||||||
|
when: on_success
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
# Релиз на GitLab
|
# ============================================
|
||||||
release:
|
# Сборка Release APK (только для dev)
|
||||||
stage: deploy
|
# ============================================
|
||||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
build:apk-release:
|
||||||
|
stage: build
|
||||||
|
image: mingc/android-build-box:latest
|
||||||
|
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..."
|
||||||
|
# Сборка с split-per-abi для уменьшения размера
|
||||||
|
- flutter build apk --release --split-per-abi --target-platform android-arm64
|
||||||
|
- ls -lah build/app/outputs/flutter-apk/
|
||||||
|
artifacts:
|
||||||
|
name: "neomovies-release-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
paths:
|
||||||
|
- build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
|
||||||
|
expire_in: 30 days
|
||||||
|
only:
|
||||||
|
- dev
|
||||||
|
when: on_success
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Анализ кода Flutter
|
||||||
|
# ============================================
|
||||||
|
test:flutter-analyze:
|
||||||
|
stage: test
|
||||||
|
image: mingc/android-build-box:latest
|
||||||
|
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:
|
||||||
|
- echo "Running Flutter analyze..."
|
||||||
|
- flutter analyze --no-fatal-infos || true
|
||||||
|
only:
|
||||||
|
- dev
|
||||||
|
- merge_requests
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Kotlin/Android lint
|
||||||
|
# ============================================
|
||||||
|
test:android-lint:
|
||||||
|
stage: test
|
||||||
|
image: mingc/android-build-box:latest
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
script:
|
||||||
|
- echo "Running Android Lint..."
|
||||||
|
- cd android
|
||||||
|
- ./gradlew lint --no-daemon || true
|
||||||
|
artifacts:
|
||||||
|
name: "lint-reports-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
paths:
|
||||||
|
- android/app/build/reports/lint-results*.html
|
||||||
|
- android/torrentengine/build/reports/lint-results*.html
|
||||||
|
expire_in: 1 week
|
||||||
|
only:
|
||||||
|
- dev
|
||||||
|
- merge_requests
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Deploy к релизам (опционально)
|
||||||
|
# ============================================
|
||||||
|
deploy:release:
|
||||||
|
stage: deploy
|
||||||
|
image: alpine:latest
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
before_script:
|
||||||
|
- apk add --no-cache curl jq
|
||||||
|
script:
|
||||||
|
- echo "Creating GitLab Release..."
|
||||||
- |
|
- |
|
||||||
release-cli create \
|
if [ -f "build/app/outputs/flutter-apk/app-arm64-v8a-release.apk" ]; then
|
||||||
--name "Release $CI_COMMIT_TAG" \
|
echo "Release APK found"
|
||||||
--tag-name $CI_COMMIT_TAG \
|
# Здесь можно добавить публикацию в GitLab Releases или другой deployment
|
||||||
--description "Release $CI_COMMIT_TAG" \
|
fi
|
||||||
--assets-link "{\"name\":\"Android APK\",\"url\":\"${CI_PROJECT_URL}/-/jobs/artifacts/$CI_COMMIT_TAG/download?job=build_android\"}" \
|
only:
|
||||||
--assets-link "{\"name\":\"Linux App\",\"url\":\"${CI_PROJECT_URL}/-/jobs/artifacts/$CI_COMMIT_TAG/download?job=build_linux\"}"
|
- tags
|
||||||
dependencies:
|
when: manual
|
||||||
- build_android
|
|
||||||
- build_linux
|
# ============================================
|
||||||
rules:
|
# Уведомление об успешной сборке
|
||||||
- if: '$CI_COMMIT_TAG'
|
# ============================================
|
||||||
when: manual
|
.notify_success:
|
||||||
|
after_script:
|
||||||
|
- echo "✅ Build completed successfully!"
|
||||||
|
- echo "📦 Artifacts are available in the pipeline artifacts"
|
||||||
|
- echo "🔗 Download URL: ${CI_JOB_URL}/artifacts/download"
|
||||||
|
|||||||
276
CI_CD_README.md
Normal file
276
CI_CD_README.md
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
# 🚀 CI/CD Configuration для NeoMovies Mobile
|
||||||
|
|
||||||
|
## 📋 Обзор
|
||||||
|
|
||||||
|
Автоматическая сборка APK и TorrentEngine модуля с оптимизацией использования RAM.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ Конфигурации
|
||||||
|
|
||||||
|
### 1. **GitLab CI/CD** (`.gitlab-ci.yml`)
|
||||||
|
|
||||||
|
Основная конфигурация для GitLab:
|
||||||
|
|
||||||
|
#### **Stages:**
|
||||||
|
- **build** - Сборка APK и AAR
|
||||||
|
- **test** - Анализ кода и тесты
|
||||||
|
- **deploy** - Публикация релизов
|
||||||
|
|
||||||
|
#### **Jobs:**
|
||||||
|
|
||||||
|
| Job | Описание | Артефакты | Ветки |
|
||||||
|
|-----|----------|-----------|-------|
|
||||||
|
| `build:torrent-engine` | Сборка TorrentEngine AAR | `*.aar` | dev, feature/*, MR |
|
||||||
|
| `build:apk-debug` | Сборка Debug APK | `app-debug.apk` | dev, feature/*, MR |
|
||||||
|
| `build:apk-release` | Сборка Release APK | `app-arm64-v8a-release.apk` | только dev |
|
||||||
|
| `test:flutter-analyze` | Анализ Dart кода | - | dev, MR |
|
||||||
|
| `test:android-lint` | Android Lint | HTML отчеты | dev, MR |
|
||||||
|
| `deploy:release` | Публикация релиза | - | только tags (manual) |
|
||||||
|
|
||||||
|
### 2. **GitHub Actions** (`.github/workflows/build.yml`)
|
||||||
|
|
||||||
|
Альтернативная конфигурация для GitHub:
|
||||||
|
|
||||||
|
#### **Workflows:**
|
||||||
|
|
||||||
|
| Workflow | Триггер | Описание |
|
||||||
|
|----------|---------|----------|
|
||||||
|
| `build-torrent-engine` | push, PR | Сборка AAR модуля |
|
||||||
|
| `build-debug-apk` | push, PR | Debug APK для тестирования |
|
||||||
|
| `build-release-apk` | push to dev | Release APK (split-per-abi) |
|
||||||
|
| `code-quality` | push, PR | Flutter analyze + Android Lint |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚙️ Оптимизация RAM
|
||||||
|
|
||||||
|
### **gradle.properties**
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# Уменьшено с 4GB до 2GB
|
||||||
|
org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=1G
|
||||||
|
|
||||||
|
# Kotlin daemon с ограничением
|
||||||
|
kotlin.daemon.jvmargs=-Xmx1G -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
|
# Включены оптимизации
|
||||||
|
org.gradle.parallel=true
|
||||||
|
org.gradle.caching=true
|
||||||
|
org.gradle.configureondemand=true
|
||||||
|
```
|
||||||
|
|
||||||
|
### **CI переменные**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# В CI используется еще меньше RAM
|
||||||
|
GRADLE_OPTS="-Xmx1536m -XX:MaxMetaspaceSize=512m"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Артефакты
|
||||||
|
|
||||||
|
### **TorrentEngine AAR:**
|
||||||
|
- Путь: `android/torrentengine/build/outputs/aar/`
|
||||||
|
- Файл: `torrentengine-release.aar`
|
||||||
|
- Срок хранения: 7 дней
|
||||||
|
- Размер: ~5-10 MB
|
||||||
|
|
||||||
|
### **Debug APK:**
|
||||||
|
- Путь: `build/app/outputs/flutter-apk/`
|
||||||
|
- Файл: `app-debug.apk`
|
||||||
|
- Срок хранения: 7 дней
|
||||||
|
- Размер: ~50-80 MB
|
||||||
|
|
||||||
|
### **Release APK:**
|
||||||
|
- Путь: `build/app/outputs/flutter-apk/`
|
||||||
|
- Файл: `app-arm64-v8a-release.apk`
|
||||||
|
- Срок хранения: 30 дней
|
||||||
|
- Размер: ~30-50 MB (split-per-abi)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚦 Триггеры сборки
|
||||||
|
|
||||||
|
### **GitLab:**
|
||||||
|
|
||||||
|
**Автоматически запускается при:**
|
||||||
|
- Push в `dev` ветку
|
||||||
|
- Push в `feature/torrent-engine-integration`
|
||||||
|
- Создание Merge Request
|
||||||
|
- Push тега (для deploy)
|
||||||
|
|
||||||
|
**Ручной запуск:**
|
||||||
|
- Web UI → Pipelines → Run Pipeline
|
||||||
|
- Выбрать ветку и нажать "Run pipeline"
|
||||||
|
|
||||||
|
### **GitHub:**
|
||||||
|
|
||||||
|
**Автоматически запускается при:**
|
||||||
|
- Push в `dev` или `feature/torrent-engine-integration`
|
||||||
|
- Pull Request в `dev`
|
||||||
|
|
||||||
|
**Ручной запуск:**
|
||||||
|
- Actions → Build NeoMovies Mobile → Run workflow
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 Настройка GitLab Runner
|
||||||
|
|
||||||
|
Для локального тестирования CI/CD:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Установка GitLab Runner
|
||||||
|
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
|
||||||
|
sudo apt-get install gitlab-runner
|
||||||
|
|
||||||
|
# 2. Регистрация Runner
|
||||||
|
sudo gitlab-runner register \
|
||||||
|
--url https://gitlab.com/ \
|
||||||
|
--registration-token YOUR_TOKEN \
|
||||||
|
--executor docker \
|
||||||
|
--docker-image mingc/android-build-box:latest \
|
||||||
|
--tag-list docker,android
|
||||||
|
|
||||||
|
# 3. Запуск
|
||||||
|
sudo gitlab-runner start
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Время сборки (примерно)
|
||||||
|
|
||||||
|
| Job | Время | RAM | CPU |
|
||||||
|
|-----|-------|-----|-----|
|
||||||
|
| TorrentEngine | ~5-10 мин | 1.5GB | 2 cores |
|
||||||
|
| Debug APK | ~15-20 мин | 2GB | 2 cores |
|
||||||
|
| Release APK | ~20-30 мин | 2GB | 2 cores |
|
||||||
|
| Flutter Analyze | ~2-3 мин | 512MB | 1 core |
|
||||||
|
| Android Lint | ~5-8 мин | 1GB | 2 cores |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐳 Docker образы
|
||||||
|
|
||||||
|
### **mingc/android-build-box:latest**
|
||||||
|
|
||||||
|
Включает:
|
||||||
|
- Android SDK (latest)
|
||||||
|
- Flutter SDK
|
||||||
|
- Java 17
|
||||||
|
- Gradle
|
||||||
|
- Git, curl, wget
|
||||||
|
|
||||||
|
Размер: ~8GB
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Кэширование
|
||||||
|
|
||||||
|
Для ускорения сборок используется кэширование:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .gradle/ # Gradle dependencies
|
||||||
|
- .pub-cache/ # Flutter packages
|
||||||
|
- android/.gradle/ # Android build cache
|
||||||
|
- build/ # Flutter build cache
|
||||||
|
```
|
||||||
|
|
||||||
|
**Эффект:**
|
||||||
|
- Первая сборка: ~25 минут
|
||||||
|
- Последующие: ~10-15 минут (с кэшем)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 Логи и отладка
|
||||||
|
|
||||||
|
### **Просмотр логов GitLab:**
|
||||||
|
|
||||||
|
1. Перейти в **CI/CD → Pipelines**
|
||||||
|
2. Выбрать pipeline
|
||||||
|
3. Кликнуть на job для просмотра логов
|
||||||
|
|
||||||
|
### **Отладка локально:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование сборки TorrentEngine
|
||||||
|
cd android
|
||||||
|
./gradlew :torrentengine:assembleRelease \
|
||||||
|
--no-daemon \
|
||||||
|
--parallel \
|
||||||
|
--stacktrace
|
||||||
|
|
||||||
|
# Тестирование Flutter APK
|
||||||
|
flutter build apk --debug --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚨 Troubleshooting
|
||||||
|
|
||||||
|
### **Gradle daemon crashed:**
|
||||||
|
|
||||||
|
**Проблема:** `Gradle build daemon disappeared unexpectedly`
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Увеличить RAM в gradle.properties
|
||||||
|
org.gradle.jvmargs=-Xmx3G
|
||||||
|
|
||||||
|
# Или отключить daemon
|
||||||
|
./gradlew --no-daemon
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Out of memory:**
|
||||||
|
|
||||||
|
**Проблема:** `OutOfMemoryError: Java heap space`
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Увеличить heap в CI
|
||||||
|
GRADLE_OPTS="-Xmx2048m -XX:MaxMetaspaceSize=768m"
|
||||||
|
```
|
||||||
|
|
||||||
|
### **LibTorrent4j native libraries not found:**
|
||||||
|
|
||||||
|
**Проблема:** Нативные библиотеки не найдены
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
- Убедиться что все архитектуры включены в `build.gradle.kts`
|
||||||
|
- Проверить `splits.abi` конфигурацию
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Дополнительные ресурсы
|
||||||
|
|
||||||
|
- [GitLab CI/CD Docs](https://docs.gitlab.com/ee/ci/)
|
||||||
|
- [GitHub Actions Docs](https://docs.github.com/actions)
|
||||||
|
- [Flutter CI/CD Guide](https://docs.flutter.dev/deployment/cd)
|
||||||
|
- [Gradle Performance](https://docs.gradle.org/current/userguide/performance.html)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Следующие шаги
|
||||||
|
|
||||||
|
1. **Настроить GitLab Runner** (если еще не настроен)
|
||||||
|
2. **Запушить изменения** в dev ветку
|
||||||
|
3. **Проверить Pipeline** в GitLab CI/CD
|
||||||
|
4. **Скачать артефакты** после успешной сборки
|
||||||
|
5. **Протестировать APK** на реальном устройстве
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 Поддержка
|
||||||
|
|
||||||
|
При проблемах с CI/CD:
|
||||||
|
1. Проверьте логи pipeline
|
||||||
|
2. Убедитесь что Runner активен
|
||||||
|
3. Проверьте доступность Docker образа
|
||||||
|
4. Создайте issue с логами ошибки
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Создано с ❤️ для NeoMovies Mobile**
|
||||||
@@ -1,3 +1,20 @@
|
|||||||
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
# Gradle JVM settings - optimized for limited RAM
|
||||||
|
org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=1G -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
||||||
|
org.gradle.daemon=true
|
||||||
|
org.gradle.parallel=true
|
||||||
|
org.gradle.caching=true
|
||||||
|
org.gradle.configureondemand=true
|
||||||
|
|
||||||
|
# Android settings
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
|
android.enableR8.fullMode=false
|
||||||
|
|
||||||
|
# Kotlin settings
|
||||||
|
kotlin.daemon.jvmargs=-Xmx1G -XX:MaxMetaspaceSize=512m
|
||||||
|
kotlin.incremental=true
|
||||||
|
kotlin.incremental.usePreciseJavaTracking=true
|
||||||
|
|
||||||
|
# Build optimization
|
||||||
|
android.enableBuildCache=true
|
||||||
|
org.gradle.vfs.watch=false
|
||||||
|
|||||||
Reference in New Issue
Block a user