Goodbye... Jenkins... Jenkinsを卒業してお手軽CI! iOSもAndroidもCircle CIでアプリのCIを回そう

by @mixiappwchr



アプリ開発において、重要なのだけれども面倒なものの一つとしてCI環境の整備があります。

サーバーサイドについては、すでにtravis CI,Circle CI,wreckerなどのクラウドのCIサービスを用いて継続的にインテクグレッてると思いますが、アプリに関しては各サービスがアプリのCIに対応してなかったりするため、未だに、ローカルにmac miniなどおいてJenkinsさんとお付き合いしてる人も多いでしょう。

![headshot.png](https://qiita-image-store.s3.amazonaws.com/0/37731/5e582284-faa1-75cf-09f8-7839bc21e14c.png)


しかし、やはりローカルのJenkinsを使う場合だと

* サーバーサイドのCIはクラウドで済ませてるのに、これだけローカルだとリモートからのメンテが面倒。
* そもそもjenkins自体設定が結構面倒

などなど、結構メンテに時間を取られたりします。


しかし最近になってCircle CIのiOS対応が進み、いよいよアプリCIのクラウドでの実行が可能な時代になりました。

# Circle CI
[circle CI](https://circleci.com/)


![full2.png](https://qiita-image-store.s3.amazonaws.com/0/37731/0c58a10e-ca8f-b5b6-7c72-090c896740c9.png)


# Circle CIで動かすためには？

circle.ymlというyamlに設定を書きます。

加えて、ビルド用のスクリプトやら何やらが必要ですが、その辺は現状の遺産をつかったりサンプルプロジェクトがあるので、各自合わせると良い感じです。

```
// 環境変数類
// 環境変数をここでセットしてビルド時のコマンドなどに引き渡す
machine:
  environment:
    HOGEHOGE_ENV: ENV
    
// 依存モジュールのセットアップ
// iOSならcocoapods ,androidならgradleを実行します。
dependencies:
  override:
    - hogehoge
        
// testフェーズ。ちゃんとテストを書いてるならここで実行します
test:
  override:
   -  test command

// アプリ配布フェーズ。指定のブランチにコミットがあった場合走ります。
// master ,stagingといった風に複数作れます。
deployment:
  master:
    branch: release/1_0_0
    commands:
      - build command

```


# iOS 
iOSの設定サンプルです。設定ファイル自体は簡単なのですが、難しいのはビルドの方です。
provisioningの設定や,sign処理をうまく行う必要があります。
サンプルプロジェクトがあるので細かい部分はこちらを参照してください。
https://github.com/infolens/CircleCI-iOS-TestFlight-Sample
    // sampleプロジェクトのままですが、keychainやprovisioningの設定を行いビルド、配布まで実行します。

```
// 環境変数類
machine:
  environment:
    // ビルドスクリプトで使う環境変数を書いてください。以下は例
    XCODE_SCHEME: hogehoge
    XCODE_WORKSPACE: hogehoge.xcworkspace
    
// pod installを行い依存モジュールをセットアップします。
dependencies:
  override:
    - pod install:
        timeout: 300
      
// テスト。XCTestに加えて、KiFやKiwiの実行もできます  
test:
  override:
  - xcodebuild test -scheme <ビルドスキーマ> -workspace <ワークスペース> -sdk iphonesimulator

// アプリ配布
deployment:
  master:
    branch: release/1_0_0
    commands:
    // ビルドから配布まで行うスクリプトを配置。この辺のビルドスクリプトは各人の管理しやすい形で。
      - ./bin/dist.sh

```



# Android 

Androidはgradleだけでなんとかなるので、比較的対応が楽です。

Androidはこちらに詳細にかかれてますので、こちらを参照ください。

https://circleci.com/docs/android


ただメモリ使用量の問題などがあり、いろいろ試行錯誤しましたが。。。


```
// 環境変数類
machine:
  environment:
    ANDROID_HOME: /usr/local/android-sdk-linux
    // CIのメモリ制限に引っかかるためOptionでメモリを使いすぎないようにしてます。
    JAVA_OPTS: "-Xmx1048m -XX:MaxPermSize=512m"　


// 依存モジュールをダウンロード
// SDKマネージャーでダウンロードするようなことをここで行います

dependencies:
// 必要に応じてSDKバージョンを追加.プロジェクトによっては他の物も必要になるので自身のプロジェクトに合わせてください。
  pre:
    - echo y | android update sdk --no-ui --all --filter "platform-tools,tools"
    - echo y | android update sdk --no-ui --all --filter "extra-google-google_play_services"
    - echo y | android update sdk --no-ui --all --filter "android-21,build-tools-21.0.0"
// それ以外の依存モジュール
  override:
    - ./gradlew dependencies


// テストフェーズ. テスト実行がまだちゃんと、調べきれてないので、どうするかは後ほど追記します。テストがない場合はひとまずビルドが通るかくらいは実行しておくと良いでしょう
test: 
  override:
    - ./gradlew assembleDebug

// アプリ配布は、DeployGate pluginを使えば簡単ですね！
deployment:
  master:
    branch: release/1_0_0
    commands:
      - ./gradlew assembleRelease
      - ./gradlew uploadDeployGateRelease
   
```


# 終わりに

毎回新規プロジェクトが起きるたびにJenkinsをセットアップしてきた身からすると、だいぶ革新的な変化だと思います。特にメンテナンスに関して、非常に楽になりました。

一方、テストを回したりする場合や、サーバーのリソースの問題もあり、

* jenkins側でがっつり様々な端末でテストしていた。
* jenkinsのいろいろなpluginを活用していた

などなど、移行するにはまだ要件があてはまらない可能性もありケースバイケースですが、新規立ち上げのプロジェクトにおいては非常に効力を発揮すると思います。

みなさんぜひ活用してみてください。

##### appwchr post
----

[API開発の効率化の架け橋！APIのStubサーバーを導入して,API開発に効率化、スピード化、柔軟性を手に入れよう！](http://qiita.com/appwatcher/items/49807e72d9600db7196d)

[アプリエンジニアから見てAPI設計において気をつけてもらえるとうれしいこと](http://qiita.com/appwatcher/items/4a0dd09c393cc70d961a)

[Goodbye... Jenkins... Jenkinsを卒業してお手軽CI! iOSもAndroidもCircle CIでアプリのCIを回そう](http://qiita.com/appwatcher/items/4cdf39804d6e46ab7af5)

[まだTestFlight使ってたの？急げ！終了目前のTestFlightから,今すぐにiOSもDeployGateに移行しよう！移行パターンも紹介するよ。](http://qiita.com/appwatcher/items/632460e15fbdb81b7a71)

[Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料](http://qiita.com/appwatcher/items/50295e82ab0095902aaa)

[iOSの開発をする上で絶対に使うべき！外せない！webサービス、開発ツール集【完全版】](http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)