Skip to content

Commit

Permalink
Refactor models to allow for build parameters...
Browse files Browse the repository at this point in the history
Build parameters have to be parsed because they can no longer be implicitly passed, as they need to be interpreted for detecting extensions.
  • Loading branch information
webbertakken committed Jan 20, 2020
1 parent a84535f commit 1d1f81c
Show file tree
Hide file tree
Showing 10 changed files with 172 additions and 95 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,10 @@ _**required:** `true`_

#### buildName

Name of the build.
Name of the build. Also the folder in which the build will be stored within `buildsPath`.

_**required:** `false`_
_**default:** `testBuild`_
_**default:** `<build_target>`_

#### buildsPath

Expand Down
2 changes: 1 addition & 1 deletion builder/index.js

Large diffs are not rendered by default.

63 changes: 14 additions & 49 deletions builder/steps/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,53 +4,28 @@
# Set project path
#

UNITY_PROJECT_PATH=$GITHUB_WORKSPACE/$PROJECT_PATH
UNITY_PROJECT_PATH="$GITHUB_WORKSPACE/$PROJECT_PATH"
echo "Using project path \"$UNITY_PROJECT_PATH\"."

#
# Set the name for the build
# Display the name for the build, doubles as the output name
#

if [ -z "$BUILD_NAME" ]; then
BUILD_NAME="build-$(date '+%F-%H%M')"
fi
echo "Using build name \"$BUILD_NAME\"."

#
# Set the builds target platform;
#
# Web: WebGL
# Desktop: StandaloneOSX, StandaloneWindows, StandaloneWindows64, StandaloneLinux64
# Console: PS4, XboxOne, Switch
# Mobile: Android, iOS
# Other: tvOS, Lumin, BJM, WSAPlayer
#
# Default to WebGL (no particular reason)
# Display the build's target platform;
#

if [ -z "$BUILD_TARGET" ]; then
BUILD_TARGET=WebGL
fi
echo "Using build target \"$BUILD_TARGET\"."

#
# Set builds path
# Display build path and file
#

if [ -z "$BUILDS_PATH" ]; then
BUILDS_PATH=build
fi
BUILDS_FULL_PATH=$GITHUB_WORKSPACE/$BUILDS_PATH

# TODO - Cleanup
BUILD_FOLDER=$BUILD_TARGET-$UNITY_VERSION
CURRENT_BUILD_PATH=$BUILDS_PATH/$BUILD_FOLDER
CURRENT_BUILD_FULL_PATH=$BUILDS_FULL_PATH/$BUILD_FOLDER

# TODO - Determine the file or folder based on BUILD_TARGET
CUSTOM_BUILD_PATH=$BUILDS_FULL_PATH/$BUILD_FOLDER/$BUILD_TARGET

echo "Using build path \"$CURRENT_BUILD_PATH\"."
echo "Using build path \"$BUILD_PATH\" to save file \"$BUILD_FILE\"."
BUILD_PATH_FULL="$GITHUB_WORKSPACE/$BUILD_PATH"
CUSTOM_BUILD_PATH="$BUILD_PATH_FULL/$BUILD_FILE"

#
# Set the build method, must reference one of:
Expand All @@ -71,13 +46,13 @@ if [ -z "$BUILD_METHOD" ]; then
#
echo "Using built-in build method."
# Create Editor directory if it does not exist
mkdir -p $UNITY_PROJECT_PATH/Assets/Editor/
mkdir -p "$UNITY_PROJECT_PATH/Assets/Editor/"
# Copy the build script of Unity Builder action
cp -r /UnityBuilderAction/Assets/Editor $UNITY_PROJECT_PATH/Assets/Editor/
cp -r "/UnityBuilderAction/Assets/Editor" "$UNITY_PROJECT_PATH/Assets/Editor/"
# Set the Build method to that of UnityBuilder Action
BUILD_METHOD="UnityBuilderAction.Builder.BuildProject"
# Verify recursive paths
ls -Ralph $UNITY_PROJECT_PATH/Assets/Editor/
ls -Ralph "$UNITY_PROJECT_PATH/Assets/Editor/"
#
else
# User has provided their own build method.
Expand All @@ -98,25 +73,15 @@ EXECUTE_BUILD_METHOD="-executeMethod $BUILD_METHOD"
# Build info
#

