話題の記事

[iOS 8] 15分で作れる CI 環境構築

2014.11.10

iOSアプリにも継続的インテグレーション環境を

こんにちは!今日からMacDownでブログを書いています。荒川です。

モダンなWeb開発では馴染み深くなってきた、CI(継続的インテグレーション)環境を iOS 開発でも弊社では積極的に取り入れています。社内での共有も兼ねて、今回は簡単にまとめます。

「継続的インテグレーション」と聞くととても難しそうで、設定も大変そうです。ですので、最低限コピペで作れる程度の環境構築方法を紹介します。

iOS 開発での CI とは何かを詳しく知りたい方は、弊社諏訪の記事 iOSアプリ開発でCI/継続的デリバリ環境を始めるための4種の神器 を参考にしてください。

今回構築する環境は、以下に該当する方に最適です。

  • gitを使って iOS 開発を行っている。
  • チーム内でチャットツールを使っていて、そのAPIが公開されている。
  • テストコードを書いている。または、そのうち書きたい。
  • GitHub でリモートのリポジトリを共有している。
    • GitHub のPull Requestをマージする前に、そもそもビルドがしっかり通っているかクリーンな環境で確認したい。

開発環境

  • Mac OS X Yosemite
  • Xcode 6.1
  • iOS SDK 8.1
  • CocoaPods 0.34.4
  • ChatWork(チャットツール)
  • GitHub(共有リポジトリ)
  • Travis CI(公開リポジトリ用の.orgドメイン、Privateなリポジトリは.comドメイン)

チャットツールはAPIが公開されていれば、どのサービスでも結構です。チャットツールのAPIトークンを利用するため、 GitHub と Travis CI は必ずプライベートリポジトリ にして下さい。公開リポジトリを使用する時は、チャットツールの設定を省略して下さい。

まずは、各サービスにログインし、作業リポジトリを作成して下さい。

iOS × Travis CI 環境を作るための4ステップ

Travis CIGitHub で管理されているリポジトリに、簡単な設定を追加するだけで CI 環境を提供してくれるWebサービスです。

同じようなサービスの Jenkins と異なる点は、

  • GitHub に依存している。
  • 環境構築が設定ファイル(.travis.yml)で簡単に行える。
  • ビルド環境を Travis 側が提供してくれる。

などがあります。

Travis の VM 上でビルドの度に使い捨ての環境が立ち上がるようです。これによって常にクリーンな状態からビルドが行えます。

順番に連携の仕方を紹介します。

1. Travis CI Webコンソールから対象リポジトリの設定

Travis CI には GitHub アカウントでログインできます。 ログイン後に対象リポジトリを Travis でビルドするためのチュートリアルが表示されますので、その通りに進めてください。

2. 設定ファイルの作成

まず、「.git」 ディレクトリと同階層に 「.travis.yml」 を作成します。

ターミナルからリポジトリのディレクトリまで移動し、以下を入力します。

vi .travis.yml
language: objective-c

before_install:
  - gem install cocoapods -v '0.34.4'
  - pod install

script:
  - xctool -workspace YOURPROJECT.xcworkspace -scheme YOURSCHEME -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO
  - xcodebuild -workspace YOURPROJECT.xcworkspace -scheme YOURSCHEME -destination 'platform=iOS Simulator,name=iPhone 6' test

after_success:
  - chmod 755 chatwork.sh
  - ./chatwork.sh

現在 Travis でのパッケージ管理を行う homebrew では、 xctool の iOS 8.1 以降のテストに対応していないため、テストビルドは xcodebuild を使っています。xctool の方がログが整形されていて見やすいですが、Xcode 標準のビルドツールより新 OS への対応が遅いです。xctool は Facebook の OSSです。

    1. YOURPROJECT.xcworkspace と YOURSCHEME それぞれにプロジェクトに適した名前をつけてください。
    2. CocoaPods を利用するためには、Podfile が必要です。
    3. テストを書いていない場合は、「- xcodebuild -workspace YOURPROJECT.xcworkspace -scheme YOURSCHEME -destination 'platform=iOS Simulator,name=iPhone 6' test」 の箇所を消してください。
    4. チャットツールを使わない場合は、「after_success:」以降を消してください。

3. チャットツールとの連携

「.travis.yml」と同階層に「chatwork.sh」を作成します。

vi chatwork.sh
#!/usr/bin/env sh
CHATWORKTOKEN=(チャットワークのトークンが入ります。)
CHATWORKROOMID=(チャットワークのルームIDが入ります。)

# ビルド成功時は develop ブランチのみ通知
if [ ${TRAVIS_TEST_RESULT} -eq 0 ] && [ ${TRAVIS_BRANCH} != "develop" ]; then
  echo "exit: build success on any branch without develop"
  exit 0
fi
if [ ${TRAVIS_TEST_RESULT} -eq 0 ]; then
  result="BUILD SUCCESS"
else
  result="BUILD FAILED"
fi

body=`cat << EOT
[info][title]${result} - ${TRAVIS_REPO_SLUG} [/title]branch: ${TRAVIS_BRANCH}
commit: https://github.com/${TRAVIS_REPO_SLUG}/commit/${TRAVIS_COMMIT}
build: https://magnum.travis-ci.com/${TRAVIS_REPO_SLUG}/builds/${TRAVIS_BUILD_ID}
[/info]
EOT`

echo "$body"

script="puts URI.encode_www_form_component('${body}')"
encoded=`ruby -r uri -e "${script}"`
echo $encoded
curl -X POST -H X-ChatWorkToken:$CHATWORKTOKEN -d body=${encoded} https://api.chatwork.com/v1/rooms/$CHATWORKROOMID/messages

以上で設定は終わりです。

ChatWork での API トークンの取得方法については、 ChatWork API ドキュメント - 認証方法 を参考にしてください。

4. Xcode での Scheme の共有設定

Xcode のプロジェクトを外部サービスでビルドしたいときは、スキーム毎に許可を与える必要があります。

ios-travis02

ios-travis01

以上で全ての環境構築が完了しました。

GitHub の develop ブランチへ push すれば、 Travis で自動ビルド & テストが実行されて、結果がチャットツールへ通知されます。

まとめ

今回は iOS 開発の CI 環境構築の一例を紹介しました。

もちろん「.travis.yml」ファイルを各言語設定に書き換えれば iOS 以外でも CI 環境が構築できます。

既に GitHub をお使いの方は、簡単に出来ますので、構築してみてはいかがでしょうか。