最近、CircleCIを使っている人が増えてきている感じがします。
CircleCIはgithubのプライベートリポジトリも使えて非常に便利ですし、私も1ユーザです。
そんな私が、最近悩んでいたこと&対応したことについて以下につらつらと書いてみました。
やりたいこと
- iOSアプリの開発でgithubのプライベートリポジトリを使っているが、1リポジトリ内に複数アプリのプロジェクトがある。
- 各プロジェクト単位でビルド・テストなどをやりたい。
課題
- CircleCIは1リポジトリで1プロジェクトしか作れない。
※1アプリで1リポジトリを使えるなら良いのですが、プライベートリポジトリをさくっと増やすのはきついのです。
解決策
- アプリ単位でブランチを用意する。
CircleCIはブランチ単位でビルドやテストを走らせることが出来るので、各アプリ単位でブランチを用意しておけば良いと気付きました。
対応方法
ディレクトリ構成的には以下の様な感じを想定しています。
- apps/
- circle.yml
- アプリA/
- アプリB/
- アプリC/
事前設定
まず、CircleCIでビルドやテストをするための事前設定をしておきます。
- Xcodeの「Manage Schemes..」からSharedをチェックしておく。
- CircleCI上で対象となるgithubのリポジトリをプロジェクトにしておく。
共通設定
pod installは、各アプリのディレクトリでおこなうため以下の様な設定を書いておきます。
pod install --project-directory=${TARGET_PROJECT}
上記は、CircleCIの設定にある「Test Commands」の「Dependency Commands」に書いておきます。
${TARGET_PROJECT}については後述します。
各アプリの設定
各アプリの設定は、circle.ymlに書きトップにおきます。
このファイルは、各アプリのブランチ全てで持っておきます(masterブランチにも持たせておきます)。
記入例は以下のとおりです。
共通設定で使っていた値(${TARGET_PROJECT})はここで指定しています。
machine:
environment:
TARGET_PROJECT: アプリA
XCODE_SCHEME: アプリAのscheme名
XCODE_WORKSPACE: アプリA/アプリA.xcworkspace
timezone:
Asia/Tokyo
最後に
あとは、各ブランチで最新のコードをpushするだけでビルド・テストが走ってくれます。
slack連携やメール通知をしておけば結果もすぐにわかりますし、これで色々と捗りますね。
蛇足
最近はiOS周りのサポートも充実してきていて、すでにXcode7の対応もしてくれています。
Xcodeのバージョンは複数サポートしており、もはや自前でJenkinsなどをたてる必要もないかもしれませんね。