{jenkins-plugin-info:pluginId=unity3d-plugin}

If you want to build Unity3d with Jenkins, or are already doing so, please drop a line on the Unity3d forums, and tell us more about what you do or would like to do.

Please use our tasks and issues tracker to report bugs, improvements or new feature.

Also if you want to propose some code change using a Github pull request, please open also a Jira issue. It is easier for developers to track them.

Unity3d is a powerful 3d game creation editor and engine that runs on Mac and Windows.

This plugin adds the ability to call the Unity3d Editor from the command line to automate build and packaging of Unity3d applications.

Background

Automating Unity3d builds from the command line is possible. There are a few problems though:

  • the unity runner writes its output to a separate log file, instead of the output
  • tool and file locations are platform specific
  • the editor is very GUI centered and only provides default build strategies

Features

This plugin aims to make it easier to run Unity3d builds easily in Jenkins, by adding the following features:

  • log file redirection
  • distributed builds

The plugin was tested with versions ranging from unity3d 3.4.2 to 5.0.1. Tested on distributed and single server environments

Documentation

Installation guide

As Unity3d is multi-platform, you may need to install the proper third party OS & tools (Android SDK, XCode, etc) depending on the type of build targets you intend to exercise.

Install the latest version of the plugin from the update center and configure a freestyle job (see #Usage Guide). If necessary restrict the job to the node(s) that will perform the build(s).

On the node(s) you are going to build Unity projects, add at least one unity3d installation (Manage Jenkins -> Global Tool Configuration) and configure the location of the Unity3d installation. This location is by default /Applications/Unity/Unity.app on Mac OS X and C:\Program Files (x86)\Unity on Windows. The plugin will automatically suffix the installation path with the proper executable location.

Usage guide

Prerequisites

The plugin assumes you've created a special Editor class with at least one method responsible for your build.

Here's an example extracted from one of our projects:

class MyEditorScript {
        static string[] SCENES = FindEnabledEditorScenes();

        static string APP_NAME = "YourProject";
        static string TARGET_DIR = "target";

        [MenuItem ("Custom/CI/Build Mac OS X")]
        static void PerformMacOSXBuild ()
        {
                 string target_dir = APP_NAME + ".app";
                 GenericBuild(SCENES, TARGET_DIR + "/" + target_dir, BuildTarget.StandaloneOSXIntel,BuildOptions.None);
        }

	private static string[] FindEnabledEditorScenes() {
		List<string> EditorScenes = new List<string>();
		foreach(EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
			if (!scene.enabled) continue;
			EditorScenes.Add(scene.path);
		}
		return EditorScenes.ToArray();
	}

        static void GenericBuild(string[] scenes, string target_dir, BuildTarget build_target, BuildOptions build_options)
        {
                EditorUserBuildSettings.SwitchActiveBuildTarget(build_target);
                string res = BuildPipeline.BuildPlayer(scenes,target_dir,build_target,build_options);
                if (res.Length > 0) {
                        throw new Exception("BuildPlayer failure: " + res);
                }
        }
}
User/OS setup
Mac OS X

On Mac OS X, the user running needs to be logged in otherwise the Unity3d editor might fail to acquire the graphical resources.

If you don't you might see something like

Piping unity Editor.log from /Users/Shared/Jenkins/Library/Logs/Unity/Editor.log
[Schicksalsklinge HD Windows] $ /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath "/Users/Shared/Jenkins/Home/workspace/ProjectXYZ/repo" -quit -batchmode -buildLinux32Player -executeMethod BuildProject.PerformLinuxTestBuild
Initialize mono
Mono path[0] = '/Applications/Unity/Unity.app/Contents/Frameworks/Managed'
Mono path[1] = '/Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono/2.0'
Mono config path = '/Applications/Unity/Unity.app/Contents/Frameworks/Mono/etc'
Using monoOptions --debugger-agent=transport=dt_socket,embedding=1,defer=y
_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.
2015-04-18 21:20:08.497 Unity[702:27617] NSDocumentController Info.plist warning: The values of CFBundleTypeRole entries must be 'Editor', 'Viewer', 'None', or 'Shell'.
Windows

FIXME describe and add a log about what happens on Windows.

Linux

On Linux, you will need an X server. If you are running Jenkins on a headless server, use the Xvfb Plugin. See also this thread.

Build queue

The Unity Editor can only perform one build at a time on a given projectPath. If you want to run multiple builds in parallels for the same project, you will need to create multiple jobs, each with their workspace.

Setting up a build step

Add the Unity3d build step to a free-style project, select the unity3d installation and set your command line arguments (e.g. -quit -batchmode -executeMethod MyEditorScript.PerformMacOSXBuild). If you do not specify -projectPath (case-sensitive), the plugin will use the current workspace. You may want to add an extra step to clean the project before you build to make sure the build starts in a clean state.

If you want to build for iOS, you will have to add extra build steps to trigger xcode build. This step isn't covered here. Same for Windows 8/10.

Unity3d Builder configuration parameters

Parameter

Since version

Description

command line

0.1

The full command line, the builder adding the -projectPath (case-sensitive) if it isn't specified

unstable return codes

1.0

The optional comma separated list of command line return codes that should result in unstable builds instead of failures. E.g '2,3' if you use Unity3d Test Results

Tips

Using Unity3d with large set of jobs
Automatically installing unity3d (MacOSX)

To automatically install unity3d from jenkins (even beta versions),

1. install this set of scripts.

  1. Install this script somewhere on your machines. E.g. /Users/Shared/Jenkins/Home/bin/
  2. Create a parametrized job that takes a String parameter
    name: UNITY3D_URL
    default value: e.g. http://netstorage.unity3d.com/unity/unity-4.2.1.dmg
    description: The URL of the DMG package to install
  3. Add a shell builder to your job:
    cd
    echo "Installing $UNITY3D_URL"
    download_install_unity3d.sh "$UNITY3D_URL"
    

Friendly plugins

Known issues

Troubleshooting failures

If the plugin fails to run the command you want it to run here are some steps you can perform to help identifying the issue:

Related information

Changelog

Version 1.4 (DEV IN PROGRESS)

Version 1.3 (11.09.2015)

Version 1.2 (10.09.2015)

Version 1.1 (07.07.2015)

Version 1.0 (29.05.2015)

Version 0.9 (26.05.2015)

Version 0.8 (25.05.2015)

Version 0.7 (02.04.2015)

Version 0.6 (24.03.2014)

Version 0.5 (27.09.2003)

Version 0.4 (16.09.2013)

Version 0.3 (06.06.202)

Version 0.2 (30.01.2012)

Version 0.1 (24.01.2012)