mirror of
https://github.com/game-ci/unity-builder.git
synced 2026-09-29 12:07:05 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4423ee7582 | ||
|
|
1d4ee0697f | ||
|
|
3a2abf9037 | ||
|
|
cfdebb67c1 | ||
|
|
ab64768ceb | ||
|
|
00fa0d3772 | ||
|
|
d587557287 | ||
|
|
6e0bf17345 |
+2
-1
@@ -14,7 +14,8 @@
|
||||
"env": {
|
||||
"node": true,
|
||||
"es6": true,
|
||||
"jest/globals": true
|
||||
"jest/globals": true,
|
||||
"es2020": true
|
||||
},
|
||||
"rules": {
|
||||
// Error out for code formatting errors
|
||||
|
||||
@@ -124,6 +124,13 @@ inputs:
|
||||
required: false
|
||||
default: ''
|
||||
description: 'Number of CPU cores to assign the docker container. Defaults to all available cores on all platforms.'
|
||||
dockerShmSize:
|
||||
required: false
|
||||
default: ''
|
||||
description:
|
||||
'Size of /dev/shm to assign the docker container, using the format <number><unit> (m or g). Unity 6.6+ editors
|
||||
request 1GiB of shared memory and fail with "Insufficient shared memory available" against Docker''s 64m default.
|
||||
Defaults to 1025m; set to "0" or "none" to use Docker''s own default.'
|
||||
dockerMemoryLimit:
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
@@ -66,10 +66,6 @@ namespace UnityBuilderAction
|
||||
var buildProfile = AssetDatabase.LoadAssetAtPath<BuildProfile>(buildProfilePath)
|
||||
?? throw new Exception("Build profile file not found at path: " + buildProfilePath);
|
||||
|
||||
#if !BUILD_PROFILE_LOADED
|
||||
throw new Exception("Build profile's define symbol not present before script execution; shouldn't happen");
|
||||
#endif // BUILD_PROFILE_LOADED
|
||||
|
||||
// no need to set active profile, as already set by `-activeBuildProfile` CLI argument
|
||||
// BuildProfile.SetActiveBuildProfile(buildProfile);
|
||||
Debug.Log($"build profile: {buildProfile.name}");
|
||||
|
||||
+2
@@ -115,6 +115,7 @@ namespace UnityBuilderAction.Input
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_6000_0_OR_NEWER
|
||||
private static void SetDebugSymbols(string enumValueName)
|
||||
{
|
||||
// UnityEditor.Android.UserBuildSettings and Unity.Android.Types.DebugSymbolLevel are part of the Unity Android module.
|
||||
@@ -144,5 +145,6 @@ namespace UnityBuilderAction.Input
|
||||
}
|
||||
levelProp.SetValue(null, enumValue);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
+74
-88
@@ -323,6 +323,7 @@ class BuildParameters {
|
||||
chownFilesTo: input_1.default.chownFilesTo,
|
||||
dockerCpuLimit: input_1.default.dockerCpuLimit,
|
||||
dockerMemoryLimit: input_1.default.dockerMemoryLimit,
|
||||
dockerShmSize: input_1.default.dockerShmSize,
|
||||
dockerIsolationMode: input_1.default.dockerIsolationMode,
|
||||
containerRegistryRepository: input_1.default.containerRegistryRepository,
|
||||
containerRegistryImageVersion: input_1.default.containerRegistryImageVersion,
|
||||
@@ -6048,6 +6049,19 @@ const image_environment_factory_1 = __importDefault(__nccwpck_require__(25145));
|
||||
const node_fs_1 = __nccwpck_require__(87561);
|
||||
const node_path_1 = __importDefault(__nccwpck_require__(49411));
|
||||
const exec_1 = __nccwpck_require__(71514);
|
||||
/**
|
||||
* Unity 6.6+ editors request 1GiB of shared memory and hard-fail with
|
||||
* "Insufficient shared memory available" against Docker's 64m default
|
||||
* (game-ci/unity-builder#840). BuildParameters defaults this to 1025m, the
|
||||
* value unity-test-runner has always passed. '0'/'none' omits the flag so
|
||||
* Docker's own default applies.
|
||||
*/
|
||||
function shmSizeFlag(dockerShmSize) {
|
||||
const value = String(dockerShmSize ?? '').trim();
|
||||
if (value === '' || value === '0' || value.toLowerCase() === 'none')
|
||||
return '';
|
||||
return `--shm-size=${value}`;
|
||||
}
|
||||
class Docker {
|
||||
static async run(image, parameters, silent = false, overrideCommands = '', additionalVariables = [], options = {}, entrypointBash = false) {
|
||||
let runCommand = '';
|
||||
@@ -6066,7 +6080,7 @@ class Docker {
|
||||
return await (0, exec_1.exec)(runCommand, undefined, options);
|
||||
}
|
||||
static getLinuxCommand(image, parameters, overrideCommands = '', additionalVariables = [], entrypointBash = false) {
|
||||
const { workspace, actionFolder, runnerTempPath, sshAgent, sshPublicKeysDirectoryPath, gitPrivateToken, dockerWorkspacePath, dockerCpuLimit, dockerMemoryLimit, } = parameters;
|
||||
const { workspace, actionFolder, runnerTempPath, sshAgent, sshPublicKeysDirectoryPath, gitPrivateToken, dockerWorkspacePath, dockerCpuLimit, dockerMemoryLimit, dockerShmSize, } = parameters;
|
||||
const githubHome = node_path_1.default.join(runnerTempPath, '_github_home');
|
||||
if (!(0, node_fs_1.existsSync)(githubHome))
|
||||
(0, node_fs_1.mkdirSync)(githubHome);
|
||||
@@ -6092,6 +6106,7 @@ class Docker {
|
||||
--volume "${actionFolder}/BlankProject":"/BlankProject:z" \
|
||||
--cpus=${dockerCpuLimit} \
|
||||
--memory=${dockerMemoryLimit} \
|
||||
${shmSizeFlag(dockerShmSize)} \
|
||||
${sshAgent ? `--volume ${sshAgent}:/ssh-agent` : ''} \
|
||||
${sshAgent && !sshPublicKeysDirectoryPath
|
||||
? '--volume /home/runner/.ssh/known_hosts:/root/.ssh/known_hosts:ro'
|
||||
@@ -6103,7 +6118,7 @@ class Docker {
|
||||
"${overrideCommands !== '' ? overrideCommands : `/entrypoint.sh`}"`;
|
||||
}
|
||||
static getWindowsCommand(image, parameters) {
|
||||
const { workspace, actionFolder, runnerTempPath, gitPrivateToken, dockerWorkspacePath, dockerCpuLimit, dockerMemoryLimit, dockerIsolationMode, } = parameters;
|
||||
const { workspace, actionFolder, runnerTempPath, gitPrivateToken, dockerWorkspacePath, dockerCpuLimit, dockerMemoryLimit, dockerShmSize, dockerIsolationMode, } = parameters;
|
||||
const githubHome = node_path_1.default.join(runnerTempPath, '_github_home');
|
||||
if (!(0, node_fs_1.existsSync)(githubHome))
|
||||
(0, node_fs_1.mkdirSync)(githubHome);
|
||||
@@ -6111,6 +6126,7 @@ class Docker {
|
||||
--workdir c:${dockerWorkspacePath} \
|
||||
--rm \
|
||||
${image_environment_factory_1.default.getEnvVarString(parameters)} \
|
||||
--env BEE_CACHE_DIRECTORY=c:${dockerWorkspacePath}/Library/bee_cache \
|
||||
--env GITHUB_WORKSPACE=c:${dockerWorkspacePath} \
|
||||
${gitPrivateToken ? `--env GIT_PRIVATE_TOKEN="${gitPrivateToken}"` : ''} \
|
||||
--volume "${workspace}":"c:${dockerWorkspacePath}" \
|
||||
@@ -6126,6 +6142,7 @@ class Docker {
|
||||
--volume "${actionFolder}/BlankProject":"c:/BlankProject" \
|
||||
--cpus=${dockerCpuLimit} \
|
||||
--memory=${dockerMemoryLimit} \
|
||||
${shmSizeFlag(dockerShmSize)} \
|
||||
--isolation=${dockerIsolationMode} \
|
||||
${image} \
|
||||
powershell c:/steps/entrypoint.ps1`;
|
||||
@@ -7087,6 +7104,16 @@ class Input {
|
||||
static get dockerWorkspacePath() {
|
||||
return Input.getInput('dockerWorkspacePath') ?? '/github/workspace';
|
||||
}
|
||||
/**
|
||||
* Unity 6.6+ editors request 1GiB of shared memory and hard-fail with
|
||||
* "Insufficient shared memory available" against Docker's 64m default
|
||||
* (game-ci/unity-builder#840). unity-test-runner has always passed 1025m,
|
||||
* so match it here rather than leaving builds broken by default. '0' or
|
||||
* 'none' omits the flag and uses Docker's own default.
|
||||
*/
|
||||
static get dockerShmSize() {
|
||||
return Input.getInput('dockerShmSize') ?? '1025m';
|
||||
}
|
||||
static get dockerCpuLimit() {
|
||||
return Input.getInput('dockerCpuLimit') ?? node_os_1.default.cpus().length.toString();
|
||||
}
|
||||
@@ -362276,17 +362303,27 @@ exports.UnityChangeset = unityChangeset_js_1.UnityChangeset;
|
||||
/**
|
||||
* Retrieves the Unity changeset for a specific version.
|
||||
* @param version - The Unity version string (e.g., "2020.1.14f1").
|
||||
* @param db - Optional database URL or true to use the default database.
|
||||
* @returns A Promise that resolves to the UnityChangeset object.
|
||||
* @throws Error if the version is not found.
|
||||
*/
|
||||
async function getUnityChangeset(version) {
|
||||
async function getUnityChangeset(version, db) {
|
||||
const sanitizedVersion = (0, utils_js_1.sanitizeVersion)(version);
|
||||
let changesets;
|
||||
try {
|
||||
changesets = await (0, unityGraphQL_js_1.getUnityReleases)(sanitizedVersion, []);
|
||||
// Database mode.
|
||||
if (db) {
|
||||
const dbUrl = db === true ? UNITY_CHANGESETS_DB_URL : db;
|
||||
changesets = await getAllChangesetsFromDb(dbUrl);
|
||||
}
|
||||
catch {
|
||||
changesets = await getAllChangesetsFromDb();
|
||||
else {
|
||||
// GraphQL mode.
|
||||
try {
|
||||
changesets = await (0, unityGraphQL_js_1.getUnityReleases)(sanitizedVersion, (0, utils_js_1.searchModeToStreams)(SearchMode.All), [unityChangeset_js_1.UnityReleaseEntitlement.XLTS]);
|
||||
}
|
||||
catch {
|
||||
// Fallback to default database mode.
|
||||
changesets = await getAllChangesetsFromDb(UNITY_CHANGESETS_DB_URL);
|
||||
}
|
||||
}
|
||||
if (!changesets || !Array.isArray(changesets)) {
|
||||
throw new Error("Failed to retrieve changesets");
|
||||
@@ -362311,8 +362348,7 @@ var SearchMode;
|
||||
SearchMode[SearchMode["Default"] = 2] = "Default";
|
||||
SearchMode[SearchMode["PreRelease"] = 3] = "PreRelease";
|
||||
SearchMode[SearchMode["LTS"] = 4] = "LTS";
|
||||
SearchMode[SearchMode["XLTS"] = 5] = "XLTS";
|
||||
SearchMode[SearchMode["SUPPORTED"] = 6] = "SUPPORTED";
|
||||
SearchMode[SearchMode["Supported"] = 6] = "Supported";
|
||||
})(SearchMode || (exports.SearchMode = SearchMode = {}));
|
||||
/*
|
||||
* Group mode.
|
||||
@@ -362362,10 +362398,11 @@ var FormatMode;
|
||||
* @param groupMode - The group mode to use.
|
||||
* @param outputMode - The output mode for the results.
|
||||
* @param formatMode - The format mode for the output.
|
||||
* @param db - Optional database URL or true to use the default database.
|
||||
* @returns A Promise that resolves to a formatted string of the results.
|
||||
*/
|
||||
function listChangesets(searchMode, filterOptions, groupMode, outputMode, formatMode) {
|
||||
return searchChangesets(searchMode)
|
||||
function listChangesets(searchMode, filterOptions, groupMode, outputMode, formatMode, db) {
|
||||
return searchChangesets(searchMode, db)
|
||||
.then((results) => filterChangesets(results, filterOptions))
|
||||
.then((results) => results.sort((a, b) => b.versionNumber - a.versionNumber))
|
||||
.then((results) => groupChangesets(results, groupMode))
|
||||
@@ -362398,27 +362435,24 @@ exports.listChangesets = listChangesets;
|
||||
/**
|
||||
* Searches for Unity changesets based on the specified search mode.
|
||||
* @param searchMode - The search mode to use.
|
||||
* @param db - Optional database URL or true to use the default database.
|
||||
* @returns A Promise that resolves to an array of UnityChangeset objects.
|
||||
* @throws Error if the search mode is not supported.
|
||||
*/
|
||||
async function searchChangesets(searchMode) {
|
||||
async function searchChangesets(searchMode, db) {
|
||||
const streams = (0, utils_js_1.searchModeToStreams)(searchMode);
|
||||
// Database mode.
|
||||
if (db) {
|
||||
const dbUrl = db === true ? UNITY_CHANGESETS_DB_URL : db;
|
||||
return searchChangesetsFromDb(streams, dbUrl);
|
||||
}
|
||||
try {
|
||||
switch (searchMode) {
|
||||
case SearchMode.All:
|
||||
case SearchMode.Default:
|
||||
case SearchMode.PreRelease:
|
||||
case SearchMode.SUPPORTED:
|
||||
return await (0, unityGraphQL_js_1.getUnityReleases)(".", (0, utils_js_1.searchModeToStreams)(searchMode));
|
||||
case SearchMode.LTS:
|
||||
return await (0, unityGraphQL_js_1.getUnityReleasesInLTS)();
|
||||
case SearchMode.XLTS:
|
||||
return await (0, unityGraphQL_js_1.getUnityReleasesInLTS)([unityChangeset_js_1.UnityReleaseEntitlement.XLTS]);
|
||||
default:
|
||||
throw Error(`The given search mode '${searchMode}' was not supported`);
|
||||
}
|
||||
// GraphQL mode.
|
||||
return await (0, unityGraphQL_js_1.getUnityReleases)(".", streams, [unityChangeset_js_1.UnityReleaseEntitlement.XLTS]);
|
||||
}
|
||||
catch {
|
||||
return await searchChangesetsFromDb(searchMode);
|
||||
// Fallback to default database mode.
|
||||
return await searchChangesetsFromDb(streams, UNITY_CHANGESETS_DB_URL);
|
||||
}
|
||||
}
|
||||
exports.searchChangesets = searchChangesets;
|
||||
@@ -362450,7 +362484,7 @@ function filterChangesets(changesets, options) {
|
||||
: Object.values((0, utils_js_1.groupBy)(changesets, (r) => r.minor)).map((g) => g[0]);
|
||||
return changesets.filter((c) => min <= c.versionNumber &&
|
||||
c.versionNumber <= max &&
|
||||
(!options.lts || c.lts) &&
|
||||
(options.xlts || !c.xlts) && // Include XLTS?
|
||||
(!regex || regex.test(c.version)) &&
|
||||
(!lc || lc.some((l) => l.minor == c.minor && l.lifecycle == c.lifecycle)));
|
||||
}
|
||||
@@ -362487,13 +362521,15 @@ function groupChangesets(changesets, groupMode) {
|
||||
exports.groupChangesets = groupChangesets;
|
||||
/**
|
||||
* Retrieves all Unity changesets from the database.
|
||||
* @param db - Database URL. If not specified, use the default database.
|
||||
* @returns A Promise that resolves to an array of all UnityChangeset objects from the database.
|
||||
* @throws Error if the database cannot be fetched or is invalid.
|
||||
*/
|
||||
function getAllChangesetsFromDb() {
|
||||
return fetch(UNITY_CHANGESETS_DB_URL)
|
||||
.then((res) => {
|
||||
function getAllChangesetsFromDb(db = UNITY_CHANGESETS_DB_URL) {
|
||||
return fetch(db)
|
||||
.then(async (res) => {
|
||||
if (!res.ok) {
|
||||
await res.text(); // Consume the response body to avoid leaks
|
||||
throw Error(`The Unity changeset database could not be fetched: ${res.status} ${res.statusText}`);
|
||||
}
|
||||
return res.json();
|
||||
@@ -362502,26 +362538,24 @@ function getAllChangesetsFromDb() {
|
||||
if (!Array.isArray(data)) {
|
||||
throw new Error("Invalid changeset database format: expected array");
|
||||
}
|
||||
return data;
|
||||
return data.map((item) => new exports.UnityChangeset(item.version, item.changeset, item.stream, item.entitlements));
|
||||
});
|
||||
}
|
||||
exports.getAllChangesetsFromDb = getAllChangesetsFromDb;
|
||||
/**
|
||||
* Searches for Unity changesets from the database based on the specified search mode.
|
||||
* @param searchMode - The search mode to use.
|
||||
* @param streams - The array of release streams to filter by.
|
||||
* @param db - Database URL. If not specified, use the default database.
|
||||
* @returns A Promise that resolves to an array of UnityChangeset objects from the database.
|
||||
*/
|
||||
function searchChangesetsFromDb(searchMode) {
|
||||
return getAllChangesetsFromDb()
|
||||
function searchChangesetsFromDb(streams, db = UNITY_CHANGESETS_DB_URL) {
|
||||
return getAllChangesetsFromDb(db)
|
||||
.then((changesets) => {
|
||||
if (!changesets || !Array.isArray(changesets))
|
||||
return [];
|
||||
if (changesets.length == 0)
|
||||
return [];
|
||||
const streams = (0, utils_js_1.searchModeToStreams)(searchMode);
|
||||
return searchMode === SearchMode.XLTS
|
||||
? changesets.filter((c) => streams.includes(c.stream))
|
||||
: changesets.filter((c) => streams.includes(c.stream) && !c.xlts);
|
||||
return changesets.filter((c) => streams.includes(c.stream));
|
||||
});
|
||||
}
|
||||
exports.searchChangesetsFromDb = searchChangesetsFromDb;
|
||||
@@ -362689,7 +362723,7 @@ Object.defineProperty(UnityChangeset, "toNumber", {
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
exports.getUnityReleasesInLTS = exports.getUnityReleases = void 0;
|
||||
exports.getUnityReleases = void 0;
|
||||
const unityChangeset_js_1 = __nccwpck_require__(52758);
|
||||
const graphql_request_1 = __nccwpck_require__(5406);
|
||||
const UNITY_GRAPHQL_ENDPOINT = "https://services.unity.com/graphql";
|
||||
@@ -362799,53 +362833,6 @@ query GetRelease($limit: Int, $skip: Int, $version: String!, $stream: [UnityRele
|
||||
return results;
|
||||
}
|
||||
exports.getUnityReleases = getUnityReleases;
|
||||
/**
|
||||
* Retrieves Unity releases in LTS from the GraphQL API based on entitlements.
|
||||
* @param entitlements - The array of entitlements to filter by.
|
||||
* @returns A Promise that resolves to an array of UnityChangeset objects.
|
||||
* @throws Error if the API response is invalid.
|
||||
*/
|
||||
async function getUnityReleasesInLTS(entitlements = []) {
|
||||
const client = new graphql_request_1.GraphQLClient(UNITY_GRAPHQL_ENDPOINT);
|
||||
const query = (0, graphql_request_1.gql) `
|
||||
query GetReleaseMajorVersions($entitlements: [UnityReleaseEntitlement!])
|
||||
{
|
||||
getUnityReleaseMajorVersions(
|
||||
stream: []
|
||||
platform: []
|
||||
architecture: []
|
||||
entitlements: $entitlements
|
||||
) {
|
||||
version
|
||||
}
|
||||
}
|
||||
`;
|
||||
const variables = {
|
||||
entitlements: entitlements,
|
||||
};
|
||||
const cacheKey = getCacheKey(query, variables);
|
||||
let data;
|
||||
const cached = cache.get(cacheKey);
|
||||
if (cached && isCacheValid(cached.timestamp)) {
|
||||
data = cached.data;
|
||||
}
|
||||
else {
|
||||
data = await requestWithErrorHandling(client, query, variables);
|
||||
cache.set(cacheKey, { data, timestamp: Date.now() });
|
||||
}
|
||||
if (!data.getUnityReleaseMajorVersions) {
|
||||
throw new Error("Invalid response from Unity GraphQL API: missing getUnityReleaseMajorVersions");
|
||||
}
|
||||
const results = await Promise.all(data.getUnityReleaseMajorVersions
|
||||
.map(async (v) => {
|
||||
if (!v.version) {
|
||||
throw new Error("Invalid response from Unity GraphQL API: missing version in major versions");
|
||||
}
|
||||
return await getUnityReleases(v.version, [unityChangeset_js_1.UnityReleaseStream.LTS], entitlements);
|
||||
}));
|
||||
return results.flat();
|
||||
}
|
||||
exports.getUnityReleasesInLTS = getUnityReleasesInLTS;
|
||||
|
||||
|
||||
/***/ }),
|
||||
@@ -362892,11 +362879,10 @@ function searchModeToStreams(searchMode) {
|
||||
unityChangeset_js_1.UnityReleaseStream.BETA,
|
||||
];
|
||||
case index_js_1.SearchMode.LTS:
|
||||
case index_js_1.SearchMode.XLTS:
|
||||
return [
|
||||
unityChangeset_js_1.UnityReleaseStream.LTS,
|
||||
];
|
||||
case index_js_1.SearchMode.SUPPORTED:
|
||||
case index_js_1.SearchMode.Supported:
|
||||
return [
|
||||
unityChangeset_js_1.UnityReleaseStream.SUPPORTED,
|
||||
];
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+61
-13
@@ -4,21 +4,69 @@
|
||||
echo "Changing to \"$ACTIVATE_LICENSE_PATH\" directory."
|
||||
pushd "$ACTIVATE_LICENSE_PATH"
|
||||
|
||||
echo "Requesting activation"
|
||||
if [[ -n "$UNITY_SERIAL" && -n "$UNITY_EMAIL" && -n "$UNITY_PASSWORD" ]]; then
|
||||
#
|
||||
# SERIAL LICENSE MODE
|
||||
#
|
||||
# This will activate unity, using the serial activation process.
|
||||
#
|
||||
|
||||
# Activate license
|
||||
/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app/Contents/MacOS/Unity \
|
||||
-logFile - \
|
||||
-batchmode \
|
||||
-nographics \
|
||||
-quit \
|
||||
-serial "$UNITY_SERIAL" \
|
||||
-username "$UNITY_EMAIL" \
|
||||
-password "$UNITY_PASSWORD" \
|
||||
-projectPath "$ACTIVATE_LICENSE_PATH"
|
||||
echo "Requesting activation"
|
||||
|
||||
# Store the exit code from the verify command
|
||||
UNITY_EXIT_CODE=$?
|
||||
# Activate license
|
||||
/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app/Contents/MacOS/Unity \
|
||||
-logFile - \
|
||||
-batchmode \
|
||||
-nographics \
|
||||
-quit \
|
||||
-serial "$UNITY_SERIAL" \
|
||||
-username "$UNITY_EMAIL" \
|
||||
-password "$UNITY_PASSWORD" \
|
||||
-projectPath "$ACTIVATE_LICENSE_PATH"
|
||||
|
||||
# Store the exit code from the verify command
|
||||
UNITY_EXIT_CODE=$?
|
||||
|
||||
elif [[ -n "$UNITY_LICENSING_SERVER" ]]; then
|
||||
#
|
||||
# Custom Unity License Server
|
||||
#
|
||||
echo "Adding licensing server config"
|
||||
mkdir -p "$UNITY_LICENSE_PATH/config/"
|
||||
cp "$ACTION_FOLDER/unity-config/services-config.json" "$UNITY_LICENSE_PATH/config/services-config.json"
|
||||
|
||||
/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app/Contents/Frameworks/UnityLicensingClient.app/Contents/MacOS/Unity.Licensing.Client \
|
||||
--acquire-floating > license.txt
|
||||
|
||||
# Store the exit code from the verify command
|
||||
UNITY_EXIT_CODE=$?
|
||||
|
||||
if [ $UNITY_EXIT_CODE -eq 0 ]; then
|
||||
PARSEDFILE=$(grep -oE '\"[^"]*\"' < license.txt | tr -d '"')
|
||||
export FLOATING_LICENSE
|
||||
FLOATING_LICENSE=$(sed -n 2p <<< "$PARSEDFILE")
|
||||
FLOATING_LICENSE_TIMEOUT=$(sed -n 4p <<< "$PARSEDFILE")
|
||||
|
||||
echo "Acquired floating license: \"$FLOATING_LICENSE\" with timeout $FLOATING_LICENSE_TIMEOUT"
|
||||
fi
|
||||
else
|
||||
#
|
||||
# NO LICENSE ACTIVATION STRATEGY MATCHED
|
||||
#
|
||||
# This will exit since no activation strategies could be matched.
|
||||
#
|
||||
echo "License activation strategy could not be determined."
|
||||
echo ""
|
||||
echo "Visit https://game.ci/docs/github/activation for more"
|
||||
echo "details on how to set up one of the possible activation strategies."
|
||||
|
||||
echo "::error ::No valid license activation strategy could be determined. Make sure to provide UNITY_EMAIL, UNITY_PASSWORD, and either a UNITY_SERIAL \
|
||||
or UNITY_LICENSE. Otherwise please use UNITY_LICENSING_SERVER. See more info at https://game.ci/docs/github/activation"
|
||||
|
||||
# Immediately exit as no UNITY_EXIT_CODE can be derived.
|
||||
exit 1;
|
||||
|
||||
fi
|
||||
|
||||
#
|
||||
# Display information about the result
|
||||
|
||||
Vendored
-2
@@ -149,8 +149,6 @@ echo ""
|
||||
$( [ "${MANUAL_EXIT}" == "true" ] || echo "-quit" ) \
|
||||
-batchmode \
|
||||
$( [ "${ENABLE_GPU}" == "true" ] || echo "-nographics" ) \
|
||||
-username "$UNITY_EMAIL" \
|
||||
-password "$UNITY_PASSWORD" \
|
||||
-customBuildName "$BUILD_NAME" \
|
||||
-projectPath "$UNITY_PROJECT_PATH" \
|
||||
$( [ -z "$BUILD_PROFILE" ] && echo "-buildTarget $BUILD_TARGET") \
|
||||
|
||||
+23
-9
@@ -4,15 +4,29 @@
|
||||
echo "Changing to \"$ACTIVATE_LICENSE_PATH\" directory."
|
||||
pushd "$ACTIVATE_LICENSE_PATH"
|
||||
|
||||
/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app/Contents/MacOS/Unity \
|
||||
-logFile - \
|
||||
-batchmode \
|
||||
-nographics \
|
||||
-quit \
|
||||
-username "$UNITY_EMAIL" \
|
||||
-password "$UNITY_PASSWORD" \
|
||||
-returnlicense \
|
||||
-projectPath "$ACTIVATE_LICENSE_PATH"
|
||||
if [[ -n "$UNITY_LICENSING_SERVER" ]]; then
|
||||
#
|
||||
# Return any floating license used.
|
||||
#
|
||||
echo "Returning floating license: \"$FLOATING_LICENSE\""
|
||||
/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app/Contents/Frameworks/UnityLicensingClient.app/Contents/MacOS/Unity.Licensing.Client \
|
||||
--return-floating "$FLOATING_LICENSE"
|
||||
elif [[ -n "$UNITY_SERIAL" ]]; then
|
||||
#
|
||||
# SERIAL LICENSE MODE
|
||||
#
|
||||
# This will return the license that is currently in use.
|
||||
#
|
||||
/Applications/Unity/Hub/Editor/$UNITY_VERSION/Unity.app/Contents/MacOS/Unity \
|
||||
-logFile - \
|
||||
-batchmode \
|
||||
-nographics \
|
||||
-quit \
|
||||
-username "$UNITY_EMAIL" \
|
||||
-password "$UNITY_PASSWORD" \
|
||||
-returnlicense \
|
||||
-projectPath "$ACTIVATE_LICENSE_PATH"
|
||||
fi
|
||||
|
||||
# Return to previous working directory
|
||||
popd
|
||||
|
||||
+9
-5
@@ -68,14 +68,18 @@ elif [[ -n "$UNITY_LICENSING_SERVER" ]]; then
|
||||
echo "Adding licensing server config"
|
||||
|
||||
/opt/unity/Editor/Data/Resources/Licensing/Client/Unity.Licensing.Client --acquire-floating > license.txt #is this accessible in a env variable?
|
||||
PARSEDFILE=$(grep -oP '\".*?\"' < license.txt | tr -d '"')
|
||||
export FLOATING_LICENSE
|
||||
FLOATING_LICENSE=$(sed -n 2p <<< "$PARSEDFILE")
|
||||
FLOATING_LICENSE_TIMEOUT=$(sed -n 4p <<< "$PARSEDFILE")
|
||||
|
||||
echo "Acquired floating license: \"$FLOATING_LICENSE\" with timeout $FLOATING_LICENSE_TIMEOUT"
|
||||
# Store the exit code from the verify command
|
||||
UNITY_EXIT_CODE=$?
|
||||
|
||||
if [ $UNITY_EXIT_CODE -eq 0 ]; then
|
||||
PARSEDFILE=$(grep -oP '\".*?\"' < license.txt | tr -d '"')
|
||||
export FLOATING_LICENSE
|
||||
FLOATING_LICENSE=$(sed -n 2p <<< "$PARSEDFILE")
|
||||
FLOATING_LICENSE_TIMEOUT=$(sed -n 4p <<< "$PARSEDFILE")
|
||||
|
||||
echo "Acquired floating license: \"$FLOATING_LICENSE\" with timeout $FLOATING_LICENSE_TIMEOUT"
|
||||
fi
|
||||
else
|
||||
#
|
||||
# NO LICENSE ACTIVATION STRATEGY MATCHED
|
||||
|
||||
+3
@@ -18,6 +18,9 @@ regsvr32 C:\ProgramData\Microsoft\VisualStudio\Setup\x64\Microsoft.VisualStudio.
|
||||
# Kill the regsvr process
|
||||
Get-Process -Name regsvr32 | ForEach-Object { Stop-Process -Id $_.Id -Force }
|
||||
|
||||
# Install Visual C++ 2013 Redistributables
|
||||
. "c:\steps\install_vcredist13.ps1"
|
||||
|
||||
# Setup Git Credentials
|
||||
. "c:\steps\set_gitcredential.ps1"
|
||||
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
# For some reason, Unity is failing in github actions windows runners
|
||||
# due to missing Visual C++ 2013 redistributables.
|
||||
# This script downloads and installs the required redistributables.
|
||||
Write-Output ""
|
||||
Write-Output "#########################################################"
|
||||
Write-Output "# Installing Visual C++ Redistributables (2013) #"
|
||||
Write-Output "#########################################################"
|
||||
Write-Output ""
|
||||
|
||||
|
||||
choco install vcredist2013 -y --no-progress
|
||||
+1
-2
@@ -44,14 +44,13 @@
|
||||
"base-64": "^1.0.0",
|
||||
"commander": "^9.0.0",
|
||||
"commander-ts": "^0.2.0",
|
||||
"graphql": "^16.11.0",
|
||||
"kubernetes-client": "^9.0.0",
|
||||
"md5": "^2.3.0",
|
||||
"nanoid": "^3.3.1",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"semver": "^7.5.2",
|
||||
"ts-md5": "^1.3.1",
|
||||
"unity-changeset": "^3.0.0",
|
||||
"unity-changeset": "^3.1.0",
|
||||
"uuid": "^9.0.0",
|
||||
"yaml": "^2.2.2"
|
||||
},
|
||||
|
||||
@@ -46,6 +46,7 @@ class BuildParameters {
|
||||
public androidSymbolType!: string;
|
||||
public dockerCpuLimit!: string;
|
||||
public dockerMemoryLimit!: string;
|
||||
public dockerShmSize!: string;
|
||||
public dockerIsolationMode!: string;
|
||||
public containerRegistryRepository!: string;
|
||||
public containerRegistryImageVersion!: string;
|
||||
@@ -179,6 +180,7 @@ class BuildParameters {
|
||||
chownFilesTo: Input.chownFilesTo,
|
||||
dockerCpuLimit: Input.dockerCpuLimit,
|
||||
dockerMemoryLimit: Input.dockerMemoryLimit,
|
||||
dockerShmSize: Input.dockerShmSize,
|
||||
dockerIsolationMode: Input.dockerIsolationMode,
|
||||
containerRegistryRepository: Input.containerRegistryRepository,
|
||||
containerRegistryImageVersion: Input.containerRegistryImageVersion,
|
||||
|
||||
@@ -17,6 +17,7 @@ describe('Cloud Runner Github Checks', () => {
|
||||
status: 200,
|
||||
data: {},
|
||||
});
|
||||
// eslint-disable-next-line unicorn/no-useless-undefined
|
||||
jest.spyOn(GitHub as any, 'runUpdateAsyncChecksWorkflow').mockResolvedValue(undefined);
|
||||
});
|
||||
|
||||
|
||||
@@ -13,4 +13,55 @@ describe('Docker', () => {
|
||||
};
|
||||
await Docker.run(image, parameters);
|
||||
});
|
||||
|
||||
// game-ci/unity-builder#840: Unity 6.6+ editors request 1GiB of shared
|
||||
// memory and hard-fail against Docker's 64m default. This action never
|
||||
// passed --shm-size at all, and exposed no input to work around it.
|
||||
describe('--shm-size', () => {
|
||||
const baseParameters = {
|
||||
workspace: '/github/workspace',
|
||||
actionFolder: '/action',
|
||||
runnerTempPath: Action.rootFolder,
|
||||
sshAgent: '',
|
||||
sshPublicKeysDirectoryPath: '',
|
||||
gitPrivateToken: '',
|
||||
dockerWorkspacePath: '/github/workspace',
|
||||
dockerCpuLimit: '4',
|
||||
dockerMemoryLimit: '8192m',
|
||||
dockerIsolationMode: 'default',
|
||||
};
|
||||
|
||||
it('passes --shm-size on Linux when dockerShmSize is set', () => {
|
||||
const command = Docker.getLinuxCommand('unityci/editor:latest', {
|
||||
...baseParameters,
|
||||
dockerShmSize: '1025m',
|
||||
} as any);
|
||||
|
||||
expect(command).toContain('--shm-size=1025m');
|
||||
});
|
||||
|
||||
it('passes --shm-size on Windows when dockerShmSize is set', () => {
|
||||
const command = Docker.getWindowsCommand('unityci/editor:latest', {
|
||||
...baseParameters,
|
||||
dockerShmSize: '2g',
|
||||
} as any);
|
||||
|
||||
expect(command).toContain('--shm-size=2g');
|
||||
});
|
||||
|
||||
it('omits --shm-size when explicitly disabled with "0"', () => {
|
||||
const command = Docker.getLinuxCommand('unityci/editor:latest', {
|
||||
...baseParameters,
|
||||
dockerShmSize: '0',
|
||||
} as any);
|
||||
|
||||
expect(command).not.toContain('--shm-size');
|
||||
});
|
||||
|
||||
it('omits --shm-size when unset, rather than emitting "--shm-size=undefined"', () => {
|
||||
const command = Docker.getLinuxCommand('unityci/editor:latest', baseParameters as any);
|
||||
|
||||
expect(command).not.toContain('--shm-size');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,6 +4,20 @@ import path from 'node:path';
|
||||
import { ExecOptions, exec } from '@actions/exec';
|
||||
import { DockerParameters, StringKeyValuePair } from './shared-types';
|
||||
|
||||
/**
|
||||
* Unity 6.6+ editors request 1GiB of shared memory and hard-fail with
|
||||
* "Insufficient shared memory available" against Docker's 64m default
|
||||
* (game-ci/unity-builder#840). BuildParameters defaults this to 1025m, the
|
||||
* value unity-test-runner has always passed. '0'/'none' omits the flag so
|
||||
* Docker's own default applies.
|
||||
*/
|
||||
function shmSizeFlag(dockerShmSize?: string): string {
|
||||
const value = String(dockerShmSize ?? '').trim();
|
||||
if (value === '' || value === '0' || value.toLowerCase() === 'none') return '';
|
||||
|
||||
return `--shm-size=${value}`;
|
||||
}
|
||||
|
||||
class Docker {
|
||||
static async run(
|
||||
image: string,
|
||||
@@ -49,6 +63,7 @@ class Docker {
|
||||
dockerWorkspacePath,
|
||||
dockerCpuLimit,
|
||||
dockerMemoryLimit,
|
||||
dockerShmSize,
|
||||
} = parameters;
|
||||
|
||||
const githubHome = path.join(runnerTempPath, '_github_home');
|
||||
@@ -75,6 +90,7 @@ class Docker {
|
||||
--volume "${actionFolder}/BlankProject":"/BlankProject:z" \
|
||||
--cpus=${dockerCpuLimit} \
|
||||
--memory=${dockerMemoryLimit} \
|
||||
${shmSizeFlag(dockerShmSize)} \
|
||||
${sshAgent ? `--volume ${sshAgent}:/ssh-agent` : ''} \
|
||||
${
|
||||
sshAgent && !sshPublicKeysDirectoryPath
|
||||
@@ -97,6 +113,7 @@ class Docker {
|
||||
dockerWorkspacePath,
|
||||
dockerCpuLimit,
|
||||
dockerMemoryLimit,
|
||||
dockerShmSize,
|
||||
dockerIsolationMode,
|
||||
} = parameters;
|
||||
|
||||
@@ -107,6 +124,7 @@ class Docker {
|
||||
--workdir c:${dockerWorkspacePath} \
|
||||
--rm \
|
||||
${ImageEnvironmentFactory.getEnvVarString(parameters)} \
|
||||
--env BEE_CACHE_DIRECTORY=c:${dockerWorkspacePath}/Library/bee_cache \
|
||||
--env GITHUB_WORKSPACE=c:${dockerWorkspacePath} \
|
||||
${gitPrivateToken ? `--env GIT_PRIVATE_TOKEN="${gitPrivateToken}"` : ''} \
|
||||
--volume "${workspace}":"c:${dockerWorkspacePath}" \
|
||||
@@ -122,6 +140,7 @@ class Docker {
|
||||
--volume "${actionFolder}/BlankProject":"c:/BlankProject" \
|
||||
--cpus=${dockerCpuLimit} \
|
||||
--memory=${dockerMemoryLimit} \
|
||||
${shmSizeFlag(dockerShmSize)} \
|
||||
--isolation=${dockerIsolationMode} \
|
||||
${image} \
|
||||
powershell c:/steps/entrypoint.ps1`;
|
||||
|
||||
@@ -241,6 +241,17 @@ class Input {
|
||||
return Input.getInput('dockerWorkspacePath') ?? '/github/workspace';
|
||||
}
|
||||
|
||||
/**
|
||||
* Unity 6.6+ editors request 1GiB of shared memory and hard-fail with
|
||||
* "Insufficient shared memory available" against Docker's 64m default
|
||||
* (game-ci/unity-builder#840). unity-test-runner has always passed 1025m,
|
||||
* so match it here rather than leaving builds broken by default. '0' or
|
||||
* 'none' omits the flag and uses Docker's own default.
|
||||
*/
|
||||
static get dockerShmSize(): string {
|
||||
return Input.getInput('dockerShmSize') ?? '1025m';
|
||||
}
|
||||
|
||||
static get dockerCpuLimit(): string {
|
||||
return Input.getInput('dockerCpuLimit') ?? os.cpus().length.toString();
|
||||
}
|
||||
|
||||
@@ -4818,7 +4818,7 @@ [email protected]:
|
||||
"@graphql-typed-document-node/core" "^3.2.0"
|
||||
cross-fetch "^3.1.5"
|
||||
|
||||
graphql@^16.11.0:
|
||||
graphql@^16.8.1:
|
||||
version "16.11.0"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633"
|
||||
integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==
|
||||
@@ -7681,12 +7681,13 @@ undici@^5.25.4:
|
||||
dependencies:
|
||||
"@fastify/busboy" "^2.0.0"
|
||||
|
||||
unity-changeset@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/unity-changeset/-/unity-changeset-3.0.0.tgz#2a201ab76646a9c2d11aca3023108ddf2fbd4d77"
|
||||
integrity sha512-NayBfB+Olb9UosItzonJKrvW7S7KQQ+sbz0dyHuAjT55jt8v7umtfk6pf/rvQziOdVUfk9ndwXdpuGJADD5+iA==
|
||||
unity-changeset@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/unity-changeset/-/unity-changeset-3.1.0.tgz#7217915b995f1c441d8bdb1045c45c09f64ca94a"
|
||||
integrity sha512-bFqaq3yuxeMROwqw81fi6S2f8l+4lracvnW8SkdJLGDx+QvWxQhjK4LsGYM19/plDDh7q3MwEbzQgmcqj5uxBg==
|
||||
dependencies:
|
||||
"@deno/shim-deno" "~0.18.0"
|
||||
graphql "^16.8.1"
|
||||
graphql-request "6.1.0"
|
||||
|
||||
universal-user-agent@^6.0.0:
|
||||
|
||||
Reference in New Issue
Block a user