TravisCIで配布用IPAをアーカイブしDeployGateにアップロードする
概要
TravisCIで配布用にアプリをビルド・IPAの作成を行い、DeployGateにアップロードを設定した時のメモ
手順
1. 必要なファイルを用意
以下の4つのファイルを用意し、プロジェクト内の任意のフォルダ(この記事ではcertificatesフォルダ)を作成し、その中に入れる
- Appleの中間証明書(
AppleWWDRCA.cer)- このリンクからダウンロード
- Distribution証明書の公開鍵(
<Distribution>.cer)- keychainから書き出す
- Distribution証明書の秘密鍵(
<Distribution>.p12) - 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で
$をエスケープする必要があるのに気づかず、かなりの時間がかかってしまった…