学生かえるエンジニアのブログ

iOSを主にやる勉強中エンジニア。かえるが好き。ピクルスってかわいいよね。

IPA ファイルを作成して DeployGate へアップロードまでを自動で on TravisCI

個人制作のアプリで、github に push したら、TravisCI で ipa ファイルを作成して DeployGate にアップロードするまでの流れを自動で行うようにしました。

わりと手こずったりしたので、備忘のためにも記事にしておきます。

前提

  • p12 ファイルなどを扱うので全て自己責任で注意して行ってください。
  • 今回は ipa 作成 〜 deploygate へアップロード の流れにフォーカスしているので、その他の詳しい説明 (プロファイルの作成方法、DeployGate・TravisCIの使用方法等) は割愛します。

バージョンや状況

Xcode CI
9.3 TravisCI
  • 記事執筆日時: 2018/04/22
  • Manual signing を使用しています
  • CocoapodsCarthage も使っています
  • 今回自分が試したプロジェクトには TodayExtensionwatchOS系 の target が含まれています

.travis.yml ファイル

細かな手順などは後に書いてます。
便宜上最低限の記述のみにしています。

language: objective-c
osx_image: xcode9.3

script:
  # keychain
  - sudo security import <証明書>.cer -k /Library/Keychains/System.keychain -T /usr/bin/codesign
  - sudo security import <証明書>.p12 -k /Library/Keychains/System.keychain -P <PASSWORD> -T /usr/bin/codesign

  # provisioning profile
  - mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
  - mv <PPFILE_PATH> ~/Library/MobileDevice/Provisioning\ Profiles

  # xcodebuild
  - xcodebuild -workspace <PROJECTNAME>.xcworkspace -scheme <SCHEME_NAME> -configuration <Release> archive -archivePath <ARCHIVE_PATH>
  - xcodebuild -exportArchive -archivePath <ARCHIVE_PATH>.xcarchive -exportPath ./build -exportOptionsPlist <PLIST_PATH>.plist

  # deploygate
  - curl -f -F "token=<API_KEY>" -F "file=@build/<IPA_FILE>.ipa" https://deploygate.com/api/users/<OWNER>/apps

手順

1. cer, p12 ファイルの用意

既に用意できてる場合は大丈夫です。ない場合は下記の3つの手段のいずれかで用意してください。
p12 ファイルを書き出す際にはパスワードを設定しますので、忘れないようにしてください。

用意したファイルを git 管理下に移動してください。

  • Mac の キーチェーンアクセス から書き出す (for cer & p12)

キーチェーンアクセス.app を開いて、該当の証明書を右クリックし、cerとp12ファイルを書き出します。

  • Xcode から書き出す (for p12)

Preferences > Accounts > 該当のアカウント > ManageCertificates > 該当の証明書を右クリック > Export Certificate

  • Apple の Developer サイトからダウンロード (for cer)

こちら にアクセスし、該当の cer ファイルをダウンロードしてください。

コマンドの説明

TravisCI で下記を実行しています。
<証明書><PASSWORD> は書き換えてください。

sudo security import <証明書>.cer -k /Library/Keychains/System.keychain -T /usr/bin/codesign
sudo security import <証明書>.p12 -k /Library/Keychains/System.keychain -P <PASSWORD> -T /usr/bin/codesign

ログの24行目あたりに下記のように記されています。
本来WWDRCA証明書が必要なのですが、TravisCI上の macOS の Keychain には既に登録されています。 なのでこの Keychain を使用しています。

Fix WWDRCA Certificate
Unable to delete certificate matching "<省略>"security: AppleWWDRCA.cer: already in /Library/Keychains/System.keychain

2. ProvisioningProfile を用意

Xcode の signing 設定に指定している Provisioning Profile を用意します。
拡張子は.mobileprovisionです。
複数の target を用いているプロジェクトではその数分 Provisiong Profile も必要です。
既に用意できてる場合は大丈夫ですが、ない場合下記の2つの手段から用意してください。

用意したファイルは git 管理下に移動して下さい。

  • Apple の Developer サイトからダウンロード

ProvisioningProfile はここで作成します。既に作られている場合はダウンロードしてください。

  • Xcode の管理場所から持ち出す

Xcodeでは ~/Library/MobileDevice/Provisioning Profiles の場所で全て管理されています。
この中から該当のファイルをコピーして下さい。

コマンドの説明

-p オプションを付けて ProvisioningProfile を置くべきディレクトリを用意し、ファイルをそこまで移動しましょう。

mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
mv <PPFILE_PATH> ~/Library/MobileDevice/Provisioning\ Profiles

3. xcodebuild で ipa 作成

1行目で archive を作成し、2行目で ipa を作成します。
<> 内はご自分のものに書き換えてください。

xcodebuild -workspace <PROJECTNAME>.xcworkspace -scheme <SCHEME_NAME> -configuration <Release> archive -archivePath <ARCHIVE_PATH>
xcodebuild -exportArchive -archivePath <ARCHIVE_PATH>.xcarchive -exportPath ./build -exportOptionsPlist <PLIST_PATH>.plist

archive 作成

archive 作成コマンドを実行すると拡張子 .xcarchive のファイルが作成されます。
今回私のプロジェクトではcocoapodsを使用していたので workspace オプションで行っていますが、各自でコマンドは調整してください。
<ARCHIVE_PATH> は拡張子を含めず書きます。

ipa 書き出し

ipa ファイル作成時には、オプションを記述した plist ファイルが必要です。
下記に最低限を示しておきますが、詳しくは こちら が参考になります。
Xcode 上で管理すれば編集しやすいと思います。

作成した plist ファイルの場所を <PLIST_PATH> に記述しましょう。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>ad-hoc</string>
    <key>compileBitcode</key>
    <false/>
    <key>provisioningProfiles</key>
    <dict>
        <key>BUNDLE ID をここに</key>
        <string>Provisioning Profile の名前をここに</string>
    </dict>
</dict>
</plist>

4. DeployGate へアップロード

DeployGate の プロフィールページ の下部に API Key があります。
<OWNER> は あなたのユーザ名です。

公式ドキュメント を参考にして下さい。

curl -f -F "token=<API_KEY>" -F "file=@build/<IPA_FILE>.ipa" https://deploygate.com/api/users/<OWNER>/apps

補足

証明書などの扱い

.p12cer などの扱いは各自で注意してください。
特に.p12秘密鍵を含んでいるので注意してください。

TravisCI でのファイルの暗号化は 公式の説明 を参考にしてください。

パスワードの扱い

パスワードや API Key を .travis.yml にべた書きするのは避けるべきです。

https://travis-ci.com/<UserName>/<ProjectName>/settingsEnvironment Variables を使用する、travis encrypt コマンドを利用する、などなんらか別の安全な方法で行うべきです。

ライブラリ管理

carthagecocoapods を使用している場合は当然ながら install コマンド等を .travis.yml に書いてください。
キャッシュの設定などもするといいと思います。

その他

  • 私は xcpretty を使用していますが今回は省略して記述しています。
  • 当然 Provisioning Profile には実行したい端末の UDID が含まれてないといけません。

参考

後記

人によって環境が結構異なるでしょうし、詳しくなければ xcodebuild の認証周りで手こずる可能性が高いなど、一筋縄ではいかないことが多いと思います。
他のサイトなども参考にしながら、沢山試行錯誤しながら、頑張ってください。

間違いや感想、質問等、お気軽コメントどうぞ!