2013年1月28日

【iPhone】Jenkins CIで自動ビルド


毎日毎日、コードを書きまくっているdommyです。
iPhoneもAndroidも書いてるんですが、ビルドって時間掛かりますよね?
しかも、アプリってリリースからバージョンアップまでのサイクルが短い。
直してはテスト、直してはテスト。もううんざりです。

ってな訳でCIサーバを用意してみました。
今回はiPhoneのアプリビルド方法を書きます。


環境

プロジェクト管理はこんな感じで行なっていると考えてください。

あくまで理想です、理想。
JenkinsからデバイスへはTestFlight的な何かを入れたいんですけどね。
まぁ、ipaとかそのままインストール出来るんで問題ないんですけど。

で、JenkinsでiPhone用プロジェクトを作成しますが、
Shellでipaまで作成します。

ビルドスクリプト

いろいろJenkinsの設定をして、ビルドのところにシェルスクリプトを書いきます。
Xcodeのビルドも出来るのですが、ローカルで出来るか実行してからJenkinsに移しているので、
スクリプトをそのまま書いちゃってます。

#!/bin/sh                                                                                                                  
####################################################
# author dommy
# created 2012-11-14
# Jenkins Build Script for Sample iOS App
####################################################
# Environment Variables
SDK="iphoneos"
# change these by environment
SRCROOT=${WORKSPACE}
PROVISIONING_ID="243F24-2233F-39C2-AEDD-192FE93B3"
USER_HOME="/Users/jenkins"
KEYCHAIN_PASSWORD="keychain password"
PROVISIONING_PATH="${USER_HOME}/Library/MobileDevice/Provisioning Profiles/${PROVISIONING_ID}.mobileprovision"
KEYCHAIN_PATH="${USER_HOME}/Library/Keychains/login.keychain"

PROJECT_NAME="SampleApp"
CODE_SIGN_IDENTITY="iPhone Developer: dommy!"

# crean up old artifacts
rm -rf "${SRCROOT}/artifacts"

security list-keychains -s ${KEYCHAIN_PATH}
security default-keychain -s ${KEYCHAIN_PATH}
security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}

########## BUILD with DEBUG CONFIGURATION ##########
# Environment Variables
CONFIGURATION="Debug"
OUTPUT_APP_DIR="${SRCROOT}/artifacts/${CONFIGURATION}/app"
OUTPUT_IPA_DIR="${SRCROOT}/artifacts/${CONFIGURATION}/ipa"

# create output directory
mkdir -p $OUTPUT_APP_DIR
mkdir -p $OUTPUT_IPA_DIR

# build project. creating .app file
xcodebuild -project ${PROJECT_NAME}.xcodeproj -sdk "${SDK}" -configuration ${CONFIGURATION} -target ${PROJECT_NAME} clean build install DSTROOT="${OUTPUT_APP_DIR}" 

# create .ipa file
xcrun -sdk "${SDK}" PackageApplication "${OUTPUT_APP_DIR}/Applications/${PROJECT_NAME}.app" -o "${OUTPUT_IPA_DIR}/${PROJECT_NAME}.ipa" --sign "${CODE_SIGN_IDENTITY}" --embed "${PROVISIONING_PATH}"

と、こんな感じでビルドスクリプトを書いて、"Build Now"
すると、workspaceに.ipaファイルが出来ますので、それをインストールしてダウンロード。

ホントはここをOTAにしたいところですが、まだ先の話。
(いずれはします。)

で、これを書いたのでは、User Interaction is not allowedってエラーが起きて、
解決方法を書いておきたかったからなのですが、
それはまた次回書きます。