はじめに
Xcode9 から Xcode の標準機能として Xcode Server が導入され、
Xcode 上で CI 環境の構築ができるようになったみたいなので、
Xcode Server を動かせるようになるまでの流れを備忘録として記録しておきます
※以前は MacOS Server というアプリと連携して Xcode Server を動かす必要があったようですが
MacOS Server 5.7.1 のリリースに伴い、Xcode 単体で Xcode Server を動かすことができるようになったようです
※どのような処理を行なっているか曖昧なところもあるので、参考にされる際は自己責任でお願いいたします
(証明書関係の設定が変更される場合があります)
開発環境
Xcode: 10.1
CocoaPods: 1.5.3
導入方法
Server を起動
-
メニューバーから Xcode -> Preference -> Server & Bots を開く
-
画面右上のスイッチをクリック

- Xcode Server を起動するホストを聞かれるので、動かしたいホストを選択

以下のような表示になったら Xcode Server の起動が完了
Xcode Server アカウントを追加
-
メニューバーから Xcode -> Preference -> Accounts を開く
-
左下の + ボタンから Xcode Server を選択

- Xcode Server を起動する端末を選択

- 端末へログインするためのアカウント名、パスワードを入力

- Server の追加が完了すると、Accounts ページに Xcode Server 用のアカウントが追加される

Bot を追加
- メニューバーから Product -> Create Bot を開く
- Bot 名と Bot を動かすサーバを聞かれるので、1つ上の手順で作成した Xcode Server アカウントを指定

- Git との連携を行う

- Bot の処理を設定

- Bot を動かすタイミングを設定

※ちなみに、On Commit
を選択すると、リモートの master
ブランチにコミットされたタイミングで Bot が動き出すようになります
master
ブランチへのコミットが Bot の動き出すトリガーになっている要因は、手順3のところで master
ブランチをターゲットに指定していることっぽいです
6. テストをする環境を選択
All iOS Devices and All Simulators
や All iOS Devices
等を選択できますが、ここでは Specific iOS Devices and Simulators
を選択しています
これを選択することで、特定のバージョン、端末を指定してのテストが可能です
7. Provisioning を設定
8. 環境変数を設定
アプリをビルドするために環境変数を使用する必要がある場合はこちらに定義を追加してください
9. Bot の実行前、実行後等のタイミングで行いたい処理を設定
この部分は比較的使用頻度が高そうな印象です
Bot が動く前、動いた後に実行したいシェルスクリプトを追加することができます
新しいエラーが発生した場合にメールで通知してくれるような機能があるのですが、その送信先もここから設定可能です
Xcode Server を動かすだけなら、ひとまず何も設定しなくて大丈夫です
動かし方
上記の手順9で Create
をクリック後に自動で Bot が動き、テストを行ってくれるかと思います
手動で実行したい場合は以下ので順で実行できます
- ナビゲーターバーのレポートナビゲータを選択
- Bot を選択
- 右上の
Integrate
をクリック

Bot の設定を変更したい場合は、先ほどの Integrate
ボタン横の Edit Bot
から編集可能です
つまずいたところ
Xcode Server 導入時に個人的につまずいたところも記載しておきます
1, エラー内容の詳細を確認したい!
Bot 実行時にエラー内容が表示されるのですが、その内容が切れてしまっていたり、どんなエラーなのかわからなかったりして詳細を確認したい場合があります
その場合は、以下のような手順でログを確認できます
- エラー内容を確認したい
Integrate
を選択 - 上バーの
Integrate()
をクリック - 表示されるメニューから
Logs
をクリック


また、 Configure bot trigger
に追加したシェルスクリプトのログを確認したい場合、上記の手順4に Pre-Integration Script
等の項目が追加されているので、そこから確認可能です
2, 後から CocoaPods を導入し、Xcode Server を動かすとエラーが表示される!
初めは ライブラリ等を使用せずに実装しており、後から CocoaPods を導入し、ライブラリを使用し始めた際に Bot がこけてしまっていました
ビルド対象が .xcworkspace
ではなく、 .xcodeproj
になってしまっていることが原因だったようです
- Bot を動かしたいプロジェクトを
.xcworkspace
で開き、Bot を選択する -
Edit bot
を選択 - アラートが表示されるが、
edit
を選択



3, CocoaPods を使用したプロジェクトで Xcode Server を動かすとエラーが表示される!
この部分が一番悩みました
エラー内容は以下です
Bot Issue for TestXcodeServer Bot (error)
Integration #2 of TestXcodeServer Bot on [サーバ名]
Open Integration in Xcode: xcbot://[ユーザ名]/botID/78652e5d0a874216b90ff4a0ed000d64/integrationID/78652e5d0a874216b90ff4a0ed006924
Error: /Users/[ユーザ名]/Library/Caches/XCSBuilder/Bots/78652e5d0a874216b90ff4a0ed000d64/Source/TestXcodeServer/Pods/Target Support Files/Pods-TestXcodeServer/Pods-TestXcodeServer.debug.xcconfig: unable to open file (in target "TestXcodeServer" in project "TestXcodeServer") (in target 'TestXcodeServer')
私は CocoaPods の Pod
ディレクトリを Git の管理下に設定しておらず、 git clone
をした人が自分で pod install
をする想定の作りをしていました
そのため、Bot が動く前のタイミングで pod install
を呼ぶようなシェルスクリプトを追加する必要があるようです
-
Edit bot
をクリック -
Triggers
タブを開く - 左下の + ボタンから
Pre-Integration Script
を選択

- 適当な名前を付け、以下のようにスクリプトを追記
# !/bin/sh
export LANG=en_US.UTF-8
cd "${XCS_PRIMARY_REPO_DIR}"
/usr/local/bin/pod install
-
export LANG=en_US.UTF-8
を入れているのは、文字コードの指定を促すようなアラートがログに表示されていたため追加しています -
/usr/local/bin/pod install
とフルパスで記述しているのは、pod install
だけだとcommand not found
と表示されてしまい、pod install
が実行できなかったのでフルパスで記述しています
※このシェルスクリプトのログは Pre-Integration Triggers
を追加した場合は項目が増えているので、そこから確認可能です
これで Bot が動き出す前に pod install
を実行できるようになり、CocoaPods を使用したプロジェクトも Bot を動かすことができるようになりました!
4, リモートに Push しても自動で Bot が動いてくれない!
Bot が動くタイミングを OnCommit にしていたのですが、リモートブランチに Push したにも関わらず、Bot が動いてくれなくて悩みました
この原因は、Bot で設定しているターゲットブランチと最後に Integrate したブランチが異なっているためだと思われます
Bot の Repositories を変更した場合は一度手動で Integrate を実行してあげることで、ターゲットブランチへの Commit を検知して自動で Bot が動いてくれるようになるかと思います!
終わりに
現在はテストコードの実行ぐらいで終わってしまっているので、今後は「テストコードが通ったらアーカイブして配布」ぐらいにまで発展していく予定です