Skip to content

Instantly share code, notes, and snippets.

@chiuan
Forked from jmcguirk/PerformBuild.cs
Created March 30, 2016 14:42
Show Gist options
  • Save chiuan/804346927cc6156168993a750695a4bb to your computer and use it in GitHub Desktop.
Save chiuan/804346927cc6156168993a750695a4bb to your computer and use it in GitHub Desktop.
Unity3D Ant Build Configuration
<?xml version="1.0" encoding="UTF-8"?>
<project name="Honorbound" default="main" basedir=".">
<property environment="env"/>
<property name="RAW_BUILD_NUMBER" value="${env.BUILD_NUMBER}"/>
<script language="javascript"><![CDATA[
var buildNum = parseInt(project.getProperty("RAW_BUILD_NUMBER"))
var minorBuildNumber = buildNum % 100;
var majorBuildNumber = (Math.floor(buildNum / 100)) % 100;
var uberBuildNumber = (Math.floor(buildNum / 10000)) % 100;
project.setProperty("minorBuildNumber", minorBuildNumber);
project.setProperty("majorBuildNumber", majorBuildNumber);
project.setProperty("uberBuildNumber", uberBuildNumber);
]]></script>
<property name="VERSION_STRING" value="${uberBuildNumber}.${majorBuildNumber}.${minorBuildNumber}"/>
<property file="settings.properties"/>
<property name="dev.dir.absolute" location="${dev.dir}"/>
<tstamp>
<format property="TODAY_STAMP" pattern="yyyy_MM_dd" locale="en,US"/>
</tstamp>
<tstamp>
<format property="MONTH_STAMP" pattern="M" locale="en,US"/>
</tstamp>
<property name="VERSION_NUM" value="${uberBuildNumber}.${majorBuildNumber}.${minorBuildNumber}"/>
<property name="VERSION_STRING" value="honorbound_${VERSION_NUM}"/>
<target name="main" depends="ios, android, zipDsym" />
<target name="android" depends="compile-android" />
<target name="ios" depends="compile-ios" />
<target name="clean">
<echo message="Cleaning Build Space"/>
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}"/>
</target>
<target name="compile-ios" depends="clean">
<echo message="Compiling unity project for version ${VERSION_STRING}"/>
<echo message="${unity.bin} -projectPath ${dev.dir.absolute} -executeMethod PerformBuild.CommandLineBuild -batchmode -quit"/>
<exec executable="${unity.bin}" failonerror="true">
<arg line="-projectPath ${dev.dir.absolute}"/>
<arg line="-executeMethod PerformBuild.CommandLineBuild"/>
<arg line="-batchmode"/>
<arg line="-quit"/>
</exec>
<replace file="${dev.dir.absolute}/Build/iPhone/Info.plist" preservelastmodified="true">
<replacefilter token="999.999.999" value="${VERSION_NUM}" />
</replace>
<exec executable="${security.bin}" failonerror="true">
<arg value="unlock-keychain"/>
<arg line="-p ${keychain.password}"/>
</exec>
<echo message="Building ${dev.dir.absolute}/Build/iPhone/Unity-iPhone.xcodeproj/ Sym Root ${dev.dir.absolute}/Build/iPhone/"/>
<exec executable="${xcode.bin}" failonerror="true">
<arg line="-project ${dev.dir.absolute}/Build/iPhone/Unity-iPhone.xcodeproj/"/>
<arg line="PROVISIONING_PROFILE=${provisioning.guid}"/>
<arg line="-sdk iphoneos"/>
<arg line='CODE_SIGN_IDENTITY="${codesign.identity}"'/>
<arg line='GCC_GENERATE_DEBUGGING_SYMBOLS=YES'/>
<arg line='DEBUG_INFORMATION_FORMAT=dwarf-with-dsym'/>
<arg line='DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT=YES'/>
<arg line='DEBUGGING_SYMBOLS=YES'/>
<arg line="-configuration Release"/>
</exec>
<exec executable="${xcrun.bin}" failonerror="true">
<arg line="-sdk iphoneos"/>
<arg line="PackageApplication"/>
<arg line="-v ${dev.dir.absolute}/Build/iPhone/build/${APP_NAME}.app"/>
<arg line="-o ${dev.dir.absolute}/Build/iPhone/build/${APP_NAME}.ipa"/>
</exec>
<copy file="${dev.dir.absolute}/Build/iPhone/build/${APP_NAME}.ipa" tofile="${ios.build.deploy.folder}/${VERSION_STRING}.ipa"/>
</target>
<target name="compile-android" depends="clean">
<echo message="Compiling unity project for android version ${VERSION_STRING}"/>
<echo message="${unity.bin} -projectPath ${dev.dir.absolute} -executeMethod PerformBuild.CommandLineBuildAndroid -batchmode -quit"/>
<exec executable="${unity.bin}" failonerror="true">
<arg line="-projectPath ${dev.dir.absolute}"/>
<arg line="-executeMethod PerformBuild.CommandLineBuildAndroid"/>
<arg line="-batchmode"/>
<arg line="-quit"/>
</exec>
<copy file="${dev.dir.absolute}/build/android" tofile="${android.build.deploy.folder}/${VERSION_STRING}.apk"/>
<exec executable="curl" dir="${android.build.deploy.folder}">
<arg line="--form file=@${VERSION_STRING}.apk '${BUILD_URL}/save_file.php?appname=${APP_NAME}'" />
</exec>
</target>
<target name="zipDsym">
<echo message="Zipping dSym"/>
<exec executable="zip" dir="${dev.dir.absolute}/Build/iPhone/build" failonerror="true">
<arg value="-r"/>
<arg value="${APP_NAME}.app.dSYM.zip"/>
<arg value="${APP_NAME}.app.dSYM"/>
</exec>
</target>
</project>
// C# example
using UnityEditor;
using System.IO;
using System.Collections;
using UnityEngine;
using System.Collections.Generic;
class PerformBuild
{
static string[] GetBuildScenes()
{
List<string> names = new List<string>();
foreach(EditorBuildSettingsScene e in EditorBuildSettings.scenes)
{
if(e==null)
continue;
if(e.enabled)
names.Add(e.path);
}
return names.ToArray();
}
static string GetBuildPath()
{
return "build/iPhone";
}
[UnityEditor.MenuItem("CUSTOM/Test Command Line Build Step")]
static void CommandLineBuild ()
{
Debug.Log("Command line build\n------------------\n------------------");
string[] scenes = GetBuildScenes();
string path = GetBuildPath();
if(scenes == null || scenes.Length==0 || path == null)
return;
Debug.Log(string.Format("Path: \"{0}\"", path));
for(int i=0; i<scenes.Length; ++i)
{
Debug.Log(string.Format("Scene[{0}]: \"{1}\"", i, scenes[i]));
}
Debug.Log("Starting Build!");
BuildPipeline.BuildPlayer(scenes, path, BuildTarget.iPhone, BuildOptions.None);
}
static string GetBuildPathAndroid()
{
return "build/android";
}
[UnityEditor.MenuItem("CUSTOM/Test Command Line Build Step Android")]
static void CommandLineBuildAndroid ()
{
Debug.Log("Command line build android version\n------------------\n------------------");
string[] scenes = GetBuildScenes();
string path = GetBuildPathAndroid();
if(scenes == null || scenes.Length==0 || path == null)
return;
Debug.Log(string.Format("Path: \"{0}\"", path));
for(int i=0; i<scenes.Length; ++i)
{
Debug.Log(string.Format("Scene[{0}]: \"{1}\"", i, scenes[i]));
}
Debug.Log("Starting Android Build!");
BuildPipeline.BuildPlayer(scenes, path, BuildTarget.Android, BuildOptions.None);
}
}
unity.bin = /Applications/Unity/Unity.app/Contents/MacOS/Unity
xcode.bin = /usr/bin/xcodebuild
xcrun.bin = /usr/bin/xcrun
security.bin = /usr/bin/security
provisioning.guid = SOME-GUID-GOES-HERE
codesign.identity = iPhone Distribution: Joe Developer
build.dir = ../UnityClient/build
dev.dir = ../UnityClient/
keychain.password = Woohoo
APP_NAME=honorbound
ios.build.deploy.folder = /Users/Shared/Jenkins/builds/ios
android.build.deploy.folder = /Users/Shared/Jenkins/builds/android
BUILD_URL = http://OUR-CUSTOM-BUILD-SERVER/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment