Xcode
iOS
Jenkins
CI
Unity

【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でセットアップする
コマンドラインからUnityのビルドを走らせる。 -基礎編-
Jenkins Pluginに頼らずシェルだけでJobを構築する(ios開発アプリ転送編)
UnityのiOSアプリをアーカイブまでJenkinsで自動化した話
xcodebuildでipa作成 -exportOptionsPlist対応版