背景
iOS/MacアプリのCIはXcode Serverで回したいですよね。Jenkinsでも良いですが、カバレッジ良い感じに取れるようになったし見やすいし。
しかし、Xcode Serverは_xcsbuildd
というユーザーが実行するため、気にしてあげないといけないことが幾つかあります。特に、CocoaPods/Carthageで(Github Enterpriseを含む)Privateなレポジトリを取りに行こうとして情報源が少なく大変だったので、手順をまとめます。
前提
- Xcode7.1インストール済み
- 開発者登録済み
-
brew install git ruby
済み -
gem install cocoapods
済み - Carthageインストール済み
- OSX Serverインストール済み
手順
1. Keychain準備
ひとまず通常ログインユーザーでKeychain周りの環境を整えます。
1-1. Developer Program証明書インストール
テストだけでもCarthage使うためには必要なので、インストールします。
ここの6にあるように、証明書秘密鍵にxcsbuildd
などの権限を付けてあげましょう。
注意点
Screen Sharing越しだとKeychainのアクセス権限変更ができない(ずっとカーソルぐるぐる)ので、直接触りましょう。
1-2. GithubのID/Password
git config --global credential.helper osxkeychain
してKeychainにID/Passwordを保存するように設定。
その後、git cloneするなりpod installするなどしながらPrivate RepositoryやGithub Enterprise上のレポジトリなどの取得に必要なID/Password情報を保存。
1-3. SSH Key設定
Carthageで--use-ssh
できるように、ssh-keygen
(パスフレーズなしの方が_xcsbuildd
用の設定が楽)で鍵を生成、Github等に登録する。
ssh -T git@github.com
などで接続確認。
2. Xcode Server起動
3. _xcsbuilddのシェル選択
OSX Server上のUsersでShow System Accounts
> _xcsbuildd
を選択 > Advanced Options
でシェルを/bin/false
から/bin/bash
に変更(参考)。
4. Keychain情報のコピー
例えば「必要なKeychain ItemをSystemに移す」、「Portal.keychainを一時退避させて変更」などの方法もあると思いますが、上記で設定したKeychainをそのまま使いたかったので、下記手順でlogin.keychainをPortal.keychainに移し替える方法をとりました。
$ cp ~/Library/Keychain/login.keychain ~/Desktop/Portal.keychain
$ # パスワードをPortal.keychain用に変更
$ security set-keychain-password -p "`sudo cat /Library/Developer/XcodeServer/SharedSecrets/PortalKeychainSharedSecret`" ~/Desktop/Portal.keychain
$ sudo chown _xcsbuildd:_xcs ~/Desktop/Portal.keychain
$ sudo cp ~/Desktop/Portal.keychain /Library/Developer/XcodeServer/Keychains/
5. SSH Keyの複製
$ # 通常ログインユーザー
$ cat ~/.ssh/id_rsa | bcopy
$ sudo su - _xcsbuildd
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ vim ~/.ssh/id_rsa # ペースト
$ chmod 600 ~/.ssh/id_rsa
$ ssh -T git@github.com # GHEがあるならそちらも
6. Create Bot
Before Trigger
のShell Scriptは最低限こんな感じ。
#!/bin/bash
# これが多分大事。前以てKeychainのロックを外してあげる
security unlock-keychain -p `cat /Library/Developer/XcodeServer/SharedSecrets/PortalKeychainSharedSecret`
cd <repository-name>
export LANG=en_US.UTF-8
/usr/local/bin/pod install
/usr/local/bin/carthage bootstrap --platform iOS --use-ssh
トラブルシューティング
CocoaPodsでなんかエラー出る
とりあえず
sudo su - _xcsbuildd
rm -rf ~/.cocoapods
Keychainがきちんと設定されていればPrivateなrepoも取得してくれるので消した状態でそのままBotを走らせてしまいましょう。
ずっとIntegration Pending
まずはPendingなBotを全てキャンセルして、Xcode Serverを一度停止、再開してみましょう。
それでうまくいかない場合は、全てのBotsが消え、_xcsbuilddの設定も最初からになるけれど以下のコマンドで初期化できます。
$ sudo xcrun xcscontrol --reset
オチ
Xcode7.1時点では、Coverageタブを選択した瞬間落ちるんですよね。。
↑テストがビルド失敗してる時だけでした