Как сократить время сборки приложения Flutter для iOS с помощью Fastlane

Моя проблема заключается в том, что при использовании Firebase (в частности, cloud_firestore) время сборки приложения Flutter для iOS становится настолько долгим, что моя сборка CI на Bitrise достигает тайм-аута (28 минут для flutter build --release и снова более 20 минут для build_ios_app Fastlane). Поэтому я не могу выполнить полную сборку iOS на своем CI. Кеширование, конечно, возможно, но сначала нужно сделать первоначальную сборку :/

Согласно этому руководству, при архивировании с помощью Xcode с использованием Fastlane необходимо перестроить приложение iOS. Однако существует официальное репозиторий Github о введении команды опубликовать файл IPA напрямую из Flutter, но пока это невозможно.

Мой вопрос: есть ли способы сократить время сборки, например. пропустив сборку на этапе fastlane и просто отменив подписку и архивировав файл .app в .ipa? Я не мог заставить его работать сам.

Здесь вы можете найти образец приложения Flutter с включенным cloud_firestore.

Ниже вы можете найти мою конфигурацию Bitrise и fastlane:

---
format_version: '7'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
project_type: flutter
trigger_map:
- push_branch: master
workflow: test
workflows:
prepare:
    steps:
    - [email protected]:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    - [email protected]:
        title: APP_NAME
        inputs:
        - destination_keys: APP_NAME
        - value: pl.flutter.buildTimeIssue
    - [email protected]:
        title: FL_BUILD_NUMBER
        inputs:
        - destination_keys: FL_BUILD_NUMBER
        - value: "$BITRISE_BUILD_NUMBER"
    - [email protected]:
        title: FL_VERSION_NUMBER
        inputs:
        - destination_keys: FL_VERSION_NUMBER
        - value: 0.1.$BITRISE_BUILD_NUMBER
    - [email protected]: {}
    - cache-pull: {}
    - [email protected]: {}
    - flutter-installer:
        inputs:
        - version: v1.2.1
    - [email protected]:
        inputs:
        - content: |-
            #!/usr/bin/env bash
            # fail if any commands fails
            set -e
            # debug log
            set -x

            cd $BITRISE_FLUTTER_PROJECT_LOCATION/ios
            pod repo update
        title: Update pods repository
test:
    before_run:
    - prepare
    steps:
    - [email protected]:
        inputs:
        - project_location: "$BITRISE_FLUTTER_PROJECT_LOCATION"
        - ios_additional_params: "--release --no-codesign -t lib/main.dart
            --build-name=$FL_VERSION_NUMBER --build-number=$FL_BUILD_NUMBER"
        is_always_run: true
    - [email protected]:
        title: fastlane iOS
        inputs:
        - work_dir: "$BITRISE_FLUTTER_PROJECT_LOCATION/ios"
        - lane: ios test
    after_run:
    - finish
    envs:
    - opts:
        is_expand: false
    FLAVOR: tst
    - opts:
        is_expand: false
    TARGET_FILE: main_tst
finish:
    steps:
    - [email protected]:
        inputs:
        - ignore_check_on_paths: "~/Library/Developer/Xcode/DerivedData"
        - cache_paths: |-
            $BITRISE_FLUTTER_PROJECT_LOCATION/build
            $BITRISE_FLUTTER_PROJECT_LOCATION/ios/Pods
            ~/Library/Developer/Xcode/DerivedData
app:
envs:
- opts:
    is_expand: false
    BITRISE_FLUTTER_PROJECT_LOCATION: ./
- opts:
    is_expand: false
    BITRISE_PROJECT_PATH: ./ios/Runner.xcworkspace
- opts:
    is_expand: false
    BITRISE_SCHEME: tst
- opts:
    is_expand: false
    BITRISE_EXPORT_METHOD: ad-hoc

А вот и быстрая полоса:

default_platform(:ios)

platform :ios do
  lane :test do
    match(
      type: "adhoc",
      force_for_new_devices: true,
    )
    automatic_code_signing(
      use_automatic_signing: false
    )
    update_project_provisioning(
      profile: ENV["sigh_pl.flutter.buildTimeIssue_adhoc_profile-path"],
      build_configuration: "Release",
      code_signing_identity: "iPhone Distribution"
    )
    build_app(
      scheme: "tst",
      configuration: "Release",
      xcargs: "-allowProvisioningUpdates",
      export_options: {
        signingStyle: "manual",
        method: "ad-hoc",
        provisioningProfiles: {
          "pl.flutter.buildTimeIssue": "match AdHoc pl.flutter.buildTimeIssue"
        }
      },
      output_name: "Runner.ipa"
    )
    appcenter_upload(
      app_name: "Name",
      owner_name: "Owner",
      group: "All-users-of-Name",
      ipa: "Runner.ipa"
    )
  end
end

person Dominik Roszkowski    schedule 11.05.2019    source источник
comment
Есть ли способ сделать полную сборку вне Bitrise? Это значительно облегчило бы кому-то работу с вашим репозиторием примеров (удивительно, что в ваших вопросах он уже есть!) и попытаться воссоздать то, что вы испытываете. (Например, Fastlane может выполнять любые команды оболочки с действием sh, может быть, это позволяет добавить полосу full_run к вашему Fastfile, которая делает все это локально?)   -  person janpio    schedule 11.05.2019
comment
На самом деле вы можете построить это даже на своей машине. Причина, по которой я упоминаю Bitrise, заключается в том, что он каждый раз создает чистую виртуальную машину, поэтому без извлечения кеша требуется полная сборка. Другими словами, вы можете просто запустить flutter build ios --release, а затем fastlane run build_ios_app. Если бы можно было пропустить все Compiling задачи в сборке fastlane/Xcode, это было бы решением моей проблемы.   -  person Dominik Roszkowski    schedule 11.05.2019


Ответы (1)


У меня была та же проблема, которую я исправил с предварительно скомпилированными двоичными файлами платформы Cloud Firestore из https://github.com/invertase/firestore-ios-sdk-frameworks следующим образом:

# ...
target 'Runner' do
  pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.26.0'

# ...
end

Полные инструкции можно найти здесь https://github.com/FirebaseExtended/flutterfire/issues/2751< /а>

person rozd    schedule 18.08.2020