feat: Add support for macos #211

pull/212/head
Kariaro 2022-12-27 16:42:37 +01:00
parent d982116b88
commit 97a959b57e
No known key found for this signature in database
GPG Key ID: 53CF901A5E005F76
12 changed files with 311 additions and 39 deletions

View File

@ -24,8 +24,8 @@ jobs:
# - run: yarn build --quiet && git diff --quiet action || { echo "ERROR - index.js is different from repository version. Forgot to run `yarn build`?" ; exit 62; } # - run: yarn build --quiet && git diff --quiet action || { echo "ERROR - index.js is different from repository version. Forgot to run `yarn build`?" ; exit 62; }
testAllModesLikeInTheReadme: testAllModesLikeInTheReadme:
name: Test in ${{ matrix.testMode }} on version ${{ matrix.unityVersion }} name: Test in ${{ matrix.testMode }} on version ${{ matrix.unityVersion }} on system ${{ matrix.system }}
runs-on: ubuntu-latest runs-on: ${{ matrix.system }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@ -36,6 +36,9 @@ jobs:
testMode: testMode:
- playmode - playmode
- editmode - editmode
system:
- ubuntu-latest
- macos-latest
steps: steps:
########################### ###########################
# Checkout # # Checkout #

152
dist/index.js generated vendored
View File

@ -98,20 +98,35 @@ function run() {
const baseImage = new model_1.ImageTag({ editorVersion, customImage }); const baseImage = new model_1.ImageTag({ editorVersion, customImage });
const runnerContext = model_1.Action.runnerContext(); const runnerContext = model_1.Action.runnerContext();
try { try {
yield model_1.Docker.run(baseImage, Object.assign({ actionFolder, yield (process.platform === 'darwin'
editorVersion, ? model_1.MacRunner.run(Object.assign({ actionFolder,
workspace, editorVersion,
projectPath, workspace,
customParameters, projectPath,
testMode, customParameters,
coverageOptions, testMode,
artifactsPath, coverageOptions,
useHostNetwork, artifactsPath,
sshAgent, useHostNetwork,
gitPrivateToken, sshAgent,
githubToken, gitPrivateToken,
chownFilesTo, githubToken,
unityLicensingServer }, runnerContext)); chownFilesTo,
unityLicensingServer }, runnerContext))
: model_1.Docker.run(baseImage, Object.assign({ actionFolder,
editorVersion,
workspace,
projectPath,
customParameters,
testMode,
coverageOptions,
artifactsPath,
useHostNetwork,
sshAgent,
gitPrivateToken,
githubToken,
chownFilesTo,
unityLicensingServer }, runnerContext)));
} }
finally { finally {
yield model_1.Output.setArtifactsPath(artifactsPath); yield model_1.Output.setArtifactsPath(artifactsPath);
@ -146,7 +161,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
const path_1 = __importDefault(__nccwpck_require__(1017)); const path_1 = __importDefault(__nccwpck_require__(1017));
const Action = { const Action = {
get supportedPlatforms() { get supportedPlatforms() {
return ['linux', 'win32']; return ['linux', 'win32', 'darwin'];
}, },
get isRunningLocally() { get isRunningLocally() {
return process.env.RUNNER_WORKSPACE === undefined; return process.env.RUNNER_WORKSPACE === undefined;
@ -427,6 +442,8 @@ class ImageTag {
return 'ubuntu'; return 'ubuntu';
case 'win32': case 'win32':
return 'windows'; return 'windows';
case 'darwin':
return 'macos';
default: default:
throw new Error(`The Operating System of this runner, "${platform}", is not yet supported.`); throw new Error(`The Operating System of this runner, "${platform}", is not yet supported.`);
} }
@ -437,6 +454,8 @@ class ImageTag {
return platform_1.default.types.StandaloneLinux64; return platform_1.default.types.StandaloneLinux64;
case 'win32': case 'win32':
return platform_1.default.types.StandaloneWindows; return platform_1.default.types.StandaloneWindows;
case 'darwin':
return platform_1.default.types.StandaloneOSX;
default: default:
throw new Error(`The Operating System of this runner, "${platform}", is not yet supported.`); throw new Error(`The Operating System of this runner, "${platform}", is not yet supported.`);
} }
@ -523,7 +542,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ResultsCheck = exports.Output = exports.Input = exports.ImageTag = exports.Docker = exports.Action = void 0; exports.ResultsCheck = exports.Output = exports.MacRunner = exports.Input = exports.ImageTag = exports.Docker = exports.Action = void 0;
var action_1 = __nccwpck_require__(9088); var action_1 = __nccwpck_require__(9088);
Object.defineProperty(exports, "Action", ({ enumerable: true, get: function () { return __importDefault(action_1).default; } })); Object.defineProperty(exports, "Action", ({ enumerable: true, get: function () { return __importDefault(action_1).default; } }));
var docker_1 = __nccwpck_require__(6934); var docker_1 = __nccwpck_require__(6934);
@ -532,6 +551,8 @@ var image_tag_1 = __nccwpck_require__(7648);
Object.defineProperty(exports, "ImageTag", ({ enumerable: true, get: function () { return __importDefault(image_tag_1).default; } })); Object.defineProperty(exports, "ImageTag", ({ enumerable: true, get: function () { return __importDefault(image_tag_1).default; } }));
var input_1 = __nccwpck_require__(1933); var input_1 = __nccwpck_require__(1933);
Object.defineProperty(exports, "Input", ({ enumerable: true, get: function () { return __importDefault(input_1).default; } })); Object.defineProperty(exports, "Input", ({ enumerable: true, get: function () { return __importDefault(input_1).default; } }));
var mac_runner_1 = __nccwpck_require__(6460);
Object.defineProperty(exports, "MacRunner", ({ enumerable: true, get: function () { return __importDefault(mac_runner_1).default; } }));
var output_1 = __nccwpck_require__(5487); var output_1 = __nccwpck_require__(5487);
Object.defineProperty(exports, "Output", ({ enumerable: true, get: function () { return __importDefault(output_1).default; } })); Object.defineProperty(exports, "Output", ({ enumerable: true, get: function () { return __importDefault(output_1).default; } }));
var results_check_1 = __nccwpck_require__(9183); var results_check_1 = __nccwpck_require__(9183);
@ -663,6 +684,97 @@ class LicensingServerSetup {
exports["default"] = LicensingServerSetup; exports["default"] = LicensingServerSetup;
/***/ }),
/***/ 6460:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
const fs_1 = __nccwpck_require__(7147);
const licensing_server_setup_1 = __importDefault(__nccwpck_require__(6089));
const exec_1 = __nccwpck_require__(1514);
const path_1 = __importDefault(__nccwpck_require__(1017));
const MacRunner = {
run(parameters, silent = false) {
return __awaiter(this, void 0, void 0, function* () {
if (parameters.unityLicensingServer !== '') {
licensing_server_setup_1.default.Setup(parameters.unityLicensingServer, parameters.actionFolder);
}
const runCommand = this.getMacCommand(parameters);
yield (0, exec_1.exec)(runCommand, undefined, { silent });
});
},
getMacCommand(parameters) {
const { actionFolder, editorVersion, workspace, projectPath, customParameters, testMode, coverageOptions, artifactsPath, sshAgent, gitPrivateToken, githubToken, runnerTemporaryPath, chownFilesTo, unityLicensingServer, } = parameters;
const githubHome = path_1.default.join(runnerTemporaryPath, '_github_home');
if (!(0, fs_1.existsSync)(githubHome))
(0, fs_1.mkdirSync)(githubHome);
const githubWorkflow = path_1.default.join(runnerTemporaryPath, '_github_workflow');
if (!(0, fs_1.existsSync)(githubWorkflow))
(0, fs_1.mkdirSync)(githubWorkflow);
const testPlatforms = (testMode === 'all' ? ['playmode', 'editmode', 'COMBINE_RESULTS'] : [testMode]).join(';');
return `cd "${workspace}"
ln -s /root "${githubHome}"
ln -s /github/workflow "${githubWorkflow}"
ln -s /github/workspace "${workspace}"
ln -s /steps "${actionFolder}/steps"
ln -s /entrypoint.sh "${actionFolder}/entrypoint.sh"
ln -s /usr/share/unity3d/config "${actionFolder}/unity-config"
${sshAgent ? `ln -s /ssh-agent ${sshAgent}` : ''}
${sshAgent ? `ln -s /root/.ssh/known_hosts /home/runner/.ssh/known_hosts` : ''}
env \
UNITY_LICENSE= \
UNITY_LICENSE_FILE= \
UNITY_EMAIL= \
UNITY_PASSWORD= \
UNITY_SERIAL= \
UNITY_LICENSING_SERVER="${unityLicensingServer}" \
UNITY_VERSION="${editorVersion}" \
PROJECT_PATH="${projectPath}" \
CUSTOM_PARAMETERS="${customParameters}" \
TEST_PLATFORMS="${testPlatforms}" \
COVERAGE_OPTIONS="${coverageOptions}" \
COVERAGE_RESULTS_PATH="CodeCoverage" \
ARTIFACTS_PATH="${artifactsPath}" \
GITHUB_REF= \
GITHUB_SHA= \
GITHUB_REPOSITORY= \
GITHUB_ACTOR= \
GITHUB_WORKFLOW= \
GITHUB_HEAD_REF= \
GITHUB_BASE_REF= \
GITHUB_EVENT_NAME= \
GITHUB_WORKSPACE="/github/workspace" \
GITHUB_ACTION= \
GITHUB_EVENT_PATH= \
RUNNER_OS= \
RUNNER_TOOL_CACHE= \
RUNNER_TEMP= \
RUNNER_WORKSPACE= \
GIT_PRIVATE_TOKEN="${gitPrivateToken}" \
CHOWN_FILES_TO="${chownFilesTo}" \
${sshAgent ? `SSH_AUTH_SOCK=/ssh-agent` : ''} \
USE_EXIT_CODE=${githubToken ? 'false' : 'true'} \
/bin/bash -c /entrypoint.sh`;
},
};
exports["default"] = MacRunner;
/***/ }), /***/ }),
/***/ 5487: /***/ 5487:
@ -768,6 +880,14 @@ const Platform = {
return false; return false;
} }
}, },
isMac(platform) {
switch (platform) {
case Platform.types.StandaloneOSX:
return true;
default:
return false;
}
},
}; };
exports["default"] = Platform; exports["default"] = Platform;

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
import * as core from '@actions/core'; import * as core from '@actions/core';
import { Action, Docker, ImageTag, Input, Output, ResultsCheck } from './model'; import { Action, Docker, ImageTag, Input, MacRunner, Output, ResultsCheck } from './model';
export async function run() { export async function run() {
try { try {
@ -26,23 +26,41 @@ export async function run() {
const runnerContext = Action.runnerContext(); const runnerContext = Action.runnerContext();
try { try {
await Docker.run(baseImage, { await (process.platform === 'darwin'
actionFolder, ? MacRunner.run({
editorVersion, actionFolder,
workspace, editorVersion,
projectPath, workspace,
customParameters, projectPath,
testMode, customParameters,
coverageOptions, testMode,
artifactsPath, coverageOptions,
useHostNetwork, artifactsPath,
sshAgent, useHostNetwork,
gitPrivateToken, sshAgent,
githubToken, gitPrivateToken,
chownFilesTo, githubToken,
unityLicensingServer, chownFilesTo,
...runnerContext, unityLicensingServer,
}); ...runnerContext,
})
: Docker.run(baseImage, {
actionFolder,
editorVersion,
workspace,
projectPath,
customParameters,
testMode,
coverageOptions,
artifactsPath,
useHostNetwork,
sshAgent,
gitPrivateToken,
githubToken,
chownFilesTo,
unityLicensingServer,
...runnerContext,
}));
} finally { } finally {
await Output.setArtifactsPath(artifactsPath); await Output.setArtifactsPath(artifactsPath);
await Output.setCoveragePath('CodeCoverage'); await Output.setCoveragePath('CodeCoverage');

View File

@ -5,7 +5,11 @@ import path from 'path';
describe('Action', () => { describe('Action', () => {
describe('compatibility check', () => { describe('compatibility check', () => {
it('throws for anything other than linux or windows', () => { it('throws for anything other than linux or windows', () => {
if (process.platform !== 'linux' && process.platform !== 'win32') { if (
process.platform !== 'linux' &&
process.platform !== 'win32' &&
process.platform !== 'darwin'
) {
expect(() => Action.checkCompatibility()).toThrow(); expect(() => Action.checkCompatibility()).toThrow();
} else { } else {
expect(() => Action.checkCompatibility()).not.toThrow(); expect(() => Action.checkCompatibility()).not.toThrow();

View File

@ -7,7 +7,7 @@ export interface RunnerContext {
const Action = { const Action = {
get supportedPlatforms() { get supportedPlatforms() {
return ['linux', 'win32']; return ['linux', 'win32', 'darwin'];
}, },
get isRunningLocally() { get isRunningLocally() {

View File

@ -58,6 +58,8 @@ class ImageTag {
return 'ubuntu'; return 'ubuntu';
case 'win32': case 'win32':
return 'windows'; return 'windows';
case 'darwin':
return 'macos';
default: default:
throw new Error( throw new Error(
`The Operating System of this runner, "${platform}", is not yet supported.`, `The Operating System of this runner, "${platform}", is not yet supported.`,
@ -71,6 +73,8 @@ class ImageTag {
return Platform.types.StandaloneLinux64; return Platform.types.StandaloneLinux64;
case 'win32': case 'win32':
return Platform.types.StandaloneWindows; return Platform.types.StandaloneWindows;
case 'darwin':
return Platform.types.StandaloneOSX;
default: default:
throw new Error( throw new Error(
`The Operating System of this runner, "${platform}", is not yet supported.`, `The Operating System of this runner, "${platform}", is not yet supported.`,

View File

@ -2,5 +2,6 @@ export { default as Action } from './action';
export { default as Docker } from './docker'; export { default as Docker } from './docker';
export { default as ImageTag } from './image-tag'; export { default as ImageTag } from './image-tag';
export { default as Input } from './input'; export { default as Input } from './input';
export { default as MacRunner } from './mac-runner';
export { default as Output } from './output'; export { default as Output } from './output';
export { default as ResultsCheck } from './results-check'; export { default as ResultsCheck } from './results-check';

View File

@ -0,0 +1,15 @@
import Action from './action';
import MacRunner from './mac-runner';
describe('MacRunner', () => {
it.skip('runs', async () => {
const parameters = {
workspace: Action.rootFolder,
projectPath: `${Action.rootFolder}/test-project`,
buildName: 'someBuildName',
buildsPath: 'build',
method: '',
};
await MacRunner.run(parameters);
});
});

View File

@ -0,0 +1,88 @@
import { existsSync, mkdirSync } from 'fs';
import LicensingServerSetup from './licensing-server-setup';
import { exec } from '@actions/exec';
import path from 'path';
const MacRunner = {
async run(parameters, silent = false) {
if (parameters.unityLicensingServer !== '') {
LicensingServerSetup.Setup(parameters.unityLicensingServer, parameters.actionFolder);
}
const runCommand = this.getMacCommand(parameters);
await exec(runCommand, undefined, { silent });
},
getMacCommand(parameters): string {
const {
actionFolder,
editorVersion,
workspace,
projectPath,
customParameters,
testMode,
coverageOptions,
artifactsPath,
sshAgent,
gitPrivateToken,
githubToken,
runnerTemporaryPath,
chownFilesTo,
unityLicensingServer,
} = parameters;
const githubHome = path.join(runnerTemporaryPath, '_github_home');
if (!existsSync(githubHome)) mkdirSync(githubHome);
const githubWorkflow = path.join(runnerTemporaryPath, '_github_workflow');
if (!existsSync(githubWorkflow)) mkdirSync(githubWorkflow);
const testPlatforms = (
testMode === 'all' ? ['playmode', 'editmode', 'COMBINE_RESULTS'] : [testMode]
).join(';');
return `cd "${workspace}"
ln -s /root "${githubHome}"
ln -s /github/workflow "${githubWorkflow}"
ln -s /github/workspace "${workspace}"
ln -s /steps "${actionFolder}/steps"
ln -s /entrypoint.sh "${actionFolder}/entrypoint.sh"
ln -s /usr/share/unity3d/config "${actionFolder}/unity-config"
${sshAgent ? `ln -s /ssh-agent ${sshAgent}` : ''}
${sshAgent ? `ln -s /root/.ssh/known_hosts /home/runner/.ssh/known_hosts` : ''}
env \
UNITY_LICENSE= \
UNITY_LICENSE_FILE= \
UNITY_EMAIL= \
UNITY_PASSWORD= \
UNITY_SERIAL= \
UNITY_LICENSING_SERVER="${unityLicensingServer}" \
UNITY_VERSION="${editorVersion}" \
PROJECT_PATH="${projectPath}" \
CUSTOM_PARAMETERS="${customParameters}" \
TEST_PLATFORMS="${testPlatforms}" \
COVERAGE_OPTIONS="${coverageOptions}" \
COVERAGE_RESULTS_PATH="CodeCoverage" \
ARTIFACTS_PATH="${artifactsPath}" \
GITHUB_REF= \
GITHUB_SHA= \
GITHUB_REPOSITORY= \
GITHUB_ACTOR= \
GITHUB_WORKFLOW= \
GITHUB_HEAD_REF= \
GITHUB_BASE_REF= \
GITHUB_EVENT_NAME= \
GITHUB_WORKSPACE="/github/workspace" \
GITHUB_ACTION= \
GITHUB_EVENT_PATH= \
RUNNER_OS= \
RUNNER_TOOL_CACHE= \
RUNNER_TEMP= \
RUNNER_WORKSPACE= \
GIT_PRIVATE_TOKEN="${gitPrivateToken}" \
CHOWN_FILES_TO="${chownFilesTo}" \
${sshAgent ? `SSH_AUTH_SOCK=/ssh-agent` : ''} \
USE_EXIT_CODE=${githubToken ? 'false' : 'true'} \
/bin/bash -c /entrypoint.sh`;
},
};
export default MacRunner;

View File

@ -34,4 +34,14 @@ describe('Platform', () => {
expect(Platform.isAndroid(Platform.types.StandaloneWindows64)).toStrictEqual(false); expect(Platform.isAndroid(Platform.types.StandaloneWindows64)).toStrictEqual(false);
}); });
}); });
describe('isMac', () => {
it('returns true for MacOS', () => {
expect(Platform.isMac(Platform.types.StandaloneOSX)).toStrictEqual(true);
});
it('returns false for windows', () => {
expect(Platform.isMac(Platform.types.StandaloneWindows64)).toStrictEqual(false);
});
});
}); });

View File

@ -46,6 +46,15 @@ const Platform = {
return false; return false;
} }
}, },
isMac(platform) {
switch (platform) {
case Platform.types.StandaloneOSX:
return true;
default:
return false;
}
},
}; };
export default Platform; export default Platform;