LoginSignup
15
14

More than 5 years have passed since last update.

Xcode CI Server with Private Dependencies

Last updated at Posted at 2015-11-05

背景

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タブを選択した瞬間落ちるんですよね。。
↑テストがビルド失敗してる時だけでした

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14