この記事はWHITEPLUS Advent Calendar 2016 5日目になります。
株式会社ホワイトプラス、エンジニアの @akaimo です。
ホワイトプラスでは主にリネットのiOSアプリを担当しています。
iOSアプリのリリースや配布は手間がかかる
iOSアプリをリリースしたり、開発版を配布しようと思うと、各開発者のMacに証明書をインストールしなければいけません。
しかし、Appleの証明書は複雑なため、なかなかスムーズにいきません。
また、アップロードできる人を絞ってしまうと、負荷の集中、不在時にどうするかなどの問題も発生します。
そこでホワイトプラスでは、Travis CIを利用してリリース・配布のフローを自動化しています。
CI環境を作ってしまえば、つい忘れていつの間にかテストが通らなくなっている、なんてことも防げ品質を高く保つこともできます。
利用するサービス
- GitHub
- Travis CI
- HockeyApp
- TestFlight (iTunes Connect)
- Slack
Travis CIの環境
- MacOS Sierra
- Xcode8.1
- Swift3.0
ゴール
GitHubへのPushを起点にTravisでテストが実行され、
リリースブランチの場合はiTunes Connectへアップロード、
デベロップブランチの場合はHockeyAppへアップロードし、
最後にSlackへ結果を通知します。
ローカルでの準備
前提条件
開発で使用しているMacのXcodeからiTunes Connectへアップロードできることを前提に進めます。
証明書の作成などは事前に行っておいてください。
証明書の書き出し
アプリをリリースするために、
- リリース用の証明書と秘密鍵
- リリース用のProvisioning Profile
- 開発者向けの中間証明書 (WWDR Intermediate Certificate)
を用意します。
リリース用と配布用で異なる場合は配布用も必要です。
証明書はキーチェーンから.p12
を書き出します。
証明書の配置
今回はリポジトリ内のcertsの下に配置してGitHubにpushします。
そのままアップロードするのは危険なので暗号化します。
証明書の暗号化
暗号化にはopenssl
コマンドを使います。
$ openssl aes-256-cbc -a -k "password" -in certs/Distribution.mobileprovision -out certs/Distribution.mobileprovision.enc
$ openssl aes-256-cbc -a -k "password" -in certs/Distribution.p12 -out certs/Distribution.p12.enc
復号パスワードをtravisの環境変数に追加する
このパスワードも直接書いてしまうと危険なので暗号化します。
Travis CI Clientを使うと環境変数に暗号化された状態で追加することができます。
Travis CI Clientのインストール
Travis CI Clientはgemでインストールすることができます。
$ gem install travis
インストールが完了したらログインします。
$ travis login
これでtravis
コマンドを使用する準備ができました。
復号パスワードを暗号化して.travis.ymlに追加する
復号パスワードを暗号化して環境変数として追加します。
$ travis encrypt DECORD_CERTS=password --add
これで、.travis.yml
のenv:global:
に暗号化されたパスワードが追加されています。
Travis CIでは DECORD_CERTS
でこのパスワードにアクセスできます。
ここでエラーになる場合は対象のディレクトリ内で、
$ travis login --pro
を実行してログインし直せばできると思います。
証明書のインストールに必要なパスワードの暗号化
同様に証明書のインストールに必要なパスワードも暗号化して環境変数として追加します。
$ travis encrypt CERT_PASS=password --add
以上でローカルでの準備は完了です。
Travis上での準備
ここからは、Travis CI上で実行するスクリプトになります。
Travis CIでビルドやアップロードをするための環境構築です。
この処理はシェルスクリプトとして用意しておくことをオススメします。
証明書のインストール
先ほどリポジトリに追加した証明書をインストールしていきます。
Travis上にキーチェーンに作成
security create-keychain -p travis travis.keychain
security default-keychain -s travis.keychain
security unlock-keychain -p travis travis.keychain
security set-keychain-settings -t 3600 -l ~/Library/Keychains/travis.keychain
証明書・Provisioning Profileの復号
openssl aes-256-cbc -a -d -k $DECORD_CERTS -in certs/Distribution.mobileprovision.enc -out certs/Distribution.mobileprovision
openssl aes-256-cbc -a -d -k $DECORD_CERTS -in certs/Distribution.p12.enc -out certs/Distribution.p12
証明書のインストール・Provisioning Profileの配置
security import ./certs/apple.cer -k ~/Library/Keychains/travis.keychain -T /usr/bin/codesign
security import ./certs/Distribution.p12 -k ~/Library/Keychains/travis.keychain -P $CERT_PASS -T /usr/bin/codesign
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp "./certs/Distribution.mobileprovision" ~/Library/MobileDevice/Provisioning\ Profiles/
キーチェーンへのアクセスを 許可
Sierraでキーチェーンに仕様変更が入り、このままだとパーミッションの確認がでてハングしてしまいます。
パーミッションを許可するために以下を追加します。
security set-key-partition-list -S apple-tool:,apple: -s -k travis travis.keychain
ここまでの処理をまとめて1つのスクリプトにしたものをTravis CIで実行すれば、ビルド・アップロードするための準備が整います。
終わりに
以上でTravis CI上でテスト・配布する環境は整いました。
続きのテスト・アップロード編は12月14日に公開予定です。
明日は弊社デザイナー @UomoriAtsushi の「デザイナーがレシピ投稿サイトに投稿してみたら」です。
#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、新しい技術にどんどん挑戦したい!という技術で事業に貢献したいエンジニアを募集しております。