BambooでXCTestを動かすために設定したところ

Bambooを使ってXcodeのプロジェクトのユニットテストとUIテストを出来るようにするために設定したときに、少し手間取ったところのメモです。Macのアプリをテストするために行った設定です。

# システム環境
次のような環境で運用しています。

* Machine: Mac mini Server Mid 2011
* OS: macOS 10.13.3 High Sierra
* Xcode: Xcode 9.2
* JDK: jdk1.8.0_161
* Bamboo: 6.4.0 build 60404

# Xcode側の設定など
xcodebuildでビルドとテストが出来る状態になるように、まずはサーバー側で作業します。

## インストール
Xcodeは普通にストア版をインストール。Xcodeを起動して初期設定（Xcodeが行うコンポーネントのインストールなど）を行います。
次に、ターミナルで以下のように作業して、コマンドラインツールのインストールと動く状態に設定します。

```bash
# コマンドラインツールをインスト−ル
$ xcode-select --install

# 使用許諾への同意
$ sudo xcodebuild -license
```

## デバッグモードの設定とキーチェーン周り
Xcodeで適当なプロジェクトをビルドして、デバッグ実行します。初めてビルドすると、管理者権限の昇格ダイアログとデバッグモードを有効にするかの確認メッセージが出るので、設定してXcodeでデバッグ実行が出来る状態にします。

## プロジェクトの設定
Main Thread Checkerで引っかかる項目があると、上手く動かないです。本来ならMain Thread Checkerで引っかからないようにコード修正を行うべきですが、その前に、テストを出来る状態にしたいので、Main Thread Checkerが動かないように設定します。Schemeの設定画面で設定します。

設定画面で「Test」を選択して、「Diagnostics」タブの「Main Thread Checker」をオフにします。更に「Shared」のチェックを入れておいて、Gitでこの設定を共有出来るようにします。スキーム名にスペースが含まれる場合には、スペースを含まない名前に変更しておいた方が良いです。

![screen_2018-03-21_11.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/28111/60dd9384-2641-ac8d-e5af-c0da45f39337.png)

# Bamboo側の設定
## Agentの設定
初期状態ではmacOSのSDKが設定されていないのでエージェントに設定します。次のようにします。

1. Bamboo AdministrationのAgentの設定画面を開く
2. Shared capabilitiesのEditをクリックして、Server capabilitiesの設定画面を開く
3. Add capability欄の「Capability type」から「Executable」を選択、「key」と「value」に「macosx10.13」を入力して、「Add」ボタンをクリック

「Executable」に「macosx10.13」が追加されます。これで、エージェントがmacOS 10.13のSDKを使えるようになります。ここで入力した「macosx10.13」という値は、「`xcodebuild -showsdks`」で調べられます。

```bash
$ xcodebuild -showsdks
iOS SDKs:
	iOS 11.2                      	-sdk iphoneos11.2

iOS Simulator SDKs:
	Simulator - iOS 11.2          	-sdk iphonesimulator11.2

macOS SDKs:
	macOS 10.13                   	-sdk macosx10.13

tvOS SDKs:
	tvOS 11.2                     	-sdk appletvos11.2

tvOS Simulator SDKs:
	Simulator - tvOS 11.2         	-sdk appletvsimulator11.2

watchOS SDKs:
	watchOS 4.2                   	-sdk watchos4.2

watchOS Simulator SDKs:
	Simulator - watchOS 4.2       	-sdk watchsimulator4.2
```

この設定を行わないで、ジョブの設定をしてしまい、利用可能なエージェントが無いというエラーになってしまいました。後から設定すると、なかなか上手く認識されず、一回やり直しました。プロジェクトを削除したことで認識されたのか、プランを作り直したことで認識されたのかは不明ですが、先にエージェントを設定しておいた方が良いです。

## ジョブの設定
ジョブのタスクの設定でXCTestを使う設定をします。標準で「Xcode」というタスクが入っているので、これをタスクに追加します。
Xcodeタスクの設定画面で、以下の設定を行います。

* 「Apple SDK」を「macosx10.13」にする（エージェントに設定した値を入力する）
* 「General」の「Build all targets」と「Report XCTest test results」をオンにする
* 「Project」の「Project」にプロジェクトファイルの名前を、拡張子を除いて入力する
* 「Configuration」は空にしておく
* 「Workspace」の「Scheme」にテストに使用するスキーム名を入力する
* 「Advanced」の「Working subdirectory」に必要に応じてサブディレクトリ名を入力する

### スキーム名
指定可能なスキーム名は「xcodebuild -list」で調べられます。

```bash
$ xcodebuild -list
Information about project "MultiTextConverter":
    Targets:
        MultiTextConverter
        Tests

    Build Configurations:
        Debug
        Release

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

    Schemes:
        MultiTextConverter
```

「Schemes」に表示されるのがスキーム名です。複数あるときは、複数列挙されます。

Bambooは「`xcodebuild test`」でテストを実行するのですが、「`xcodebuild test`」はスキーム名が指定されていないと動作しない仕様になっているので、この設定は必須です。

### ワーキングディレクトリ
クローンしたリポジトリのルートディレクトリにプロジェクトファイルが無いときは、プロジェクトファイルがあるディレクトリをワーキングディレクトリに指定します。

### Configurationについて
Xcodeで指定している「Configuration」が使われるので特に設定は必要ないと思います。単純なプロジェクトでは設定しても設定しなくても動きました。複雑なプロジェクトでは設定すると動かないというものもありました。同様に「Arcchitecture」も指定しなければ、Xcodeのプロジェクトの設定が使われるようです。

#その他
## コードサイニングについて
自分の環境ではコードサイニングを設定しているとエラーになってしまい、上手く出来ませんでしたが、サーバー側で設定すれば可能だと思います。今回はmacOS用のアプリなのでコードサイニングは切りました。リリースのためにアーカイブするときにコードサイニングすれば十分ですので。

## UIテスト時のディスプレイ解像度について
UIテストもプロジェクトに設定しておけば、Bamboo経由で実行できます。ただ、ヘッドレス運用しているMac miniの場合、ディスプレイ解像度が低いので、これが問題になります。適当なディスプレイをつないでおいて解像度は高く出来るようにしておくか、HDMIエミュレータとかを付けておいて、ヘッドレスでも解像度を高く出来るようにしておいた方が良いです。