TravisCIで配布用IPAをアーカイブしDeployGateにアップロードする

概要

TravisCIで配布用にアプリをビルド・IPAの作成を行い、DeployGateにアップロードを設定した時のメモ

手順

1. 必要なファイルを用意

以下の4つのファイルを用意し、プロジェクト内の任意のフォルダ(この記事ではcertificatesフォルダ)を作成し、その中に入れる

  1. Appleの中間証明書(AppleWWDRCA.cer
  2. Distribution証明書の公開鍵(<Distribution>.cer
    • keychainから書き出す
  3. Distribution証明書の秘密鍵<Distribution>.p12
    • keychainから書き出す
    • パスワードはTravis環境変数DISTRIBUTION_PASSWORD)に入れておく
  4. ProvisioningProfile(<AppName>.mobileprovision
.
├── certificates
│  ├── AppleWWDRCA.cer
│  ├── <Distribution>.cer
│  ├── <Distribution>.p12
│  └── <AppName>.mobileprovision
...

2. travisコマンドをインストール

まだインストールしていなければインストールする

gem install travis
travis login --pro
# GitHubのユーザ名・パスワードを入力

3. 証明書一式をtarにまとめる

次に行うtravisの暗号化では、複数ファイルの暗号化が出来ないため(Encrypting Files - Travis CI)一つのファイル(secrets.tar)にまとめる

cd certificates
tar cvf secrets.tar AppleWWDRCA.cer <Distribution>.cer <Distribution>.p12 <AppName>.mobileprovision

4. 証明書一式(tar)を暗号化

travisのコマンドを用いて暗号化を行う(実行するディレクトリで2度コマンドを実行してしまうと前回暗号化を実行したものを復号化できなくなるため(travis encrypt-fileに気をつけろ!2回コマンド叩くと復号に失敗する!? - モヒカンは正義)実行するディレクトリに注意)

# certificates dir で実行する
travis encrypt-file --pro secrets.tar secrets.tar.enc
# 出力される復号用コマンドをメモしておく
# 例:
#   openssl aes-256-cbc -K $encrypted_..._key -iv $encrypted_..._iv -in secrets.tar.enc -out secrets.tar -d

5. 暗号化したファイル以外を.gitignoreに追加

暗号化する前のオリジナルのファイル(secrets.tar)がgitに上がらないように.gitignoreを設定する

.gitignore

certificates/*
!certificates/secrets.tar.enc

6. CIで走らせるスクリプトMakefileに用意

この記事ではMakefileを使っていますが、シェルスクリプトなり .travis.yml に直書きするなり、プロジェクトに合ったものを利用してもらって構いません

Makefile

decription-certificates-for-travis:
  # 手順4でメモした復号用コマンド
  # Makefileで利用する場合環境変数を利用できるように `$` をエスケープする必要有り
  # またプロジェクトルートで実行する場合 `secrets.tar.enc` は `certificates`フォルダ以下にあるためファイルパスも修正する
    openssl aes-256-cbc -K $${encrypted_<hash>_key} -iv $${encrypted_<hash>_iv} -in certificates/secrets.tar.enc -out certificates/secrets.tar -d
    tar xvf certificates/secrets.tar -C certificates

prepare-certificates-for-travis:
    # Create a custom keychain
    security create-keychain -p travis ios-build.keychain
    # Make the custom keychain default, so xcodebuild will use it for signing
    security default-keychain -s ios-build.keychain
    # Unlock the keychain
    security unlock-keychain -p travis ios-build.keychain
    # Set keychain timeout to 1 hour for long builds
    security set-keychain-settings -t 3600 -l ~/Library/Keychains/ios-build.keychain
    #  Add certificates to keychain and allow codesign to access them
    security import certificates/AppleWWDRCA.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign
    security import certificates/dist.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign 
    security import certificates/dist.p12 -k ~/Library/Keychains/ios-build.keychain -P ${DISTRIBUTION_PASSWORD} -T /usr/bin/codesign
    # Set Key partition list
    security set-key-partition-list -S apple-tool:,apple: -s -k travis ios-build.keychain
    # Put the provisioning profile in place 
    mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
    cp certificates/<AppName>.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
    security list-keychains -s ios-build.keychain

clean-certificates-for-travis:
    security delete-keychain ios-build.keychain
    rm -f ~/Library/MobileDevice/Provisioning Profiles/<AppName>.mobileprovision

7. fastlaneでIPA作成+DeployGateアップロードするlaneを定義

IPAを書き出すためにはアーカイブ用の設定ファイルを追加する必要があるのですが、 -めんどくさかった- プロジェクトでfastlaneを利用していたため、fastlaneでIPA作成とDeployGateのアップロード処理をします

fastlane/Fastfile

...

lane :upload-deploygate do
    gym({
        workspace: "<AppName>.xcworkspace",
        scheme: "<SchemeName>",
        configuration: "Release",
        export_method: "enterprise"
    })
    deploygate(
        user: "<UserName>",
        message: "Fastlane build #{lane_context[SharedValues::BUILD_NUMBER]}",
        distribution_key: "<key>"
    )
end

8. Travisのjobを設定

.travis.yml

language: objective-c

stages:
  - name: deploy
    if: branch = master

jobs:
  include:
    - stage: deploy
      name: 'Upload to DeployGate'
      osx_image: xcode10.2
      before_install: make decription-certificates-for-travis
      install: make install
      before_script: make prepare-certificates-for-travis
      script: bundle exec fastlane upload-deploygate
      after_script: make clean-certificates-for-travis

詰まったところ

  • 手順6で $エスケープする必要があるのに気づかず、かなりの時間がかかってしまった…

参考