echo ""
echo "###########################"
echo "# All builds dir #"
echo "###########################"
echo ""

echo "Creating \"$BUILDS_FULL_PATH\" if it does not exist."
mkdir -p $BUILDS_FULL_PATH
ls -alh $BUILDS_FULL_PATH

echo ""
echo "###########################"
echo "# Current build dir #"
echo "###########################"
echo ""

echo "Creating \"$CURRENT_BUILD_FULL_PATH\" if it does not exist."exist."
mkdir -p $CURRENT_BUILD_FULL_PATH
ls -alh $CURRENT_BUILD_FULL_PATH
echo "Creating \"$BUILD_PATH_FULL\" if it does not exist."
mkdir -p "$BUILD_PATH_FULL"
ls -alh "$BUILD_PATH_FULL"

echo ""
echo "###########################"
Expand Down Expand Up @@ -164,4 +129,4 @@ echo "# Build directory #"
echo "###########################"
echo ""

ls -alh $CURRENT_BUILD_FULL_PATH
ls -alh "$BUILD_PATH_FULL"
9 changes: 6 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,22 @@ import Action from './model/action';
import Docker from './model/docker';
import ImageTag from './model/image-tag';
import Input from './model/input';
import BuildParameters from './model/build-parameters';

const core = require('@actions/core');

async function action() {
Action.checkCompatibility();

const { dockerfile, workspace, builderFolder } = Action;
const { version, platform, projectPath, buildName, buildsPath, method } = Input.getFromUser();
const buildParameters = BuildParameters.create(Input.getFromUser());
const baseImage = new ImageTag(buildParameters);

const baseImage = new ImageTag({ version, platform });
// Build docker image
const builtImage = await Docker.build({ path: builderFolder, dockerfile, baseImage });

await Docker.run(builtImage, { workspace, platform, projectPath, buildName, buildsPath, method });
// Run docker image
await Docker.run(builtImage, { workspace, ...buildParameters });
}

