name: Eatvio App Android Test on: pull_request: branches: - main env: flutter_version: '3.41.2' java_version: '21.x' flutter_channel: 'stable' my_local_cache_dir: '/opt/hostedtoolcache/' ANDROID_SDK_ROOT: '/opt/hostedtoolcache/Android/Sdk' jobs: build: runs-on: [ubuntu-latest] steps: - uses: https://github.com/actions/checkout@v3 # Пока что не нужно проксирование # - name: Set proxy server # env: # PROXY_USER: ${{ secrets.PROXY_USER }} # PROXY_PASSWORD: ${{ secrets.PROXY_PASSWORD }} # run: | # echo "Setting up proxy..." # cat </etc/apt/apt.conf.d/proxy.conf # Acquire::http::Proxy "socks5h://${PROXY_USER}:${PROXY_PASSWORD}@10.55.5.202:19843/"; # EOF - name: Checkout env repository uses: https://github.com/actions/checkout@v3 with: repository: eatvio/eatvio_app_env path: env_repo # Здесь может быть токен любого юзера с доступом в gitea token: ${{ vars.READ_USER_GITEA_TOKEN }} ref: main - name: Copy .env file run: | cp env_repo/.env .env - name: Load environment variables from .env run: | set -a source .env set +a # Export all variables to GITHUB_ENV while IFS= read -r line; do if [[ $line =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then echo "$line" >> $GITHUB_ENV fi done < .env - name: Create key.properties file run: | cat > android/key.properties < android/app/upload-keystore.jks - name: Cache Android SDK id: cache-sdk uses: 'https://github.com/actions/cache@v4' with: path: ${{ env.my_local_cache_dir }} key: ${{ runner.os }}-cache-sdk - name: Set up JDK uses: https://github.com/actions/setup-java@v3 with: distribution: 'zulu' java-version: ${{ env.java_version }} cache: gradle - name: Install utils for Android SDK run: | apt-get update apt-get install -y openjdk-17-jdk wget jq clang cmake ninja-build libgtk-3-dev - name: Install Android SDK if: steps.cache-sdk.outputs.cache-hit != 'true' run: | wget https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip -O commandlinetools.zip unzip commandlinetools.zip mkdir -p ${{ env.my_local_cache_dir }}Android/Sdk/cmdline-tools/latest rm -rf ${{ env.my_local_cache_dir }}Android/Sdk/cmdline-tools/latest mkdir -p ${{ env.my_local_cache_dir }}Android/Sdk/cmdline-tools/latest mv cmdline-tools/* ${{ env.my_local_cache_dir }}Android/Sdk/cmdline-tools/latest/ export ANDROID_SDK_ROOT=${{ env.my_local_cache_dir }}Android/Sdk export PATH=$PATH:${{ env.my_local_cache_dir }}Android/Sdk/cmdline-tools/latest/bin yes | sdkmanager --licenses 2>/dev/null || true sdkmanager --list | egrep "platform-tools|build-tools|ndk" sdkmanager "platform-tools" sdkmanager "platform-tools" "platforms;android-35" "platforms;android-34" "platforms;android-33" "platforms;android-31" sdkmanager "build-tools;34.0.0" sdkmanager "ndk;25.1.8937393" sdkmanager --install "cmake;3.22.1" - name: Set up Android environment variables id: 'android-env-setup' run: | echo "ANDROID_SDK_ROOT=${{ env.my_local_cache_dir }}Android/Sdk" >> $GITHUB_ENV echo "PATH=$PATH:${{ env.my_local_cache_dir }}Android/Sdk/cmdline-tools/latest/bin:${{ env.my_local_cache_dir }}Android/Sdk/platform-tools:${{ env.my_local_cache_dir }}Android/Sdk/build-tools/30.0.3:${{ env.my_local_cache_dir }}Android/Sdk/build-tools/34.0.0" >> $GITHUB_ENV echo "ANDROID_HOME=${{ env.my_local_cache_dir }}Android/Sdk" >> $GITHUB_ENV - name: Set up Flutter run: | FLUTTER_DIR="${{ env.my_local_cache_dir }}flutter" if [ ! -f "$FLUTTER_DIR/bin/flutter" ]; then echo "Downloading Flutter ${{ env.flutter_version }}..." curl -fsSL -o /tmp/flutter.tar.xz "https://storage.googleapis.com/flutter_infra_release/releases/${{ env.flutter_channel }}/linux/flutter_linux_${{ env.flutter_version }}-${{ env.flutter_channel }}.tar.xz" echo "Extracting Flutter..." mkdir -p "${{ env.my_local_cache_dir }}" tar xf /tmp/flutter.tar.xz -C "${{ env.my_local_cache_dir }}" rm /tmp/flutter.tar.xz else echo "Flutter already cached at $FLUTTER_DIR" fi echo "$FLUTTER_DIR/bin" >> $GITHUB_PATH echo "$FLUTTER_DIR/bin/cache/dart-sdk/bin" >> $GITHUB_PATH echo "$HOME/.pub-cache/bin" >> $GITHUB_PATH # - name: Print flutter-action outputs # shell: bash # run: | # echo CACHE-PATH=${{ steps.flutter-action.outputs.CACHE-PATH }} # echo CACHE-KEY=${{ steps.flutter-action.outputs.CACHE-KEY }} # echo CHANNEL=${{ steps.flutter-action.outputs.CHANNEL }} # echo VERSION=${{ steps.flutter-action.outputs.VERSION }} # echo ARCHITECTURE=${{ steps.flutter-action.outputs.ARCHITECTURE }} # echo PUB-CACHE-PATH=${{ steps.flutter-action.outputs.PUB-CACHE-PATH }} # echo PUB-CACHE-KEY=${{ steps.flutter-action.outputs.PUB-CACHE-KEY }} # echo "PATH is $PATH" # echo "ANDROID_SDK_ROOT is $ANDROID_SDK_ROOT" # echo "ANDROID_HOME is $ANDROID_HOME" - name: Fix dir permissions run: | ARCH=$(uname -m) if [ "$ARCH" = "x86_64" ]; then ARCH="x64"; fi git config --global --add safe.directory "${{ env.my_local_cache_dir }}flutter" flutter config --android-sdk="$ANDROID_HOME" flutter doctor -v - name: Get dependencies run: | flutter clean flutter pub cache repair flutter pub get dart run build_runner build --delete-conflicting-outputs - name: Native Analyze run: flutter analyze - name: Test run: flutter test --coverage # - name: Test coverage # run: | # echo "📊 Analyzing test coverage..." # echo "" # awk -F: ' # /^SF:/ { # file = $0 # sub(/^SF:/, "", file) # sub(/^[[:space:]]+/, "", file) # is_generated = 0 # if (file ~ /\.(g|freezed|gr|mocks)\.dart$/) { # is_generated = 1 # generated_files++ # } else if (file ~ /\/(build|\.dart_tool)\//) { # is_generated = 1 # generated_files++ # } else { # source_files++ # } # } # /^LF:/ { # if (!is_generated) { # total += $2 # } else { # generated_lines += $2 # } # } # /^LH:/ { # if (!is_generated) { # covered += $2 # } else { # generated_covered += $2 # } # } # END { # print "📁 Files:" # printf " Source files: %d\n", source_files # printf " Generated files: %d (excluded)\n", generated_files # print "" # print "📝 Lines:" # printf " Total lines: %d\n", total # printf " Covered lines: %d\n", covered # printf " Uncovered lines: %d\n", total - covered # print "" # if (total == 0) { # print "⚠️ Coverage: 0%" # exit 1 # } else { # percentage = (covered / total) * 100 # printf "✅ Coverage: %.2f%%\n", percentage # print "" # if (percentage < 70) { # printf "❌ FAIL: Coverage is below 70%%\n" # exit 1 # } else { # printf "💚 Excellent: Coverage is above 70%%\n" # } # } # } # ' coverage/lcov.info - name: Build apk run: | BUILD_DATE=$(TZ=Europe/Moscow date +'%Y-%m-%d %H:%M:%S') flutter build apk --release \ --dart-define=HIDE_PLANS=false \ --dart-define=BUILD_DATE="$BUILD_DATE" - name: Rename and move apk run: | TIMESTAMP=$(TZ=Europe/Moscow date +'%Y-%m-%d-%H-%M') APK_NAME="eatvio_app_${TIMESTAMP}.apk" mv build/app/outputs/flutter-apk/app-release.apk $APK_NAME echo "APK build finished $APK_NAME" echo "APK_NAME=$APK_NAME" >> $GITHUB_ENV - name: Upload APK artifact uses: https://github.com/actions/upload-artifact@v3 with: name: ${{ env.APK_NAME }} path: ${{ env.APK_NAME }}