diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7ae530d3..d7aa5408 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,5 +8,7 @@ - [x] Read the contribution [guide](https://github.com/game-ci/unity-builder/blob/main/CONTRIBUTING.md) and accept the [code](https://github.com/game-ci/unity-builder/blob/main/CODE_OF_CONDUCT.md) of conduct +- [ ] Docs (If new inputs or outputs have been added or changes to behavior that should be documented. Please make + a PR in the [documentation repo](https://github.com/game-ci/documentation)) - [ ] Readme (updated or not needed) - [ ] Tests (added, updated or not needed) diff --git a/action.yml b/action.yml index ca447fae..e605f55a 100644 --- a/action.yml +++ b/action.yml @@ -47,13 +47,9 @@ inputs: required: false default: '' description: 'The android versionCode' - androidAppBundle: - required: false - default: 'false' - description: '[Deprecated] Use androidExportType instead. Whether to build .aab instead of .apk' androidExportType: required: false - default: '' + default: 'androidPackage' description: 'The android export type. Should be androidPackage for apk, androidAppBundle for aab, or androidStudioProject for an android studio project.' @@ -207,6 +203,16 @@ inputs: description: 'The version of Unity Hub to install on MacOS (e.g. 3.4.0). Defaults to latest available on brew if empty string or nothing is specified.' + unityLicensingServer: + default: '' + required: false + description: 'The Unity licensing server address to use for activating Unity.' + dockerWorkspacePath: + default: '/github/workspace' + required: false + description: + 'The path to mount the workspace inside the docker container. For windows, leave out the drive letter. For example + c:/github/workspace should be defined as /github/workspace' outputs: volume: diff --git a/dist/index.js b/dist/index.js index a965daa8..5c682c64 100644 Binary files a/dist/index.js and b/dist/index.js differ diff --git a/dist/index.js.map b/dist/index.js.map index 1fe06b3b..bac96017 100644 Binary files a/dist/index.js.map and b/dist/index.js.map differ diff --git a/dist/platforms/ubuntu/steps/build.sh b/dist/platforms/ubuntu/steps/build.sh index 66149409..74388fc4 100755 --- a/dist/platforms/ubuntu/steps/build.sh +++ b/dist/platforms/ubuntu/steps/build.sh @@ -153,6 +153,7 @@ fi # Make a given user owner of all artifacts if [[ -n "$CHOWN_FILES_TO" ]]; then + echo "Changing ownership of files to $CHOWN_FILES_TO for $BUILD_PATH_FULL and $UNITY_PROJECT_PATH" chown -R "$CHOWN_FILES_TO" "$BUILD_PATH_FULL" chown -R "$CHOWN_FILES_TO" "$UNITY_PROJECT_PATH" fi diff --git a/dist/platforms/ubuntu/steps/set_gitcredential.sh b/dist/platforms/ubuntu/steps/set_gitcredential.sh index d572a583..a336fc2b 100755 --- a/dist/platforms/ubuntu/steps/set_gitcredential.sh +++ b/dist/platforms/ubuntu/steps/set_gitcredential.sh @@ -9,8 +9,8 @@ else git config --global credential.helper store git config --global --replace-all url."https://token:$GIT_PRIVATE_TOKEN@github.com/".insteadOf ssh://git@github.com/ git config --global --add url."https://token:$GIT_PRIVATE_TOKEN@github.com/".insteadOf git@github.com - git config --global --add url."https://token:$GIT_PRIVATE_TOKEN@github.com/".insteadOf "https://github.com/" + git config --global url."https://ssh:$GIT_PRIVATE_TOKEN@github.com/".insteadOf "ssh://git@github.com/" git config --global url."https://git:$GIT_PRIVATE_TOKEN@github.com/".insteadOf "git@github.com:" diff --git a/dist/platforms/windows/entrypoint.ps1 b/dist/platforms/windows/entrypoint.ps1 index b5255d11..f0a6b555 100644 --- a/dist/platforms/windows/entrypoint.ps1 +++ b/dist/platforms/windows/entrypoint.ps1 @@ -1,6 +1,3 @@ -# Activate Unity -& "c:\steps\activate.ps1" - # Import any necessary registry keys, ie: location of windows 10 sdk # No guarantee that there will be any necessary registry keys, ie: tvOS Get-ChildItem -Path c:\regkeys -File | Foreach {reg import $_.fullname} @@ -8,6 +5,12 @@ Get-ChildItem -Path c:\regkeys -File | Foreach {reg import $_.fullname} # Register the Visual Studio installation so Unity can find it regsvr32 C:\ProgramData\Microsoft\VisualStudio\Setup\x64\Microsoft.VisualStudio.Setup.Configuration.Native.dll +# Setup Git Credentials +& "c:\steps\set_gitcredential.ps1" + +# Activate Unity +& "c:\steps\activate.ps1" + # Build the project & "c:\steps\build.ps1" diff --git a/dist/platforms/windows/set_gitcredential.ps1 b/dist/platforms/windows/set_gitcredential.ps1 new file mode 100644 index 00000000..afb947c6 --- /dev/null +++ b/dist/platforms/windows/set_gitcredential.ps1 @@ -0,0 +1,20 @@ +if ([string]::IsNullOrEmpty($env:GIT_PRIVATE_TOKEN)) { + Write-Host "GIT_PRIVATE_TOKEN unset skipping" +} +else { + Write-Host "GIT_PRIVATE_TOKEN is set configuring git credentials" + + git config --global credential.helper store + git config --global --replace-all "url.https://token:$env:GIT_PRIVATE_TOKEN@github.com/".insteadOf "ssh://git@github.com/" + git config --global --add "url.https://token:$env:GIT_PRIVATE_TOKEN@github.com/".insteadOf "git@github.com" + git config --global --add "url.https://token:$env:GIT_PRIVATE_TOKEN@github.com/".insteadOf "https://github.com/" + + git config --global "url.https://ssh:$env:GIT_PRIVATE_TOKEN@github.com/".insteadOf "ssh://git@github.com/" + git config --global "url.https://git:$env:GIT_PRIVATE_TOKEN@github.com/".insteadOf "git@github.com:" +} + +Write-Host "---------- git config --list -------------" +git config --list + +Write-Host "---------- git config --list --show-origin -------------" +git config --list --show-origin diff --git a/src/model/build-parameters.ts b/src/model/build-parameters.ts index 03f7378b..8b813ee3 100644 --- a/src/model/build-parameters.ts +++ b/src/model/build-parameters.ts @@ -82,6 +82,8 @@ class BuildParameters { public skipCache!: boolean; public cacheUnityInstallationOnMac!: boolean; public unityHubVersionOnMac!: string; + public dockerWorkspacePath!: string; + public static shouldUseRetainedWorkspaceMode(buildParameters: BuildParameters) { return buildParameters.maxRetainedWorkspaces > 0 && CloudRunner.lockedWorkspace !== ``; } @@ -187,6 +189,7 @@ class BuildParameters { skipCache: CloudRunnerOptions.skipCache, cacheUnityInstallationOnMac: Input.cacheUnityInstallationOnMac, unityHubVersionOnMac: Input.unityHubVersionOnMac, + dockerWorkspacePath: Input.dockerWorkspacePath, }; } diff --git a/src/model/docker.ts b/src/model/docker.ts index 9b438a0f..6e2fa90b 100644 --- a/src/model/docker.ts +++ b/src/model/docker.ts @@ -40,7 +40,7 @@ class Docker { additionalVariables: StringKeyValuePair[] = [], entrypointBash: boolean = false, ): string { - const { workspace, actionFolder, runnerTempPath, sshAgent, gitPrivateToken } = parameters; + const { workspace, actionFolder, runnerTempPath, sshAgent, gitPrivateToken, dockerWorkspacePath } = parameters; const githubHome = path.join(runnerTempPath, '_github_home'); if (!existsSync(githubHome)) mkdirSync(githubHome); @@ -49,16 +49,16 @@ class Docker { const commandPrefix = image === `alpine` ? `/bin/sh` : `/bin/bash`; return `docker run \ - --workdir /github/workspace \ + --workdir ${dockerWorkspacePath} \ --rm \ ${ImageEnvironmentFactory.getEnvVarString(parameters, additionalVariables)} \ --env UNITY_SERIAL \ - --env GITHUB_WORKSPACE=/github/workspace \ + --env GITHUB_WORKSPACE=${dockerWorkspacePath} \ ${gitPrivateToken ? `--env GIT_PRIVATE_TOKEN="${gitPrivateToken}"` : ''} \ ${sshAgent ? '--env SSH_AUTH_SOCK=/ssh-agent' : ''} \ --volume "${githubHome}":"/root:z" \ --volume "${githubWorkflow}":"/github/workflow:z" \ - --volume "${workspace}":"/github/workspace:z" \ + --volume "${workspace}":"${dockerWorkspacePath}:z" \ --volume "${actionFolder}/default-build-script:/UnityBuilderAction:z" \ --volume "${actionFolder}/platforms/ubuntu/steps:/steps:z" \ --volume "${actionFolder}/platforms/ubuntu/entrypoint.sh:/entrypoint.sh:z" \ @@ -72,16 +72,16 @@ class Docker { } static getWindowsCommand(image: string, parameters: DockerParameters): string { - const { workspace, actionFolder, unitySerial, gitPrivateToken } = parameters; + const { workspace, actionFolder, unitySerial, gitPrivateToken, dockerWorkspacePath } = parameters; return `docker run \ - --workdir c:/github/workspace \ + --workdir c:${dockerWorkspacePath} \ --rm \ ${ImageEnvironmentFactory.getEnvVarString(parameters)} \ --env UNITY_SERIAL="${unitySerial}" \ - --env GITHUB_WORKSPACE=c:/github/workspace \ + --env GITHUB_WORKSPACE=c:${dockerWorkspacePath} \ ${gitPrivateToken ? `--env GIT_PRIVATE_TOKEN="${gitPrivateToken}"` : ''} \ - --volume "${workspace}":"c:/github/workspace" \ + --volume "${workspace}":"c:${dockerWorkspacePath}" \ --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" \ diff --git a/src/model/input.test.ts b/src/model/input.test.ts index 32275812..f5d08d5c 100644 --- a/src/model/input.test.ts +++ b/src/model/input.test.ts @@ -143,81 +143,21 @@ describe('Input', () => { }); }); - describe('androidAppBundle', () => { - it('returns the default value', () => { - expect(Input.androidAppBundle).toStrictEqual(false); - }); - - it('returns true when string true is passed', () => { - const spy = jest.spyOn(core, 'getInput').mockReturnValue('true'); - expect(Input.androidAppBundle).toStrictEqual(true); - expect(spy).toHaveBeenCalledTimes(1); - }); - - it('returns false when string false is passed', () => { - const spy = jest.spyOn(core, 'getInput').mockReturnValue('false'); - expect(Input.androidAppBundle).toStrictEqual(false); - expect(spy).toHaveBeenCalledTimes(1); - }); - }); - describe('androidExportType', () => { it('returns the default value', () => { expect(Input.androidExportType).toStrictEqual('androidPackage'); }); - // TODO: Remove "and androidAppBundle is not set" in v3 test.each` input | expected ${'androidPackage'} | ${'androidPackage'} ${'androidAppBundle'} | ${'androidAppBundle'} ${'androidStudioProject'} | ${'androidStudioProject'} - `('returns $expected when $input is passed and androidAppBundle is not set', ({ input, expected }) => { + `('returns $expected when $input is passed', ({ input, expected }) => { const spy = jest.spyOn(core, 'getInput').mockReturnValue(input); expect(Input.androidExportType).toStrictEqual(expected); expect(spy).toHaveBeenCalledTimes(1); }); - - // TODO: Remove in v3 - test.each` - input | expected - ${'androidPackage'} | ${'androidPackage'} - ${'androidAppBundle'} | ${'androidAppBundle'} - ${'androidStudioProject'} | ${'androidStudioProject'} - `('returns $expected when $input is passed and overrides androidAppBundle if it is set', ({ input, expected }) => { - const spy = jest.spyOn(Input, 'getInput'); - spy.mockImplementationOnce(() => { - return input; - }); - - spy.mockImplementationOnce(() => { - return 'true'; - }); - expect(Input.androidExportType).toStrictEqual(expected); - expect(spy).toHaveBeenCalledTimes(1); - }); - - // TODO: Remove in v3 - test.each` - input | expected - ${'true'} | ${'androidAppBundle'} - ${'false'} | ${'androidPackage'} - `( - 'returns $expected when androidExportType is undefined and androidAppBundle is set to $input', - ({ input, expected }) => { - const spy = jest.spyOn(Input, 'getInput'); - spy.mockImplementationOnce(() => { - return ''; - }); - - spy.mockImplementationOnce(() => { - return input; - }); - - expect(Input.androidExportType).toStrictEqual(expected); - expect(spy).toHaveBeenCalledTimes(2); - }, - ); }); describe('androidSymbolType', () => { diff --git a/src/model/input.ts b/src/model/input.ts index 45f39c76..a4b17657 100644 --- a/src/model/input.ts +++ b/src/model/input.ts @@ -142,27 +142,8 @@ class Input { return Input.getInput('androidVersionCode') || ''; } - static get androidAppBundle(): boolean { - core.warning('androidAppBundle is deprecated, please use androidExportType instead'); - const input = Input.getInput('androidAppBundle') || false; - - return input === 'true'; - } - static get androidExportType(): string { - // TODO: remove this in V3 - const exportType = Input.getInput('androidExportType') || ''; - - if (exportType !== '') { - return exportType; - } - - return Input.androidAppBundle ? 'androidAppBundle' : 'androidPackage'; - - // End TODO - - // Use this in V3 when androidAppBundle is removed - // return Input.getInput('androidExportType') || 'androidPackage'; + return Input.getInput('androidExportType') || 'androidPackage'; } static get androidKeystoreName(): string { @@ -231,6 +212,10 @@ class Input { return Input.getInput('UNITY_LICENSE'); } + static get dockerWorkspacePath(): string { + return Input.getInput('dockerWorkspacePath') || '/github/workspace'; + } + public static ToEnvVarFormat(input: string) { if (input.toUpperCase() === input) { return input; diff --git a/src/model/versioning.ts b/src/model/versioning.ts index bf9e6292..38176907 100644 --- a/src/model/versioning.ts +++ b/src/model/versioning.ts @@ -34,13 +34,6 @@ export default class Versioning { return process.env.GITHUB_REF; } - /** - * The commit SHA that triggered the workflow run. - */ - static get sha() { - return process.env.GITHUB_SHA; - } - /** * Maximum number of lines to print when logging the git diff */ @@ -214,7 +207,7 @@ export default class Versioning { * identifies the current commit. */ static async getVersionDescription() { - return this.git(['describe', '--long', '--tags', '--always', this.sha!]); + return this.git(['describe', '--long', '--tags', '--always', 'HEAD']); } /** @@ -259,10 +252,9 @@ export default class Versioning { /** * Get the total number of commits on head. * - * Note: HEAD should not be used, as it may be detached, resulting in an additional count. */ static async getTotalNumberOfCommits() { - const numberOfCommitsAsString = await this.git(['rev-list', '--count', this.sha!]); + const numberOfCommitsAsString = await this.git(['rev-list', '--count', 'HEAD']); return Number.parseInt(numberOfCommitsAsString, 10); }