【Mac】Jenkins Pluginを使わずにipa自動ビルド環境を構築する

プラグインなしで上手くいったのでメモ
個人で使う場合はこれで十分
業務で使う場合はバージョン毎に出力やサーバーへアップロード等必要だな〜
（各種設定ファイル調整も）

使用環境
・Unity2017.0.0f3

前提条件
・手動でipaビルドまでできる環境が揃っていること
・HomeBrewをインストールしていること
・JDKインストール済み

# Jenkins構築
## Jenkinsインストール
```
brew install jenkins
```

起動コマンド
launchctl start homebrew.mxcl.jenkins
終了コマンド
launchctl stop homebrew.mxcl.jenkins

＜参考＞
・https://qiita.com/makoto_kw/items/cbe93d4ebbc35f3b43fd

# シェルコマンド作成、実行
プロジェクトフォルダ階層想定
[ROOT]
LAutoBuildProject(Unityプロジェクトルート、Assetsフォルダあり)
Lbuild_archive(ipaビルド保存先)
LSettingFiles(各種設定ファイル保存先)
LTmp(一時フォルダ)

## ファイル用意
・手動時のビルド同様、BuildSettingsに追加されているシーンを含めてビルド

```BuildClass.cs
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;

public class BuildClass
{

	/// <summary>
	/// iOSのビルドを行います
	/// </summary>
	public static void BuildiOS()
	{
		string errorMessage = BuildPipeline.BuildPlayer(
			GetSceneList().ToArray(),
			"[Rootフォルダパス]/XCode",
			BuildTarget.iOS,
			BuildOptions.None
		);

		if(!string.IsNullOrEmpty(errorMessage)){
			Debug.LogError("[Error!]" + "error");
		} else {
			Debug.Log("[Success!]");
		}
	}

	private static List<string> GetSceneList() {
		List<string> levels = new List<string>();
		foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
			if (scene.enabled) {
				levels.Add(scene.path);
			}
		}
		return levels;
	}
}
```

・[Root]/SettingFilesにplistとプロビジョニングプロファイルを配置

```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>method</key>
    <string>app-store</string>
    <key>uploadBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <true/>
</dict>
</plist>
```

## 各種ディレクトリパス作成
・必要なPathを設定

```
# プロジェクトルート buildPathRoot
PROJECT_ROOT_PATH="[ROOT]パス";
# UNITYプロジェクトパス
UNITY_PROJECT_PATH="${PROJECT_ROOT_PATH}/AutoBuildProject"
# IPA出力フォルダ
ARCHIVE_FILE_PATH="${PROJECT_ROOT_PATH}/build_archive";
# IPA出力設定フォルダ
IOS_SETTING_PATH="${PROJECT_ROOT_PATH}/SettingFiles";
# WORKフォルダ
WORK_FOLDER="${PROJECT_ROOT_PATH}/Tmp";
```

## Gitリポジトリ更新
・ローカルを最新に更新(Git連携なしならスキップ)

```
# ===== Git Pull =====
cd "${UNITY_PROJECT_PATH}"
git pull
```

## Unity-iOSビルド
```
# ===== Unity IOS Build =====
/Applications/Unity/Unity.app/Contents/MacOS/Unity \
    -batchmode \
    -quit \
    -logFile "${WORK_FOLDER}/build.log" \
    -projectPath "${UNITY_PROJECT_PATH}" \
    -executeMethod BuildClass.BuildiOS
```

## XCodeビルド
・チームコードはGeneral>Signingに書かれている10桁の文字列
・プロビジョニングファイルを「IOS_SETTING_PATH」のパスへ保存
　（ファイル名はAutoDebugSettingで変更したい場合は以下のコードを編集）

```
# ===== XCode Build =====
# IOS_TEAM_CODE(10桁)
TEAM_CODE="[チームコード]"
# XCode Export Folder Name
XCODE_BUILD_FOLDER="XCode"
cd "${PROJECT_ROOT_PATH}/${XCODE_BUILD_FOLDER}"
builds=()
for file in *; do
    builds=("${file}" "${builds[@]}")
done

# Scheme
TARGET="Unity-iPhone"
# プロビジョニングプロファイル
PROFILE_PATH="${settingFiles}/AutoDebugSetting.mobileprovision"

if [ ! -d ${ARCHIVE_FILE_PATH} ]; then
    mkdir "${ARCHIVE_FILE_PATH}"
fi

xcodebuild -project "${PROJECT_ROOT_PATH}/${XCODE_BUILD_FOLDER}/${TARGET}.xcodeproj" \
               -scheme "${TARGET}" \
               archive \
               -archivePath "${ARCHIVE_FILE_PATH}/archive" \
               DEVELOPMENT_TEAM=${TEAM_CODE}
			   
# xcodeプロジェクトのビルドに失敗した場合
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
  cat "can not build app file"
  exit $EXIT_CODE
fi
```

## IPA Export
```
xcodebuild \
	-exportArchive -archivePath "${ARCHIVE_FILE_PATH}/archive.xcarchive" \
    -exportPath "${ARCHIVE_FILE_PATH}" \
    -exportOptionsPlist "${IOS_SETTING_PATH}/exportOptions.plist"

# ipaへの変換に失敗した場合
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
  cat "can not build ipa file"
  exit $EXIT_CODE
fi
```

＜参考URL＞
・[OS XにJenkinsをHomebrewでセットアップする](https://qiita.com/makoto_kw/items/cbe93d4ebbc35f3b43fd)
・[コマンドラインからUnityのビルドを走らせる。 -基礎編-](https://qiita.com/sango/items/474efb4c016a136c84ce)
・[Jenkins Pluginに頼らずシェルだけでJobを構築する（ios開発アプリ転送編）](https://qiita.com/ko2ic/items/86c66766e94551d4c726)
・[UnityのiOSアプリをアーカイブまでJenkinsで自動化した話](https://qiita.com/Akira_Kido_N/items/f428aa0bad2c3fa1f6e9)
・[xcodebuildでipa作成 -exportOptionsPlist対応版](https://qiita.com/roworks/items/7ef12acabf9679561d84)