2019-12-22 14:05:15 +00:00
|
|
|
import { exec } from '@actions/exec';
|
2019-12-22 17:07:55 +00:00
|
|
|
import ImageTag from './image-tag';
|
2021-12-19 05:16:35 +00:00
|
|
|
const fs = require('fs');
|
2019-12-22 14:05:15 +00:00
|
|
|
|
2020-01-20 23:06:14 +00:00
|
|
|
class Docker {
|
2019-12-22 17:07:55 +00:00
|
|
|
static async build(buildParameters, silent = false) {
|
2020-10-22 08:20:12 +00:00
|
|
|
const { path, dockerfile, baseImage } = buildParameters;
|
2019-12-22 17:07:55 +00:00
|
|
|
const { version, platform } = baseImage;
|
2019-12-22 14:05:15 +00:00
|
|
|
|
2019-12-22 17:07:55 +00:00
|
|
|
const tag = new ImageTag({ repository: '', name: 'unity-builder', version, platform });
|
|
|
|
|
const command = `docker build ${path} \
|
|
|
|
|
--file ${dockerfile} \
|
|
|
|
|
--build-arg IMAGE=${baseImage} \
|
|
|
|
|
--tag ${tag}`;
|
|
|
|
|
|
2020-05-01 14:52:08 +00:00
|
|
|
await exec(command, undefined, { silent });
|
2019-12-22 14:05:15 +00:00
|
|
|
|
|
|
|
|
return tag;
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-22 21:24:46 +00:00
|
|
|
static async run(image, parameters, silent = false) {
|
2020-01-20 23:06:14 +00:00
|
|
|
const {
|
2020-04-26 18:22:09 +00:00
|
|
|
version,
|
2020-01-20 23:06:14 +00:00
|
|
|
workspace,
|
2020-08-22 15:59:08 +00:00
|
|
|
runnerTempPath,
|
2020-01-20 23:06:14 +00:00
|
|
|
platform,
|
|
|
|
|
projectPath,
|
|
|
|
|
buildName,
|
|
|
|
|
buildPath,
|
|
|
|
|
buildFile,
|
|
|
|
|
buildMethod,
|
2020-04-26 18:22:09 +00:00
|
|
|
buildVersion,
|
2020-06-24 22:02:05 +00:00
|
|
|
androidVersionCode,
|
2020-07-06 01:41:21 +00:00
|
|
|
androidKeystoreName,
|
|
|
|
|
androidKeystoreBase64,
|
|
|
|
|
androidKeystorePass,
|
|
|
|
|
androidKeyaliasName,
|
|
|
|
|
androidKeyaliasPass,
|
2021-11-24 12:51:52 +00:00
|
|
|
androidTargetSdkVersion,
|
|
|
|
|
androidSdkManagerParameters,
|
2020-07-06 01:41:21 +00:00
|
|
|
customParameters,
|
2021-05-28 21:51:10 +00:00
|
|
|
sshAgent,
|
2021-11-14 22:52:35 +00:00
|
|
|
gitPrivateToken,
|
2021-05-01 23:23:15 +00:00
|
|
|
chownFilesTo,
|
2020-01-20 23:06:14 +00:00
|
|
|
} = parameters;
|
2019-12-22 17:07:55 +00:00
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
switch (process.platform) {
|
|
|
|
|
case 'linux': {
|
2021-12-19 05:16:35 +00:00
|
|
|
const linuxRunCommand = `docker run \
|
2019-12-22 14:05:15 +00:00
|
|
|
--workdir /github/workspace \
|
|
|
|
|
--rm \
|
2020-01-07 22:46:19 +00:00
|
|
|
--env UNITY_LICENSE \
|
2020-03-04 16:49:04 +00:00
|
|
|
--env UNITY_LICENSE_FILE \
|
2020-01-11 22:23:42 +00:00
|
|
|
--env UNITY_EMAIL \
|
|
|
|
|
--env UNITY_PASSWORD \
|
|
|
|
|
--env UNITY_SERIAL \
|
2020-04-26 18:22:09 +00:00
|
|
|
--env UNITY_VERSION="${version}" \
|
2021-03-28 22:06:22 +00:00
|
|
|
--env USYM_UPLOAD_AUTH_TOKEN \
|
2020-02-01 19:28:45 +00:00
|
|
|
--env PROJECT_PATH="${projectPath}" \
|
|
|
|
|
--env BUILD_TARGET="${platform}" \
|
|
|
|
|
--env BUILD_NAME="${buildName}" \
|
|
|
|
|
--env BUILD_PATH="${buildPath}" \
|
|
|
|
|
--env BUILD_FILE="${buildFile}" \
|
|
|
|
|
--env BUILD_METHOD="${buildMethod}" \
|
2020-04-26 18:22:09 +00:00
|
|
|
--env VERSION="${buildVersion}" \
|
2020-06-24 22:02:05 +00:00
|
|
|
--env ANDROID_VERSION_CODE="${androidVersionCode}" \
|
2020-07-06 01:41:21 +00:00
|
|
|
--env ANDROID_KEYSTORE_NAME="${androidKeystoreName}" \
|
|
|
|
|
--env ANDROID_KEYSTORE_BASE64="${androidKeystoreBase64}" \
|
|
|
|
|
--env ANDROID_KEYSTORE_PASS="${androidKeystorePass}" \
|
|
|
|
|
--env ANDROID_KEYALIAS_NAME="${androidKeyaliasName}" \
|
|
|
|
|
--env ANDROID_KEYALIAS_PASS="${androidKeyaliasPass}" \
|
2021-11-24 12:51:52 +00:00
|
|
|
--env ANDROID_TARGET_SDK_VERSION="${androidTargetSdkVersion}" \
|
|
|
|
|
--env ANDROID_SDK_MANAGER_PARAMETERS="${androidSdkManagerParameters}" \
|
2020-02-01 19:28:45 +00:00
|
|
|
--env CUSTOM_PARAMETERS="${customParameters}" \
|
2021-05-01 23:23:15 +00:00
|
|
|
--env CHOWN_FILES_TO="${chownFilesTo}" \
|
2019-12-22 14:05:15 +00:00
|
|
|
--env GITHUB_REF \
|
|
|
|
|
--env GITHUB_SHA \
|
|
|
|
|
--env GITHUB_REPOSITORY \
|
|
|
|
|
--env GITHUB_ACTOR \
|
|
|
|
|
--env GITHUB_WORKFLOW \
|
|
|
|
|
--env GITHUB_HEAD_REF \
|
|
|
|
|
--env GITHUB_BASE_REF \
|
|
|
|
|
--env GITHUB_EVENT_NAME \
|
|
|
|
|
--env GITHUB_WORKSPACE=/github/workspace \
|
|
|
|
|
--env GITHUB_ACTION \
|
|
|
|
|
--env GITHUB_EVENT_PATH \
|
|
|
|
|
--env RUNNER_OS \
|
|
|
|
|
--env RUNNER_TOOL_CACHE \
|
|
|
|
|
--env RUNNER_TEMP \
|
|
|
|
|
--env RUNNER_WORKSPACE \
|
2021-11-14 22:52:35 +00:00
|
|
|
--env GIT_PRIVATE_TOKEN="${gitPrivateToken}" \
|
2021-05-28 21:51:10 +00:00
|
|
|
${sshAgent ? '--env SSH_AUTH_SOCK=/ssh-agent' : ''} \
|
2019-12-22 14:05:15 +00:00
|
|
|
--volume "/var/run/docker.sock":"/var/run/docker.sock" \
|
2021-02-03 16:39:52 +00:00
|
|
|
--volume "${runnerTempPath}/_github_home":"/root" \
|
2020-08-22 15:59:08 +00:00
|
|
|
--volume "${runnerTempPath}/_github_workflow":"/github/workflow" \
|
2019-12-22 17:07:55 +00:00
|
|
|
--volume "${workspace}":"/github/workspace" \
|
2021-05-28 21:51:10 +00:00
|
|
|
${sshAgent ? `--volume ${sshAgent}:/ssh-agent` : ''} \
|
|
|
|
|
${sshAgent ? '--volume /home/runner/.ssh/known_hosts:/root/.ssh/known_hosts:ro' : ''} \
|
2019-12-22 21:24:46 +00:00
|
|
|
${image}`;
|
|
|
|
|
|
2021-12-19 05:16:35 +00:00
|
|
|
await exec(linuxRunCommand, undefined, { silent });
|
|
|
|
|
break;
|
2021-12-26 22:05:08 +00:00
|
|
|
}
|
|
|
|
|
case 'win32': {
|
|
|
|
|
let unitySerial = '';
|
|
|
|
|
if (!process.env.UNITY_SERIAL) {
|
2021-12-19 05:16:35 +00:00
|
|
|
//No serial was present so it is a personal license that we need to convert
|
2021-12-26 22:05:08 +00:00
|
|
|
if (!process.env.UNITY_LICENSE) {
|
2021-12-19 05:16:35 +00:00
|
|
|
throw new Error(`Missing Unity License File and no Serial was found. If this
|
|
|
|
|
is a personal license, make sure to follow the activation
|
|
|
|
|
steps and set the UNITY_LICENSE GitHub secret or enter a Unity
|
2021-12-26 22:05:08 +00:00
|
|
|
serial number inside the UNITY_SERIAL GitHub secret.`);
|
2021-12-19 05:16:35 +00:00
|
|
|
}
|
|
|
|
|
unitySerial = this.getSerialFromLicenseFile(process.env.UNITY_LICENSE);
|
2021-12-26 22:05:08 +00:00
|
|
|
} else {
|
2021-12-19 05:16:35 +00:00
|
|
|
unitySerial = process.env.UNITY_SERIAL!;
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
if (!(process.env.UNITY_EMAIL && process.env.UNITY_PASSWORD)) {
|
2021-12-19 05:16:35 +00:00
|
|
|
throw new Error(`Unity email and password must be set for windows based builds`);
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
await this.setupWindowsRun(platform);
|
2021-12-19 05:16:35 +00:00
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
this.validateWindowsPrereqs(platform);
|
2021-12-19 05:16:35 +00:00
|
|
|
|
|
|
|
|
const windowsRunCommand = `docker run \
|
|
|
|
|
--workdir c:/github/workspace \
|
|
|
|
|
--rm \
|
|
|
|
|
--env UNITY_LICENSE \
|
|
|
|
|
--env UNITY_LICENSE_FILE \
|
|
|
|
|
--env UNITY_EMAIL \
|
|
|
|
|
--env UNITY_PASSWORD \
|
|
|
|
|
--env UNITY_SERIAL="${unitySerial}" \
|
|
|
|
|
--env UNITY_VERSION="${version}" \
|
|
|
|
|
--env USYM_UPLOAD_AUTH_TOKEN \
|
|
|
|
|
--env PROJECT_PATH="${projectPath}" \
|
|
|
|
|
--env BUILD_TARGET="${platform}" \
|
|
|
|
|
--env BUILD_NAME="${buildName}" \
|
|
|
|
|
--env BUILD_PATH="${buildPath}" \
|
|
|
|
|
--env BUILD_FILE="${buildFile}" \
|
|
|
|
|
--env BUILD_METHOD="${buildMethod}" \
|
|
|
|
|
--env VERSION="${buildVersion}" \
|
|
|
|
|
--env ANDROID_VERSION_CODE="${androidVersionCode}" \
|
|
|
|
|
--env ANDROID_KEYSTORE_NAME="${androidKeystoreName}" \
|
|
|
|
|
--env ANDROID_KEYSTORE_BASE64="${androidKeystoreBase64}" \
|
|
|
|
|
--env ANDROID_KEYSTORE_PASS="${androidKeystorePass}" \
|
|
|
|
|
--env ANDROID_KEYALIAS_NAME="${androidKeyaliasName}" \
|
|
|
|
|
--env ANDROID_KEYALIAS_PASS="${androidKeyaliasPass}" \
|
|
|
|
|
--env ANDROID_TARGET_SDK_VERSION="${androidTargetSdkVersion}" \
|
|
|
|
|
--env ANDROID_SDK_MANAGER_PARAMETERS="${androidSdkManagerParameters}" \
|
|
|
|
|
--env CUSTOM_PARAMETERS="${customParameters}" \
|
|
|
|
|
--env CHOWN_FILES_TO="${chownFilesTo}" \
|
|
|
|
|
--env GITHUB_REF \
|
|
|
|
|
--env GITHUB_SHA \
|
|
|
|
|
--env GITHUB_REPOSITORY \
|
|
|
|
|
--env GITHUB_ACTOR \
|
|
|
|
|
--env GITHUB_WORKFLOW \
|
|
|
|
|
--env GITHUB_HEAD_REF \
|
|
|
|
|
--env GITHUB_BASE_REF \
|
|
|
|
|
--env GITHUB_EVENT_NAME \
|
|
|
|
|
--env GITHUB_WORKSPACE=/github/workspace \
|
|
|
|
|
--env GITHUB_ACTION \
|
|
|
|
|
--env GITHUB_EVENT_PATH \
|
|
|
|
|
--env RUNNER_OS \
|
|
|
|
|
--env RUNNER_TOOL_CACHE \
|
|
|
|
|
--env RUNNER_TEMP \
|
|
|
|
|
--env RUNNER_WORKSPACE \
|
|
|
|
|
--env GIT_PRIVATE_TOKEN="${gitPrivateToken}" \
|
|
|
|
|
--volume "${runnerTempPath}/_github_home":"c:/root" \
|
|
|
|
|
--volume "${runnerTempPath}/_github_workflow":"c:/github/workflow" \
|
|
|
|
|
--volume "${workspace}":"c:/github/workspace" \
|
|
|
|
|
--volume "c:/regkeys":"c:/regkeys" \
|
|
|
|
|
--volume "C:/Program Files (x86)/Microsoft Visual Studio":"C:/Program Files (x86)/Microsoft Visual Studio" \
|
|
|
|
|
--volume "C:/Program Files (x86)/Windows Kits":"C:/Program Files (x86)/Windows Kits" \
|
|
|
|
|
--volume "C:/ProgramData/Microsoft/VisualStudio":"C:/ProgramData/Microsoft/VisualStudio" \
|
|
|
|
|
${image}`;
|
2021-12-26 22:05:08 +00:00
|
|
|
//Note: When upgrading to Server 2022, we will need to move to just "program files" since VS will be 64-bit
|
2021-12-19 05:16:35 +00:00
|
|
|
|
|
|
|
|
await exec(windowsRunCommand, undefined, { silent });
|
|
|
|
|
break;
|
2021-12-26 22:05:08 +00:00
|
|
|
}
|
2021-12-19 05:16:35 +00:00
|
|
|
default:
|
|
|
|
|
throw new Error(`Can't run docker on unsupported host platform`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
//Setup prerequisite files/folders for a windows-based docker run
|
|
|
|
|
static async setupWindowsRun(platform, silent = false) {
|
|
|
|
|
const makeRegKeyFolderCommand = 'mkdir c:/regkeys';
|
|
|
|
|
await exec(makeRegKeyFolderCommand, undefined, { silent });
|
|
|
|
|
switch (platform) {
|
|
|
|
|
//These all need the Windows 10 SDK
|
|
|
|
|
case 'StandaloneWindows':
|
|
|
|
|
this.generateWinSDKRegKeys(silent);
|
|
|
|
|
break;
|
|
|
|
|
case 'StandaloneWindows64':
|
|
|
|
|
this.generateWinSDKRegKeys(silent);
|
|
|
|
|
break;
|
|
|
|
|
case 'WSAPlayer':
|
|
|
|
|
this.generateWinSDKRegKeys(silent);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2021-12-19 05:16:35 +00:00
|
|
|
}
|
|
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
static async generateWinSDKRegKeys(silent = false) {
|
|
|
|
|
//Export registry keys that point to the location of the windows 10 sdk
|
|
|
|
|
const exportWinSDKRegKeysCommand =
|
|
|
|
|
'echo Y| reg export "HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v10.0" c:/regkeys/winsdk.reg';
|
|
|
|
|
await exec(exportWinSDKRegKeysCommand, undefined, { silent });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static validateWindowsPrereqs(platform) {
|
|
|
|
|
//We run different checks for different platforms
|
|
|
|
|
switch (platform) {
|
|
|
|
|
case 'StandaloneWindows':
|
|
|
|
|
this.checkForVisualStudio();
|
|
|
|
|
this.checkForWin10SDK();
|
|
|
|
|
break;
|
|
|
|
|
case 'StandaloneWindows64':
|
|
|
|
|
this.checkForVisualStudio();
|
|
|
|
|
this.checkForWin10SDK();
|
|
|
|
|
break;
|
|
|
|
|
case 'WSAPlayer':
|
|
|
|
|
this.checkForVisualStudio();
|
|
|
|
|
this.checkForWin10SDK();
|
|
|
|
|
break;
|
|
|
|
|
case 'tvOS':
|
|
|
|
|
this.checkForVisualStudio();
|
|
|
|
|
break;
|
2021-12-19 05:16:35 +00:00
|
|
|
}
|
2021-12-26 22:05:08 +00:00
|
|
|
}
|
2021-12-19 05:16:35 +00:00
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
static checkForWin10SDK() {
|
2021-12-19 05:16:35 +00:00
|
|
|
//Check for Windows 10 SDK on runner
|
2021-12-26 22:05:08 +00:00
|
|
|
if (!fs.existsSync('C:/Program Files (x86)/Windows Kits')) {
|
2021-12-19 05:16:35 +00:00
|
|
|
throw new Error(`Windows 10 SDK not found in default location. Make sure
|
2021-12-26 22:05:08 +00:00
|
|
|
the runner has a Windows 10 SDK installed in the default
|
|
|
|
|
location.`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static checkForVisualStudio() {
|
|
|
|
|
//Note: When upgrading to Server 2022, we will need to move to just "program files" since VS will be 64-bit
|
|
|
|
|
if (
|
|
|
|
|
!(
|
|
|
|
|
fs.existsSync('C:/Program Files (x86)/Microsoft Visual Studio') &&
|
|
|
|
|
fs.existsSync('C:/ProgramData/Microsoft/VisualStudio')
|
|
|
|
|
)
|
|
|
|
|
) {
|
|
|
|
|
throw new Error(`Visual Studio Installation not found at default location.
|
|
|
|
|
Make sure the runner has Visual Studio installed in the
|
|
|
|
|
default location`);
|
2021-12-19 05:16:35 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-26 22:05:08 +00:00
|
|
|
static getSerialFromLicenseFile(license) {
|
2021-12-19 05:16:35 +00:00
|
|
|
const startKey = `<DeveloperData Value="`;
|
|
|
|
|
const endKey = `"/>`;
|
2021-12-26 22:05:08 +00:00
|
|
|
const startIndex = license.indexOf(startKey) + startKey.length;
|
|
|
|
|
if (startIndex < 0) {
|
2021-12-19 05:16:35 +00:00
|
|
|
throw new Error(`License File was corrupted, unable to locate serial`);
|
|
|
|
|
}
|
2021-12-26 22:05:08 +00:00
|
|
|
const endIndex = license.indexOf(endKey, startIndex);
|
|
|
|
|
//We slice off the first 4 characters as they are garbage values
|
|
|
|
|
return Buffer.from(license.slice(startIndex, endIndex), 'base64').toString('binary').slice(4);
|
2019-12-22 14:05:15 +00:00
|
|
|
}
|
|
|
|
|
}
|
2020-01-20 23:06:14 +00:00
|
|
|
|
|
|
|
|
export default Docker;
|