【iOS】 Jenkinsによる自動ビルド

【iOS】 Jenkinsによる自動ビルド

takano(ビルド職人)です。
iOSアプリの自動ビルドについて書きたいと思います。
弊社では開発中のアプリをいつでも迅速に動作確認できるようにビルド専用のMacを用意し、
Jenkinsを使ってビルド〜Deploygateへのアップロードまでを自動化しています。
これまでXcodeのバーションが変わる度にビルドエラーが発生し、その都度Jenkinsの設定を変更するということが続いていましたが様々な試行錯誤をしてようやく安定した方法にたどり着いたので
ざっくりとビルドプロセスを紹介します。

使用しているJenkinsプラグインは?

以下のプラグインを使用しています。

  • Git Plugin
  • rbenv plugin
  • Environment Injector
  • Xcode Plugin

Git Plugin

Githubリポジトリから最新ソースコードを取得します。

rbenv plugin

Jenkinsでrbenvを使用します。
ビルド実行前にbundle install、pod installを行うためrubyが必要となります。

Environment Injector

プロジェクト毎にXcodeのバージョンが異なるため、環境変数に使用するXcodeのパスを設定します。

Xcode Plugin

このプラグインでアーカイブ、エクスポートまでを行えますが、
Xcode9になってからはエクスポートでエラーが発生するようになりました。
アーカイブのみXcode Pluginで行い、ipaのエクスポートはxcodebuildを実行します。

ビルドプロセス

ざっくりビルドプロセスは以下のようになります。

  • Githubから最新ソースコードを取得
  • ビルド前の処理
  • ビルド(アーカイブ、エクスポート)
  • Deploygateへipaをアップロード

1. Githubから最新ソースコードを取得

リポジトリ、ブランチを指定して最新ソースコードを取得します。
ここは特別な事はしていません。

2. ビルド前処理

cocoapodsのインストール、cocoapodsライブラリののインストールを行います。

bundle install --path=.bundle
bundle exec pod install

3. ビルド(アーカイブ、エクスポート)

アーカイブ

Xcode Pluginでアーカイブを行います。
「Pack application, build and sign .ipa?」のチェックは外しておきます。

エクスポート

xcodebuildコマンドを実行します。
ExportOptions.plistが必要になります。

コマンド

/usr/bin/xcodebuild -exportArchive -archivePath ${WORKSPACE}/build/file_name.xcarchive -exportPath ${WORKSPACE}/build/ -exportOptionsPlist ${WORKSPACE}/path/ExportOptions.plist

ExportOptions.plist

例)enteriseでエクスポート
<plist version="1.0">
<dict>
	<key>compileBitcode</key>
	<false/>
	<key>signingStyle</key>
	<string>manual</string>
	<key>teamID</key>
	<string>チームID</string>
	<key>signingCertificate</key>
	<string>証明書名</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>バンドルID</key>
		<string>プロビジョニングプロファイル名</string>
	</dict>
	<key>method</key>
	<string>enterprise</string>
</dict>
</plist>

Deploygateへアップロード

エクスポート後にDeploygate APIを呼び出してipaのアップロードを行います。

curl -F "token=xxxxxx" -F "file=@build/file_name.ipa" -F "distribution_key=xxxxxxx" https://deploygate.com/api/users/user_name/apps

これで完了です。
この後chatworkにビルドの成功・失敗を通知していますが、割愛。(chatwork pluguinを使っています。)

ちょっと気になるなぁ

安定した方法を構築できているものの、まだ気になっていることがあります。
Xcode plugin使わずに自力でxcodebuildでアーカイブしていいんじゃない?、Xcode Serverによるビルドも試してみたいな。Fastlaneによるビルドも捨てがたいな。ジョブ作成も自動化したいな とか。今後も研究していきます。
(以前はJenkinsでFastlaneを実行してビルドしていた事もありましたが、FastlaneもXcodeのバージョンが変わる度に変更が発生するので断念)

最後にtry! Swiftにて

try! SwiftのCyber AgentさんのブースでCIについてのアンケートがあったので写真を撮らせていただきました。

Jenkins多いですね!

TAG

  • このエントリーをはてなブックマークに追加
takano
takano takano

素晴らしいアプリを開発して世の中をもっとハッピーにしたい! ビール大好き!卓球大好き!音楽大好き! 最近は子供とおかあさんといっしょを見てるせいで「ブンバボーン」の脳内再生が止まりません。