Jenkinsからiosアプリをビルド

投稿者: | 2018年9月3日

Jenkinsからiosアプリをビルドします。
正確にはJenkinsとMacマシンを連携してiosアプリをビルドしipaファイルを作成します。
構成は下記のようになります。

JenkinsとMacの通信はSSHですが認証はパスワードとしています。
公開鍵認証の方が連携は楽でしたが今回は既存のユーザーをそのまま使用するという制限があったためこの方法となりました。
まずはjenkinsサーバに配置するシェルスクリプトを作成します。
Macマシンのソースを移しビルドを実行するものとなります。

cd /var/lib/jenkins/script/
vi ios_build.sh
#!/bin/sh -xe
LOG_OUTPUT=/var/lib/jenkins/script/app/build.log
HOST=ビルド用のMacマシンのホスト
USER=ビルド用のMacマシンのユーザー名
PASS=ビルド用のMacマシンのパスワード
TARGET_FILE=/var/lib/jenkins/jobs/ios_build/workspace/ios.zip
TARGET_DIR=/Users/user/Work/
APP_FILE=/Users/user/Work/trunk/sr/ios/build/ios.ipa
APP_DIR=/var/lib/jenkins/script/app/
MAC_SCRIPT=/Users/user/Work/create_ipa.sh
WEBDAV_ROOT=/var/www/app/smarece/
rm -f ios.zip
zip -r ./ios.zip ./trunk/sr/ios
expect -c "
spawn scp -P 9022 ${TARGET_FILE} ${USER}@${HOST}:${TARGET_DIR}
expect \"Password:\"
send \"${PASS}\n\"
expect eof
exit
"
expect -c "
set timeout 120
spawn ssh ${USER}@${HOST} -p 9022
expect \"Password:\"
send \"${PASS}\n\"
expect \"Last login:\"
send \"${MAC_SCRIPT}\n\"
expect \"build complete!!!\"
send \"exit 0\n\"
expect eof
exit
"
expect -c "
spawn scp -P 9022 ${USER}@${HOST}:${APP_FILE} ${APP_DIR}
expect \"Password:\"
send \"${PASS}\n\"
expect eof
exit
"
git_commit=$2
cp ${APP_DIR}'ios.ipa' ${WEBDAV_ROOT}'ios_'$git_commit'.ipa'

上記の例ではパスワード認証を突破するためにexpectを使用しています。
また、SSHコマンドの引数からシェルを実行した場合にpodコマンドが使用できなかったためsendから実行しています。
加えて、xcodebuildが長くexpectが途中で中断してしまうためタイムアウト値を設定しました。
続いて、Mac側に配置するスマホアプリのビルドスクリプトを作成します。
ユーザー直下にWorkディレクトリを作成しそこで作業を行います。

$ mkdir Work
$ cd /Work/
$ vi Work/create_ipa.sh
#!/bin/sh -xe
WORK_PATH=/Users/user/Work
rm -rf ${WORK_PATH}'/trunk'
cd /Users/user/Work
unzip ios.zip
cd ${WORK_PATH}'/smartapp/ios'
mkdir build
pod install
security unlock-keychain -p user ~/Library/Keychains/login.keychain
xcodebuild -workspace ./Project.xcworkspace -scheme Project-Stage -configuration Debug archive -archivePath ./build/Project
cp /Users/user/Work/ExportOptions.plist ${WORK_PATH}'/smartapp/ios/build/'
xcodebuild -exportArchive -archivePath ./build/Project.xcarchive -exportPath ./build/ -exportOptionsPlist ./build/exportOptions.plist
mv ./build/*.ipa ./build/ios.ipa
rm /Users/user/Work/ios.zip
echo "build complete!!!"

ipaファイルを作成するためにplistファイルを作成します。

$ vi ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>compileBitcode</key>
  <false/>
  <key>method</key>
  <string>ad-hoc</string>
  <key>signingStyle</key>
  <string>automatic</string>
  <key>stripSwiftSymbols</key>
  <true/>
  <key>teamID</key>
  <string>チームID</string>
  <key>thinning</key>
  <string>&lt;none&gt;</string>
</dict>
</plist>

xcodebuildについては過去に詳しく記事を書いてますのでこちらをご参考ください。
https://protocol.nekono.tokyo/2018/06/11/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7ios%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%A8%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0/
最後にJenkinsのジョブを作成します。
ジョブ内の処理は2つ、GITリポジトリからのソースコード取得とシェルスクリプトの実行になります。
シェルスクリプトは下記の形で埋め込みます。

ここまでビルドの設定が完了です。
ビルドをするとWEBDAVにファイルが配置されます。

プロジェクト内でiOSのビルドを自動化したい要望が多々あるものの社内環境の制限が多く実行に移すまで時間がかかりました。
特に制限事項がないのであればDeployGateやTestFlight等の外部サービスを利用するのが手取り早いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA