Help us understand the problem. What is going on with this article?

【iOS】match使わずにCircleCI2.0+FastlaneでFabric配布

More than 1 year has passed since last update.

概要

CircleCI2.0+Fastlaneでは証明書はmatchを使うのがデフォルトになっているらしい。
matchだとプライベートなリポジトリに証明書など一式アップしないといけないので、
今回はmatchは使わずにデプロイできるようにする。

:wrench: セットアップ

  • CircleCIでプロジェクトの設定をする

    「ADD PROJECTS」>「対象のプロジェクト」>「Set Up Project」を選択
    image.png (126.1 kB)
    Operating SystemはmacOSでLaunguageはSwiftを選択し、Start buildingで設定します。

  • ローカルでFastlane初期化

    Gemfile
    source "https://rubygems.org"
    
    gem 'fastlane'
    gem 'cocoapods'
    
    $ bundle exec fastlane init
    

:pencil: 設定ファイル

最終的な設定ファイルを載せて解説しています。

circleci/config.yml
references:
  defaults: &defaults
    macos:
      xcode: "X.X.X"
    working_directory: ~/project
    shell: /bin/bash --login -eo pipefail
    environment:
      TZ: "/usr/share/zoneinfo/Asia/Tokyo"
      LANG: en_US.UTF-8
      LC_ALL: en_US.UTF-8

version: 2
jobs:
  build:
    <<: *defaults
    branches:
      only:
        - develop
    environment:
      FASTLANE_LANE: crashlytics_stg
    steps:
      - checkout:
          path: ~/project
      - run:
          name: Set Ruby Version
          command:  echo "ruby-2.4" > ~/.ruby-version
      - run:
          name: Decode certificates
          command: base64 -D -o XXXXXX.p12 <<< $CERTIFICATES
      - run:
          name: Make Provisioning Profiles directory
          command: mkdir -pv ~/Library/MobileDevice/Provisioning\ Profiles/
      - run:
          name: Decode Provisioning Profiles
          command: base64 -D -o ~/Library/MobileDevice/Provisioning\ Profiles/xxxxxx.mobileprovision <<< $PROVISIONING_PROFILES


      - restore_cache:
          key: v1-gems-{{ checksum "Gemfile.lock" }}
          path: vendor/bundle
      - run:
          name: Bundle install
          command: bundle check || bundle install
          environment:
            BUNDLE_JOBS: 4
            BUNDLE_RETRY: 3
      - save_cache:
          key: v1-gems-{{ checksum "Gemfile.lock" }}
          paths: vendor/bundle
      - restore_cache:
          keys:
          - v1-pods-{{ checksum "Podfile.lock" }}
          path: Pods
      - run:
          name: Running pod install
          command: bundle exec fastlane ios setup
          environment:
            BUNDLE_JOBS: 4
            BUNDLE_RETRY: 3
      - save_cache:
          key: v1-pods-{{ checksum "Podfile.lock" }}
          paths: Pods
      - run:
          name: Fastlane
          command: bundle exec fastlane ios $FASTLANE_LANE

事前にcircleci側に以下環境変数を設定しておきます。

$CERTIFICATES
$PROVISIONING_PROFILES

設定値としては証明書とProvisioning Profileを一旦base64にエンコードした物を設定します。

$ base64 -i xxxxx.p12 | pbcopy # CERTIFICATES に設定
$ base64 -i xxxxx. mobileprovision | pbcopy # PROVISIONING_PROFILES に設定
Fastfile
default_platform(:ios)

