Travis-CI上でiOS アプリをビルドしてdeploygateで配布する

# 前提

- Swift と `CocoaPods` を使ったプロジェクトのビルドを想定しています
- `master` ブランチにマージされた際にビルドされることを前提としています

# 準備

## Travis コマンドのインストール

```shell-session
$ gem install travis --no-document
$ cd [Project Directory]
$ travis login
# Github のユーザ名とパスワードを入力
$ travis enable
```

## 証明書とプロビジョニングプロファイル

1. 証明書はキーチェーンアクセスから秘密鍵と公開鍵を選択して `.p12` 形式でパスフレーズを設定して `travis.p12` として出力しておく
1. プロビジョニングプロファイルは以下の方法で探して、 `travis.mobileprovision` にリネームしておく
  -  Xcode の `Preferences` > `Accounts` > `View Details` の該当のプロビジョニングプロファイルを右クリックして `Show in Finder` してもってくる
  -  Apple Developer Member Center からダウンロードしてくる
1. 上記で作成した二つのファイルをプロジェクトの `.travis` ディレクトリにまとめて配置する
1. 以下の手順で隠しておきたいファイルを暗号化しておく

```shell-session
$ cd [Project Directory]
$ cd .travis/
$ tar cvf secrets.tar travis.p12 travis.mobileprovision
$ cd ..
$ travis encrypt-file .travis/secrets.tar .travis/secrets.tar.enc
# 出力をどこかにとっておく
$ rm .travis/secrets.tar
```

## 環境変数

- Travis-CI プロジェクトページの `Settings` > `Environment Variables` > `Add a new variable` から設定する
 - `travis env set NAME VALUE` コマンドでも設定できる
- 人に見られたら困る情報は `Display value in build log` を `OFF` にしておく

| 変数名 | 説明 |
| --- | --- |
| APP_NAME | `*.xcproject` もしくは `*.xcworkspace` の前の部分 |
| KEY_PASSWORD | `travis.p12` に設定したパスフレーズ |
| PROFILE_NAME | Xcode の `Preferences` > `Accounts` > `View Details` で表示されているプロビジョニングプロファイルの名前 |
| DEVELOPER_NAME | キーチェーンアクセスの証明書の名前の `:` の後ろ `(` より前の部分。スペースが入っている場合は、スペース前に `\` を入れる |
| DEPLOYGATE_USER_NAME | deploygate のユーザ名 |
| DEPLOYGATE_API_KEY | [deploygateの設定画面](https://deploygate.com/settings) から取得する |

## Travis-CI の設定画面

`Settings` > `General Settings` の `Build pull requests` を OFF にしておく

<img width="1340" alt="iosapp-travis.png" src="https://qiita-image-store.s3.amazonaws.com/0/19816/dd99e405-0934-a384-32fe-09f5b1bd55fe.png">

## Travis-CI 用の設定ファイル

- `.travis.yml` ファイルとしてプロジェクトのディレクトリの直下に設置する
- `xcode_workspace` の項目には自分のプロジェクトの `*.xcworkspace` のディレクトリ名を入れる
- `before_install` の `openssl ...` の行には先の手順の `travis encrypt-file` の結果をコピペする

```yaml:.travis.yml
language: objective-c
osx_image: xcode7
xcode_workspace: YOURPROJECTNAME.xcworkspace
before_install:
  ### travis encrypt-file の結果をコピペする ###
  - openssl aes-256-cbc -K ... -iv ... -in .travis/secrets.tar.enc -out .travis/secrets.tar -d
  - tar xvf ./.travis/secrets.tar -C ./.travis
  # xcpretty と fomrmatter のインストール
  - gem install xcpretty-travis-formatter --no-document
before_script:
  # Create default keychain on VM
  # http://docs.travis-ci.com/user/common-build-problems/#Mac%3A-Code-Signing-Errors
  - security create-keychain -p travis ios-build.keychain
  - security default-keychain -s ios-build.keychain
  - security unlock-keychain -p travis ios-build.keychain
  - security set-keychain-settings -t 3600 -l ~/Library/Keychains/ios-build.keychain
  # Add certs to keychain
  - security import ./.travis/travis.p12 -k ~/Library/Keychains/ios-build.keychain -P ${KEY_PASSWORD} -T /usr/bin/codesign
  # save profile
  - mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
  - cp "./.travis/profiles/travis.mobileprovision" ~/Library/MobileDevice/Provisioning\ Profiles/
script:
  - xcodebuild -workspace ${APP_NAME}.xcworkspace -scheme ${APP_NAME} -sdk iphoneos -configuration Release CODE_SIGN_IDENTITY="${DEVELOPER_NAME}" archive -archivePath ./build/${APP_NAME}.xcarchive | xcpretty -f `xcpretty-travis-formatter` && exit ${PIPESTATUS[0]}
  - xcodebuild -exportArchive -exportFormat IPA -archivePath ./build/${APP_NAME}.xcarchive -exportPath ./build/${APP_NAME}.ipa -exportProvisioningProfile "${PROFILE_NAME}" | xcpretty -f `xcpretty-travis-formatter` && exit ${PIPESTATUS[0]}
after_success:
  # Upload .ipa file to deploygate
  - curl -F "file=@build/${APP_NAME}.ipa" -F "token=${DEPLOYGATE_API_KEY}" https://deploygate.com/api/users/${DEPLOYGATE_USER_NAME}/apps
after_script:
  - security delete-keychain ios-build.keychain
  - rm -f "~/Library/MobileDevice/Provisioning Profiles/${PROFILE_NAME}.mobileprovision"
branches:
  only:
    - master
```

# 動作確認

今まで追加したファイルをコミットして、Github にプッシュすると .travis.yml の定義に従ってビルドのプロセスが走ります。

```shell-session
$ git commit -m "add Travis-CI settings"
$ git push
```

# 注意点

- 一定規模以上のプロジェクトになると、ビルドのログが多すぎて Travis-CI の4MBの制限を突破してしまうため、ログ出力は [xcpretty](https://github.com/supermarin/xcpretty) を挟まないとビルドが失敗する
- `travis encrypt-file` は一プロジェクトにつき複数のファイルを扱えない

## 参考にした記事

- [Travis CIで配布可能なIPAを作成して配布する](http://qiita.com/radioboo/items/bb3bba734a68f0c25c81)
- [Travis CIでxcprettyを使ってxcodebuildのログをきれいにする](http://qiita.com/radioboo/items/bb3bba734a68f0c25c81)