Travis CIでつくるiOSのCI環境（準備編）

この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2016/whiteplus "")  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

# ゴール
![travis.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83719/7ce9c127-39e1-3ddf-a051-903d074717dc.jpeg)

GitHubへのPushを起点にTravisでテストが実行され、
リリースブランチの場合はiTunes Connectへアップロード、
デベロップブランチの場合はHockeyAppへアップロードし、
最後にSlackへ結果を通知します。

# ローカルでの準備
##  前提条件
開発で使用しているMacのXcodeからiTunes Connectへアップロードできることを前提に進めます。
証明書の作成などは事前に行っておいてください。

## 証明書の書き出し
アプリをリリースするために、

- リリース用の証明書と秘密鍵
- リリース用のProvisioning Profile
- [開発者向けの中間証明書 (WWDR Intermediate Certificate)](http://developer.apple.com/certificationauthority/AppleWWDRCA.cer)

を用意します。
リリース用と配布用で異なる場合は配布用も必要です。
証明書はキーチェーンから`.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上でテスト・配布する環境は整いました。
続きの[テスト・アップロード編](http://qiita.com/akaimo/items/9612041c50b1898dedc0)は12月14日に公開予定です。

明日は弊社デザイナー @UomoriAtsushi の「デザイナーがレシピ投稿サイトに投稿してみたら」です。

#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[新しい技術にどんどん挑戦したい！という技術で事業に貢献したいエンジニアを募集](https://www.wantedly.com/projects/69257)しております。