platform :ios do

  before_all do
    ENV["SLACK_URL"] = 'xxxxxxxxx'
    ENV["CRASHLYTICS_API_TOKEN"] = xxxxxxxx'
    ENV["CRASHLYTICS_BUILD_SECRET"] = 'xxxxxxxxxx'
    ENV["FL_OUTPUT_DIR"] = 'temp'

    clear_derived_data(derived_data_path: "./DerivedData")
    sh "rm -rf ../build"
  end

  desc "Runs setup"
  lane :setup do
    unless File.exist?("../Pods/Manifest.lock") && FileUtils.cmp("../Podfile.lock", "../Pods/Manifest.lock") then
      cocoapods(verbose: true)
    end
  end

  desc "Runs build to stging"
  lane :build_stg do

    if is_ci?
      setup_circle_ci
      import_certificate(
        keychain_name: ENV["MATCH_KEYCHAIN_NAME"],
        keychain_password: ENV["MATCH_KEYCHAIN_PASSWORD"],
        certificate_path: 'xxxxxxx.p12',
        certificate_password: ''
      )
    end

    update_app_identifier(
      xcodeproj: "Xxxxx.xcodeproj",
      plist_path: "Xxxxx/Info.plist",
      app_identifier: 'com.xxxx.xxxx'
    )

    gym(
      scheme: 'Xxxx',
      configuration: 'Debug',
      derived_data_path: "./DerivedData",
      export_method: "ad-hoc",
      clean: true,
      verbose: true,
      output_directory: "build",
      output_name: 'Xxxxx,
      xcargs: "OTHER_SWIFT_FLAGS='$(inherited) -DSTGING' PROVISIONING_PROFILE_SPECIFIER='com.xxxx.xxxx AdHoc' CODE_SIGN_IDENTITY='iPhone Distribution'",
      export_xcargs: "-allowProvisioningUpdates",
      export_options: {
        provisioningProfiles: {
          'com.xxxx.xxxx' => 'com.xxxx.xxxx AdHoc'
        }
      }
    )
  end

  lane :crashlytics_stg do
    build_stg
    crashlytics(
      crashlytics_path: './Pods/Crashlytics/iOS/Crashlytics.framework',
      api_token: ENV['CRASHLYTICS_API_TOKEN'],
      build_secret: ENV['CRASHLYTICS_BUILD_SECRET'],
      ipa_path: './build/Xxxxx.ipa',
      notifications: true,
      notes: "Fastlaneによる自動デプロイ",
      groups: "xxxxx"
    )
    if is_ci?
      slack(
        message: "Successfully deployed new App Update."
      )
    end
  end

  error do |lane, exception|
    if is_ci?
      slack(
        message: exception.message,
        success: false
      )
    else
      puts exception.message
    end
  end
end

ポイントとしては、build_stgの先頭で

    setup_circle_ci
    import_certificate(
      keychain_name: ENV["MATCH_KEYCHAIN_NAME"],
      keychain_password: ENV["MATCH_KEYCHAIN_PASSWORD"],
      certificate_path: 'xxxxxxx.p12',
      certificate_password: ''
    )

と書く事で一時的なKeychainをCircleCI上に作成し、デコードした
証明書とプロビジョニングプロファイルを設定しています。

:bomb: バッドノウハウ

  • Error computing cache key
Error computing cache key: template: cacheKey:1:19: executing "cacheKey"

チェックサム化するファイルのパスが間違っていた為...
https://qiita.com/sawadashota/items/d1382b1e1b9a5595ab66

[19:03:54]: ▸ === BUILD TARGET FAPanels OF PROJECT Pods WITH CONFIGURATION Release ===
[19:03:54]: ▸ Check dependencies
[19:03:54]: ▸ Code Signing Error: FAPanels does not support provisioning profiles. FAPanels does not support provisioning profiles, but provisioning profile NO_SIGNING/ has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor.
[19:03:54]: 
[19:03:54]: ⬆️  Check out the few lines of raw `xcodebuild` output above for potential hints on how to solve this error
[19:03:54]: 📋  For the complete and more detailed error log, check the full log at:
[19:03:54]: 📋  /Users/distiller/Library/Logs/gym/XXXX.log
[19:03:54]: 
[19:03:54]: Looks like fastlane ran into a build/archive error with your project
[19:03:54]: It's hard to tell what's causing the error, so we wrote some guides on how
[19:03:54]: to troubleshoot build and signing issues: https://docs.fastlane.tools/codesigning/getting-started/
[19:03:54]: Before submitting an issue on GitHub, please follow the guide above and make
[19:03:54]: sure your project is set up correctly.
[19:03:54]: fastlane uses `xcodebuild` commands to generate your binary, you can see the
[19:03:54]: the full commands printed out in yellow in the above log.
[19:03:54]: Make sure to inspect the output above, as usually you'll find more error information there

PROVISIONING_PROFILE_SPECIFIERを設定してやる事でうまく行きました
参考URL

:link: 関連リンク

Slowhand0309
Android, iOS, Rails, C/C++, Typescript
sikmi
しくみ製作所株式会社は、世の中の「しくみ」を素敵にするためのソフトウェア開発集団です。オフィスのない弊社は、メンバー全員リモートワークです!
https://sikmi.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away