CIを使ってテストを自動化しようとしたところ有償プランでないとSwiftの利用が出来なかったため
MacOS上でJenkinsを動かしてSwiftをビルド出来る環境を構築しました。
構築時にハマり所がいくつかあったので、それ含めて構築手順を共有します。
# 環境
- MacOS 10.11.6
- Xcode 7.2.1
- Jenkins 2.46.2
###備考
- CocoaPodを使ってライブラリを読み込んでいる
- BridgeHeaderを使ってObjective-Cライブラリを読み込んでいる
# Jenkinsのインストール
-
Jenkins公式サイトからmacOS用のインストーラーをダウンロード。
https://jenkins.io/content/thank-you-downloading-os-x-installer#stable -
Jenkinsをインストール
ウィザードに従ってJenkinsをインストールする
デフォルトのままであれば/Users/Shared/Jenkins
にインストールされます。 -
プラグインのインストール
Jenkinsのインストール時に必要なプラグインを聞かれるのでGitとXcodeのインストールを行います。プラグイン バージョン git 3.3.0 git-client 2.4.5 git-parameter 0.8.0 xcode-plugin 1.4.11
# ポート開放
-
ルーターの設定
GitプラグインはUDPの33,848ポートを使用してモジュールを取得するようです。
ポートが開放されていないとエラーとなるのでルーターの設定を変更します。AirMacベースステーションの場合
AirMacユーティリティを起動しネットワーク > ポート設定
からUDPの33,848番ポートを開放する。
# Gitプラグインのセットアップ
-
「Jenkinsの管理 > Git Plugin」を設定
Gitで利用している設定を記載する
項目 値 user.name gitアカウントのユーザ名 user.email gitアカウントのe-mail -
JOBの「設定 > ソースコード管理」を設定する
項目 値 リポジトリURL GithubのリポジトリURL 認証情報 プライベートリポジトリにアクセスするための秘密鍵を設定 ブランチ指定子 ビルド対象とするブランチ名
秘密鍵を使ってアクセスする場合は
/Users/Shared/Jenkins/.ssh
に秘密鍵を置かないと
Jenkinsから鍵を参照することが出来ません。
# Xcodeプラグインのセットアップ
-
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の場合。拡張子は不要なので記載しないこと。
# Xcodeの設定
-
Gitからモジュールを取得する
Jenkinsからコマンドを実行するとJenkinsユーザで実行されるので、パーミッションエラーとなる場合は設定を確認する。
デフォルトの設定ではUser/Shared/Jenkins/Home/【JOB名】
にレポジトリ内のファイルが展開される。 -
プロジェクトやライブラリの共有設定をONにする
User/Shared/Jenkins/Home/【JOB名】
以下のプロジェクトファイルをXcodeで開き、Manage Shemesを選択する。
表示されたウィンドウでプロジェクトや利用しているライブラリのSharedチェックボックスにチェックを入れる
Xcodeから共有設定をONにしようとすると、Xcodeは開発者ユーザで起動していて、プロジェクトファイルの権限はJenkinsユーザなので書き込みが出来ません。そのため、chowndで一時的にプロジェクトファイルの権限を開発者ユーザに変更して実施しています。
# ビルドを実行
Jenkinsからビルドを実行してエラーが出ないことを確認する
# エラーとなる場合
###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を指定する。
# 参考
http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html
http://qiita.com/mokemokechicken/items/5ea39c87512a515071f5