
【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
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境