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><none></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等の外部サービスを利用するのが手取り早いです。