okaryo.log

FlutterのiOSアプリをFirebaseAppDistributionにアップロードするワークフローをCircleCIで構築する(非AutoSigning) | okaryo.log

FlutterのiOSアプリをFirebaseAppDistributionにアップロードするワークフローをCircleCIで構築する(非AutoSigning)

    #Flutter#Firebase#AppDistribution#CircleCI#CI/CD

はじめに

先日、FlutterのiOSアプリをFirebaseAppDistributionにアップロードするワークフローをGitHubActionsで構築した。

https://blog.okaryo.io/20240911-flutter-iosfirebase-app-distribution-github-actions-not-auto-signing

しかし、実行マシンはmacosで無料枠でモリモリ減っていってしまう。セルフホステッドランナーで実行するようにすることでこれを回避しようと思っているが、ひとまずCircleCI上で実行することで一時凌ぎすることにした。

組んだワークフロー

最終的なワークフローは以下のようになった。このワークフローは用済みになったら削除する予定の一時的なものなので処理はベタ書きで整理はしていないのでご了承いただきたい。

version: 2.1

orbs:
  flutter: circleci/flutter@2
  firebase-app-distribution: nnsnodnb/firebase-app-distribution@0

executors:
  macos-executor:
    macos:
      xcode: 15.4.0
    resource_class: macos.m1.medium.gen1

jobs:
  ios_deploy_app_distribution:
    executor: macos-executor
    parameters:
      firebase_app_id:
        type: string
      app_distribution_service_account:
        type: string
      ios_bundle_id:
        type: string
      ios_provisioning_profile_name:
        type: string
      ios_adhoc_provision_profile_base64:
        type: string
      runner_keychain_password:
        type: string
    steps:
      - checkout
      - flutter/install_sdk_and_pub:
          version: 3.19.5
      - run:
          name: Update cocoapods
          command: gem update cocoapods
      - flutter/install_ios_pod
      - run:
          name: Install Apple certificate and provisioning profile
          environment:
            IOS_ADHOC_PROVISION_PROFILE_BASE64: $IOS_ADHOC_PROVISION_PROFILE_BASE64
            RUNNER_KEYCHAIN_PASSWORD: $RUNNER_KEYCHAIN_PASSWORD
          command: |
            CERTIFICATE_PATH=$CIRCLE_WORKING_DIRECTORY/build_certificate.p12
            PP_PATH=$CIRCLE_WORKING_DIRECTORY/build_pp.mobileprovision
            KEYCHAIN_PATH=$CIRCLE_WORKING_DIRECTORY/app-signing.keychain-db
            
            mkdir -p $(dirname "$CERTIFICATE_PATH")
            mkdir -p $(dirname "$PP_PATH")

            echo -n "$IOS_CERTIFICATE_P12_BASE64" | base64 --decode -o $CERTIFICATE_PATH
            echo -n << parameters.ios_adhoc_provision_profile_base64 >> | base64 --decode -o $PP_PATH

            security create-keychain -p << parameters.runner_keychain_password >> $KEYCHAIN_PATH
            security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
            security unlock-keychain -p << parameters.runner_keychain_password >> $KEYCHAIN_PATH

            security import $CERTIFICATE_PATH -P "$IOS_P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
            security set-key-partition-list -S apple-tool:,apple: -k << parameters.runner_keychain_password >> $KEYCHAIN_PATH
            security list-keychain -d user -s $KEYCHAIN_PATH

            mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
            cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
      - run:
          name: Generate ExportOptions.plist
          command: |
            export EXPORT_METHOD=release-testing
            export EXPORT_DESTINATION=export
            export BUNDLE_ID=<< parameters.ios_bundle_id >>
            export PROVISIONING_PROFILE=<< parameters.ios_provisioning_profile_name >>
            envsubst < ios/Runner/ExportOptions-Template.plist > ios/Runner/ExportOptions.plist
      - run:
          name: Install Rosetta 2
          command: sudo softwareupdate --install-rosetta --agree-to-license
      - run:
          name: Build ipa
          command: |
            flutter build ipa --release \
              --flavor << parameters.environment >> \
              --export-options-plist=ios/Runner/ExportOptions.plist
      - run:
          name: Set up Firebase App Distribution Service Credentials
          command: echo << parameters.app_distribution_service_account >> > /tmp/firebase-app-distribution-service-credentials.json
      - firebase-app-distribution/deploy:
          app: << parameters.firebase_app_id >>
          binary_path: build/ios/ipa/app-<< parameters.environment >>-release.ipa
          groups: ios_testers
          release_note: << pipeline.git.revision >>
          service_credentials_file: /tmp/firebase-app-distribution-service-credentials.json

workflows:
  ios_deploy_app_distribution:
    jobs:
      - ios_deploy_app_distribution:
          firebase_app_id: $FIREBASE_IOS_APP_ID
          app_distribution_service_account: $APP_DISTRIBUTION_SERVICE_ACCOUNT_JSON
          ios_bundle_id: $IOS_BUNDLE_ID
          ios_provisioning_profile_name: $IOS_PROVISIONING_PROFILE_NAME
          ios_adhoc_provision_profile_base64: $IOS_ADHOC_PROVISION_PROFILE_BASE64
          runner_keychain_password: $RUNNER_KEYCHAIN_PASSWORD
          filters:
            branches:
              only: develop

各ステップの説明はGitHubActionsで組んだときと大きく変わっていないので割愛する。

https://blog.okaryo.io/20240911-flutter-iosfirebase-app-distribution-github-actions-not-auto-signing

また、CircleCIでもFlutterのOrbが公開されているようで、ワークフローの構築がしやすかった。このOrbで使えるジョブやコマンドはいくつかあるので必要に応じて確認していただきたい。

おわり

GitHubActionsのワークフローをコピペするだけではもちろん動かすことができず、CircleCI独自の仕組みや構文を押さえる必要があったので書き捨てのワークフローにしては時間がかかってしまった。

早くセルフホステッドランナーの環境を構築してmacosでのビルド時間に対する不安から解放されたい。


関連記事
最新記事
プロモーション

This site uses Google Analytics.