iOSアプリ開発でもゆるくJenkinsを使う


## はじめに

開発中のプロジェクトをビルドできない状態でリモートリポジトリにPushしてしまったことや、自分や同僚が書いたTODO・FIXMEなどのコメントを集計したいと思ったことはありませんか？

このTipsでは、現状一番楽なJenkinsのインストール方法とJenkinsで出来る下記の事柄について説明しています

* Gitからのチェックアウト
* Xcodeプロジェクトのビルド
* ソースコード中のTODOコメントの抽出
* ビルド失敗時のメール通知

## Jenkinsのインストール

Jenkinsはターミナルからhomebrewを使ってインストールします。
アンインストールもhomebrewからできるので安心ですね。

インストールは下記のコマンドで実行します。

```
$ brew install jenkins
```

実行後には次のようなメッセージが出ます。

```
==> Downloading http://mirrors.jenkins-ci.org/war/1.498/jenkins.war
######################################################################## 100.0%
==> Caveats
To have launchd start jenkins at login:
    ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
Then to load jenkins now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
Or, if you don't want/need launchctl, you can just run:
    java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```

インストール後にJenkinsを利用する方法について書かれています。
これによると大まかには2つの方法があり

・launchctl(デーモンのコントローラ)でログイン時に自動で起動
・手動でwarファイルから起動

となっているようです。
まず、1つ目の方法としてlaunchctlから実行させる方法は
そのまま次の通り

```
$ ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```

lnコマンドでシンボリックリンクをつくり、launchctlに設定をロードさせています。

もしとりあえず動かしたいだけであれば、javaコマンドでwarファイルを指定する方法でよいでしょう。

```
$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```

デフォルトでポート8080で起動するようなので、
確認には http://127.0.0.1:8080/ にアクセスしてみてください。

## プラグインの導入

Jenkinsはプラグインを導入することで機能を拡張し、
色々な開発環境に対応するため、まずはプラグインをインストールします。

・Jenkins Git plugin
・XCode integration
・Task Scanner Plug-in (未解決タスクの集計)


これらプラグインの利用用途として
gitプラグインで特定のリポジトリからプロジェクトをチェックアウト、
Xcodeプラグインでビルド、
ビルド後に未解決タスクの集計プラグインで集計するようになります。

### プラグインの導入

[Jenkinsの管理][プラグインの管理]を選択してください

![](http://24.media.tumblr.com/8bbe5d793c065a6d2a23f8743fa3eacf/tumblr_mi62fjxPuC1qzzao7o1_500.png)

利用可能な一覧を表示します。

![](http://25.media.tumblr.com/94ab9a8b36d75ca1e85f103b5463a5d9/tumblr_mi62mcGjBN1qzzao7o1_500.png)

この利用可能な一覧から下記を選択しインストールします

・Jenkins Git plugin
・XCode integration (SICCI for Xcode Pluginではないので注意)
・Task Scanner Plug-in(未解決タスクの集計)

## ジョブの設定

Jenkinsダッシュボードに戻り[新規ジョブ作成]からジョブ名を入力し、フリースタイル・プロジェクトのビルドを選択します。


## プラグインの設定

### Git pulginの設定
![](http://25.media.tumblr.com/475ba9b56d4f192b87e35cb3625a7f70/tumblr_mib0ejBsYu1qzzao7o1_500.png)

Jenkins Git pluginでは主にチェックアウトするリポジトリのパスとbranchを指定します。

また、SCMをポーリングする時間をスケジュール項目でcronでの時間設定のように指定できます。
この例では15分間隔としていて、15分毎にリポジトリに変更がある際にチェックアウトしビルドを行います。

### Xcode integrationの設定

![](http://25.media.tumblr.com/066542e37b44c10c18ec0c81fd51d497/tumblr_mib0pemIHU1qzzao7o1_500.png)

Xcode integrationプラグインではチェックアウトしたプロジェクトのビルド設定を行います。
最低限必要なのはTarget、Configurationでしょうか。必要であればIPAファイルを出力するようにできます。
(もしKeychain pathがデフォルトで入力されていなければここで入力します）

また、Jenkinsではジョブ用にワークスペースというディレクトリを作成し、
そこを基準にチェックアウトしてきた構成をビルドしようとします。
そのため、このXcode integrationプラグインで設定する各種パスは、
そのワークスペースが起点になっているようです。

### Task Scanner Pulg-inの設定

![](http://24.media.tumblr.com/fe3826e48a189ede198f86f1d88c3ca1/tumblr_mib12bEEgk1qzzao7o1_500.png)

Task Scanner Plug-inではTODOコメントなどを集計するファイル名、
また集計する対象となるタグを設定します。

ファイル名はObjective-Cの実装ファイルを対象とするため、ワイルドカードを使い

```
**/*.m
```

タグはFIXMEやTODOなど優先度を分け、大文字小文字の判別を無視するようにするのが良いでしょう。

なお、高度な設定からデフォルトエンコーディングを選べるため、そこでUTF-8にしておかないと、
抽出されるTODOコメントなどで日本語の文字化けが起こってしまいます。

ビルドが成功すると未解決タスクは次のように表示されるので、ソースコードに書かれたタスクも無理なく常時把握できますね。

![](http://25.media.tumblr.com/744cf854aef6088a844546304a1ce5c3/tumblr_mid73m2EdX1qzzao7o1_500.png)

## メールによる通知

デフォルトではビルド失敗時とビルド失敗から正常に戻った際の2つのタイミングでメールを通知することができます。

まず「Jenkinsの管理」「システムの設定」「E-mail通知」からSMTPサーバの設定を入力しておきます。
![](http://24.media.tumblr.com/6a37f913ff8455b3acc9645f012a0d19/tumblr_mid6kdlWp71qzzao7o1_1280.png)

私はSMTPサーバとしてgmailを使っているので、自分のgmailアカウントのメールアドレスをSMTPユーザ名、返信先アドレスに入力しています。

さらに、個々のジョブのビルド設定から「ビルド後の処理の追加」を「E-mail通知」を選択し、メールの宛先を入力を指定します

![](http://25.media.tumblr.com/edacc94a3aac09e91de3ce9de697013c/tumblr_mid74q9EMu1qzzao7o1_1280.png)

ビルドが失敗した際と、失敗してから正常にビルドできるようになった際の2パターンメールが通知されます。


## その他
## ビルド用のMacを買う必要があるか

iOSアプリ開発のよくある話として、Jenkinsを導入しビルド用にMac OSXのサーバーを購入したくなるとは思いますが、そもそも開発を行なっているローカルのMac OSXにJenkinsをインストールするだけで、ほとんど要は満たせると思います。

まずはローカルのJenkinsでCIに慣れていくっていうのもいいんじゃないでしょうか。


## 参考URL

Jenkinsのメール通知にGmailを使う | コーヒーサーバは香炉である
http://blog.maripo.org/2012/07/jenkins-gmail/

Safx: Jenkinsでテストとカバレッジの結果をグラフ表示できるようにする 
http://safx-dev.blogspot.jp/2012/03/jenkins.html