action().catch(error => {
Expand Down
4 changes: 3 additions & 1 deletion src/model/action.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import path from 'path';

export default class Action {
class Action {
static get supportedPlatforms() {
return ['linux'];
}
Expand Down Expand Up @@ -44,3 +44,5 @@ export default class Action {
}
}
}

export default Action;
38 changes: 38 additions & 0 deletions src/model/build-parameters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Platform from './platform';

class BuildParameters {
static create(parameters) {
const {
unityVersion,
targetPlatform,
projectPath,
buildName,
buildsPath,
buildMethod,
} = parameters;

return {
version: unityVersion,
platform: targetPlatform,
projectPath,
buildName,
buildPath: `${buildsPath}/${targetPlatform}`,
buildFile: this.parseBuildFile(buildName, targetPlatform),
buildMethod,
};
}

static parseBuildFile(filename, platform) {
if (Platform.isWindows(platform)) {
return `${filename}.exe`;
}

if (Platform.isAndroid(platform)) {
return `${filename}.apk`;
}

return filename;
}
}

export default BuildParameters;
21 changes: 16 additions & 5 deletions src/model/docker.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { exec } from '@actions/exec';
import ImageTag from './image-tag';

export default class Docker {
class Docker {
static async build(buildParameters, silent = false) {
const { path, dockerfile, baseImage } = buildParameters;
const { version, platform } = baseImage;
Expand All @@ -18,8 +18,16 @@ export default class Docker {
}

static async run(image, parameters, silent = false) {
const { workspace, platform, projectPath, buildName, buildsPath, method } = parameters;
const { version } = image;
const {
version,
workspace,
platform,
projectPath,
buildName,
buildPath,
buildFile,
buildMethod,
} = parameters;

const command = `docker run \
--workdir /github/workspace \
Expand All @@ -32,8 +40,9 @@ export default class Docker {
--env PROJECT_PATH=${projectPath} \
--env BUILD_TARGET=${platform} \
--env BUILD_NAME=${buildName} \
--env BUILDS_PATH=${buildsPath} \
--env BUILD_METHOD=${method} \
--env BUILD_PATH=${buildPath} \
--env BUILD_FILE=${buildFile} \
--env BUILD_METHOD=${buildMethod} \
--env HOME=/github/home \
--env GITHUB_REF \
--env GITHUB_SHA \
Expand All @@ -59,3 +68,5 @@ export default class Docker {
await exec(command, null, { silent });
}
}

export default Docker;
53 changes: 28 additions & 25 deletions src/model/image-tag.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { has, get, trimEnd, trimStart } from 'lodash-es';
import Platform from './platform';

export default class ImageTag {
class ImageTag {
constructor(imageProperties) {
const {
repository = 'gableroux',
Expand All @@ -13,14 +14,14 @@ export default class ImageTag {
throw new Error(`Invalid version "${version}".`);
}

if (!has(ImageTag.targetPlatformToBuilderPlatformMap, platform)) {
if (!has(ImageTag.targetPlatformToImageSuffixMap, platform)) {
throw new Error(`Platform "${platform}" is currently not supported.`);
}

const builderPlatform = get(
ImageTag.targetPlatformToBuilderPlatformMap,
ImageTag.targetPlatformToImageSuffixMap,
platform,
ImageTag.builderPlatforms.generic,
ImageTag.imageSuffixes.generic,
);

Object.assign(this, { repository, name, version, platform, builderPlatform });
Expand All @@ -30,7 +31,7 @@ export default class ImageTag {
return /^20\d{2}\.\d\.\w{3,4}|3$/;
}

static get builderPlatforms() {
static get imageSuffixes() {
return {
generic: '',
webgl: 'webgl',
Expand All @@ -42,31 +43,31 @@ export default class ImageTag {
};
}

static get targetPlatformToBuilderPlatformMap() {
const { generic, webgl, mac, windows, android, ios, facebook } = ImageTag.builderPlatforms;
static get targetPlatformToImageSuffixMap() {
const { generic, webgl, mac, windows, android, ios, facebook } = ImageTag.imageSuffixes;

// @see: https://docs.unity3d.com/ScriptReference/BuildTarget.html
return {
StandaloneOSX: mac,
StandaloneWindows: windows,
StandaloneWindows64: windows,
StandaloneLinux64: windows,
iOS: ios,
Android: android,
WebGL: webgl,
WSAPlayer: windows,
PS4: windows,
XboxOne: windows,
tvOS: windows,
Switch: windows,
[Platform.types.StandaloneOSX]: mac,
[Platform.types.StandaloneWindows]: windows,
[Platform.types.StandaloneWindows64]: windows,
[Platform.types.StandaloneLinux64]: windows,
[Platform.types.iOS]: ios,
[Platform.types.Android]: android,
[Platform.types.WebGL]: webgl,
[Platform.types.WSAPlayer]: windows,
[Platform.types.PS4]: windows,
[Platform.types.XboxOne]: windows,
[Platform.types.tvOS]: windows,
[Platform.types.Switch]: windows,
// Unsupported
Lumin: windows,
BJM: windows,
Stadia: windows,
Facebook: facebook,
NoTarget: generic,
[Platform.types.Lumin]: windows,
[Platform.types.BJM]: windows,
[Platform.types.Stadia]: windows,
[Platform.types.Facebook]: facebook,
[Platform.types.NoTarget]: generic,
// Test specific
Test: generic,
[Platform.types.Test]: generic,
};
}

Expand All @@ -84,3 +85,5 @@ export default class ImageTag {
return `${image}:${tag}`;
}
}

export default ImageTag;
22 changes: 13 additions & 9 deletions src/model/input.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
import Platform from './platform';

const core = require('@actions/core');

export default class Input {
class Input {
static getFromUser() {
// Input variables specified in workflows using "with" prop.
const version = core.getInput('unityVersion');
const platform = core.getInput('targetPlatform');
const unityVersion = core.getInput('unityVersion');
const targetPlatform = core.getInput('targetPlatform') || Platform.default;
const projectPath = core.getInput('projectPath');
const buildName = core.getInput('buildName');
const buildsPath = core.getInput('buildsPath');
const buildMethod = core.getInput('buildMethod');
const buildName = core.getInput('buildName') || targetPlatform;
const buildsPath = core.getInput('buildsPath') || 'build';
const buildMethod = core.getInput('buildMethod'); // processed in docker file

return {
version,
platform,
unityVersion,
targetPlatform,
projectPath,
buildName,
buildsPath,
method: buildMethod,
buildMethod,
};
}
}

export default Input;
Loading

0 comments on commit 1d1f81c

Please sign in to comment.