JenkinsでSwiftのビルドを実施する

CIを使ってテストを自動化しようとしたところ有償プランでないとSwiftの利用が出来なかったため
MacOS上でJenkinsを動かしてSwiftをビルド出来る環境を構築しました。
構築時にハマり所がいくつかあったので、それ含めて構築手順を共有します。

#<i class="fa fa-info-circle" style="font-size:1em;"> 環境
* MacOS 10.11.6
* Xcode 7.2.1
* Jenkins 2.46.2

###備考
* CocoaPodを使ってライブラリを読み込んでいる
* BridgeHeaderを使ってObjective-Cライブラリを読み込んでいる

#<i class="fa fa-arrow-circle-o-down" style="font-size:1em;"></i> Jenkinsのインストール

1. Jenkins公式サイトからmacOS用のインストーラーをダウンロード。
https://jenkins.io/content/thank-you-downloading-os-x-installer#stable

1. Jenkinsをインストール
    ウィザードに従ってJenkinsをインストールする
    デフォルトのままであれば`/Users/Shared/Jenkins`にインストールされます。
1. プラグインのインストール
    Jenkinsのインストール時に必要なプラグインを聞かれるのでGitとXcodeのインストールを行います。

    |プラグイン|バージョン|
    |---|---|
    |git|3.3.0|
    |git-client|2.4.5|
    |git-parameter|0.8.0|
    |xcode-plugin|1.4.11|

#<i class="fa fa-wifi" style="font-size:1em;"> ポート開放
1. ルーターの設定

    GitプラグインはUDPの33,848ポートを使用してモジュールを取得するようです。
    ポートが開放されていないとエラーとなるのでルーターの設定を変更します。

    **AirMacベースステーションの場合**
    AirMacユーティリティを起動し`ネットワーク > ポート設定`からUDPの33,848番ポートを開放する。

#<i class="fa fa-wrench" style="font-size:1em;"> Gitプラグインのセットアップ
1. 「Jenkinsの管理 > Git Plugin」を設定

    Gitで利用している設定を記載する

    |項目|値|
    |---|---|
    |user.name|gitアカウントのユーザ名|
    |user.email|gitアカウントのe-mail|
	
1. JOBの「設定 > ソースコード管理」を設定する

    |項目|値|
    |---|---|
    |リポジトリURL|GithubのリポジトリURL|
    |認証情報|プライベートリポジトリにアクセスするための秘密鍵を設定|
    |ブランチ指定子|ビルド対象とするブランチ名|

> 秘密鍵を使ってアクセスする場合は`/Users/Shared/Jenkins/.ssh`に秘密鍵を置かないと
> Jenkinsから鍵を参照することが出来ません。

#<i class="fa fa-wrench" style="font-size:1em;"> Xcodeプラグインのセットアップ
1. JOBの「ビルド > Xcode > Advanced Xcode build options」を設定する

    |項目|値|
    |---|---|
    |Xcode Schema File|Sample|
    |Xcode Workspace File|${WORKSPACE}/Sample|
    |Xcode Project Directory|${WORKSPACE}|
    |Xcode Project File|Sample.xcodeproj|

    \* デフォルトでは、`${WORKSPACE}=/Users/Shared/Jenkins/Home/【JOB名】`
    \* ワークスペースファイルがSample.xcworkspaceの場合。拡張子は不要なので記載しないこと。

#<i class="fa fa-wrench" style="font-size:1em;"> Xcodeの設定
1. Gitからモジュールを取得する
    Jenkinsからコマンドを実行するとJenkinsユーザで実行されるので、パーミッションエラーとなる場合は設定を確認する。
デフォルトの設定では`User/Shared/Jenkins/Home/【JOB名】`にレポジトリ内のファイルが展開される。

1. プロジェクトやライブラリの共有設定をONにする
    `User/Shared/Jenkins/Home/【JOB名】`以下のプロジェクトファイルをXcodeで開き、Manage Shemesを選択する。
表示されたウィンドウで**プロジェクト**や**利用しているライブラリ**のSharedチェックボックスにチェックを入れる

> Xcodeから共有設定をONにしようとすると、Xcodeは開発者ユーザで起動していて、プロジェクトファイルの権限はJenkinsユーザなので書き込みが出来ません。そのため、chowndで一時的にプロジェクトファイルの権限を開発者ユーザに変更して実施しています。

#<i class="fa fa-cog" style="font-size:1em;"> ビルドを実行
Jenkinsからビルドを実行してエラーが出ないことを確認する

#<i class="fa fa-warning" style="font-size:1em;"> エラーとなる場合
###Schemesの指定でエラーとなる
xcodebuildのlistオプションから正しいスキーマ名探し、Xcodeプラグインに設定する

```
	js-5k:iOS koheikadonosaka$ /usr/bin/xcodebuild -list
	2017-05-31 11:39:52.413 xcodebuild[38642:8676433] Failed to locate a valid instance of CoreSimulatorService in the bootstrap.  Adding it now.
	Information about project "Sample":
	    Targets:
	        Sample
	        SampleTests
	        SampleUITests

	    Build Configurations:
	        Debug
	        Release

	    If no build configuration is specified and -scheme is not passed then "Release" is used.

	    Schemes:
	        Sample
```

###コード署名が見つからない
ビルド実行時に`Code Sign error: No matching codesigning identity found: No codesigning identities`が発生する。
キーチェーンアクセスの「ログイン」から「システム」に該当するIDを持つコード署名をコピーする。

* iPhone Developer用のコード署名
* iPhone Distribution用のコード署名

###Swiftビルド時にBridgeHeaderを使って読み込んでいるライブラリのxxxが参照出来ない
Xcodeプラグインの設定をチェックする。

* Xcode PluginのTargetを設定しない（空白であること）。
* Xcode PluginのWorkspaceを指定する。拡張子の.xcworkspaceは省く。
* Xcode PluginのShemeを指定する。

#<i class="fa fa-book" style="font-size:1em;"> 参考
http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html
http://qiita.com/mokemokechicken/items/5ea39c87512a515071f5