Unity ビルド自動化 - Jenkins
Unity ビルド自動化 - Jenkins
Build シリーズ (4 / 7)
Jenkins について
- Jenkins はクライアント/サーバー両方のビルドを支える共通ツール。
- Toyverse ではサーバー/クライアントとも Jenkins でビルドと配布を実施した。
プロジェクトは Alpha / Dev / Real に分割。
Dev = 開発中ブランチ、
Alpha = QA / 社内テストブランチ、
Real = 本番/ストア向けブランチ。
- クライアント側は Alpha/Dev/Real 向け aos/ios ビルド jobs を運用。
- サーバー側は API / CMS / Realtime ビルドを運用。
押さえておく Jenkins 基本
- Jenkins ローカル workspace パス:
./jenkins - workspace - Dashboard で作った job はビルドマシンの workspace に個別フォルダとして増える。
ディスク消費はかなり大きい。専用ビルドマシンを置く理由になるレベル。Jenkins backup/plugin/cache/job 一式で 600GB 近くまで増えることもある。
下画像は mac finder 上の Jenkins job プロジェクト群。ほぼ Unity プロジェクトなので容量増加が大きい。
一見すると分割しすぎで非効率に見えるが、理由がある。
- Hotfix ブランチ
- 本番開始後は QA 未検出バグや高負荷由来バグが必ず出る。
- この時、本番ブランチ基準の hotfix ブランチで迅速対応が必要。
- 開発中の develop をそのまま本番に出すことはできない。
- この運用上の理由で Dev / Real / Alpha に jobs を分割する。
- iOS Certificates / Identifiers / Profiles
- iOS 開発では Ad hoc/In House、Enterprise、Distribution、Development などを使い分ける。
- Apple Login / IAP 等の可否がプロファイル別に異なる。
- 例えば Enterprise では使えないが In House ではテスト可能、といった差がある。
- これも jobs 分割理由の一つ。
- iOS Certificates / Identifiers / Profiles
- 最大の理由は本番サーバーと Dev サーバーの分離。DB/API が異なるため、ビルドラインも分離が必要。
Jenkins plugin と環境変数
- 初期セットアップ情報は多いので、ここでは必須寄りの plugin / env var に限定。
場所: Jenkins Dashboard - Jenkins 管理 - System Configuration
Plugin
- Jenkins 機能拡張のため plugin は必須。
- 代表例: Xcode integration, Unity3d plugin, App Center, Slack Notifications, Gradle, GitLab, Github Branch Source, Ant。
環境変数
- Jenkins 全体で使う key/value (パス、ID、トークン等) を設定。
- 代表値: ビルドマシン project path、Unity path、apk/ipa upload path、Slack key、Apple Developer team ID など。
Jenkins 活用法
- Jenkins には Pipeline script、General plugin 設定など様々な方法がある。
- 個人的には Execute shell スクリプトで回すのが最も簡単だった。
- build trigger / environment / post-build action は、後処理をスクリプト化していれば大きく触らなくて良い。
General タブ - パラメータ追加
- string / bool パラメータを作ってビルド時に利用できる。
例: branch name パラメータを使って特定ブランチ最新版をビルド。
bool は環境別分岐に便利 (例: Apple Login は InHouse のみ、Enterprise では失敗するケース)。
- パラメータ付き build では次のように入力 UI が出る。
ここで branch 名や bool 値を指定する。
General タブ - Git ブランチ
Execute shell
iOS ビルドスクリプト
- aos より複雑。Unity project -> Xcode project -> ipa の順で進むため。
1
2
rm -rf /Users/YOUR_USERNAME/Build/toyverse_ipa
mkdir /Users/YOUR_USERNAME/Build/toyverse_ipa
- 最終 ipa 出力先を一度クリアして再生成。
1
2
3
4
pwd
locale
export LANG=en_US.UTF-8
locale
- xcworkspace 生成問題 対応で追加した部分。
1
2
3
4
5
6
XCODE_PATH=/Users/YOUR_USERNAME/Xcode
ENTITLEMENTS=Entitlements.entitlements
TMP_FILE=tmp.txt
rm -rf ${XCODE_PATH}
mkdir ${XCODE_PATH}
- Unity 側 iOS ビルドで Xcode プロジェクトが生成されるため、その出力先も初期化。
1
2
3
4
5
echo ------------------------------------- FASTLANE_SETTING
rm -rf "${WORKSPACE}/fastlane/Fastfile"
rm -rf "${WORKSPACE}/fastlane/Gymfile"
cp "${WORKSPACE}/fastlane/Fast/Fastfile_enterprise" "${WORKSPACE}/fastlane/Fastfile"
cp "${WORKSPACE}/fastlane/Gym/Gymfile_enterprise" "${WORKSPACE}/fastlane/Gymfile"
- fastlane の Fastfile / Gymfile を設定。
WORKSPACEは Jenkins job のローカルパスを指す。
1
2
echo ------------------------------------- INIT
/opt/homebrew/bin/fastlane init
- fastlane 初期化。
1
2
3
4
5
echo ------------------------------------- FIREBASE_SETTING
rm -rf "${WORKSPACE}/Assets/Scripts/Manager/Firebase/Setting/GoogleService-Info.plist"
cp "${WORKSPACE}/Assets/Scripts/Manager/Firebase/Config/GoogleService-Info_enterprise.plist" "${WORKSPACE}/Assets/Scripts/Manager/Firebase/Setting/GoogleService-Info.plist"
echo ------------------------------------- UNITY IOS PROJECT BUILD
/Applications/Unity/Hub/Editor/2022.3.4f1/Unity.app/Contents/MacOS/Unity -projectPath "/Users/YOUR_USERNAME/.jenkins/workspace/(DEV)ios" -batchmode -nographics -quit -buildTarget iOS -executeMethod ProjectBuilder.BuildIOS_Dev -logfile "" build_num:${BUILD_NUMBER}
- Unity project build を batchmode 実行。
- fastlane 経由の Unity build は制約が多く、最終的に batchmode 直実行にした。
1
2
3
4
5
6
7
8
9
10
echo ------------------------------------- Pod Install
cd /Users/YOUR_USERNAME/Xcode
/opt/homebrew/bin/pod install
cd "/Users/YOUR_USERNAME/.jenkins/workspace/(DEV)ios"
if "${DEL_APPLE_LOGIN}"; then
echo ------------------------------------- Delete Sign in Apple
/usr/bin/sed '7,10d' ${XCODE_PATH}/${ENTITLEMENTS} > ${XCODE_PATH}/${TMP_FILE}
rm -rf ${XCODE_PATH}/${ENTITLEMENTS}
cp ${XCODE_PATH}/${TMP_FILE} ${XCODE_PATH}/${ENTITLEMENTS}
fi
- Xcode ビルド前に
pod installが必要。
1
2
3
4
echo ------------------------------------- XCODE PROJECT BUILD
/opt/homebrew/bin/fastlane ios build_ios_gym
echo ------------------------------------- UPLOAD APPCENTER
/opt/homebrew/bin/fastlane ios upload_appcenter
- gym file で Xcode build。
- AppCenter upload は Fastfile 側に定義済み。
AOS ビルドスクリプト
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rm -rf /Users/YOUR_USERNAME/Build/toyverse_apk
mkdir /Users/YOUR_USERNAME/Build/toyverse_apk
pwd
chmod 755 ./fastlane/change_build_num.sh
./fastlane/change_build_num.sh ${BUILD_NUMBER}
echo ------------------------------------- INIT
/opt/homebrew/bin/fastlane init
#echo ------------------------------------- ADDRESSABLE
#/opt/homebrew/bin/fastlane android addrressable
echo ------------------------------------- ANDROID BUILD
#/opt/homebrew/bin/fastlane android android
/Applications/Unity/Hub/Editor/2022.3.4f1/Unity.app/Contents/MacOS/Unity -projectPath "/Users/YOUR_USERNAME/.jenkins/workspace/(DEV)android" -batchmode -nographics -quit -buildTarget Android -executeMethod ProjectBuilder.BuildAndroid_Dev -logfile "" build_num:${BUILD_NUMBER}
echo ------------------------------------- UPLOAD APPCENTER
/opt/homebrew/bin/fastlane android upload_appcenter
Addressable スクリプト
- iOS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pwd
locale
export LANG=en_US.UTF-8
locale
echo ------------------------------------- INIT
/opt/homebrew/bin/fastlane init
echo ------------------------------------- CLEAR ADDRESSABLE
rm -rf ${WORKSPACE}/ServerData/iOS/*
echo ------------------------------------- ADDRESSABLE
"/Applications/Unity/Hub/Editor/2022.3.4f1/Unity.app/Contents/MacOS/Unity" -projectPath "/Users/YOUR_USERNAME/.jenkins/workspace/(DEV)ios_addressable" -batchmode -nographics -quit -buildTarget iOS -executeMethod ProjectBuilder.BuildAddressable_IOS_Dev -logfile
echo ------------------------------------- S3 UPLOAD
chmod 775 ${WORKSPACE}/fastlane/upload_addressable_s3.sh
${WORKSPACE}/fastlane/upload_addressable_s3.sh ${WORKSPACE}/ServerData/iOS ios ${RESOURCE_VERSION} dev alpha
- AOS
1
2
3
4
5
6
7
8
9
10
11
pwd
echo ------------------------------------- INIT
/opt/homebrew/bin/fastlane init
echo ------------------------------------- CLEAR ADDRESSABLE
rm -rf ${WORKSPACE}/ServerData/Android/*
echo ------------------------------------- ADDRESSABLE
"/Applications/Unity/Hub/Editor/2022.3.4f1/Unity.app/Contents/MacOS/Unity" -projectPath "/Users/YOUR_USERNAME/.jenkins/workspace/(DEV)android_addressable" -batchmode -nographics -quit -buildTarget Android -executeMethod ProjectBuilder.BuildAddressable_AOS_Dev -logfile
echo ------------------------------------- S3 UPLOAD
chmod 775 ${WORKSPACE}/fastlane/upload_addressable_s3.sh
${WORKSPACE}/fastlane/upload_addressable_s3.sh ${WORKSPACE}/ServerData/Android aos ${RESOURCE_VERSION} dev alpha
この記事は著者の CC BY 4.0 ライセンスの下で提供されています。















