Add androidTargetSdkVersion as an option to update the Android SDK (#298)
* Add androidTargetSdkVersion as an option to update the Android SDK API level * Fix build script * Update default value * Add JAVA_HOME * Use Unity_path * Update src/model/android-versioning.test.ts Co-authored-by: Webber Takken <webber@takken.io> * Correct JAVA_HOME * Use unity_path * Update JAVA_HOME to use path found from 2020.3 * Dynamically determine JAVA_HOME * Update path determination Co-authored-by: Webber Takken <webber@takken.io>pull/301/head
parent
11a0d0947e
commit
239273ca72
|
@ -98,6 +98,10 @@ inputs:
|
||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
description: 'The android keyaliasPass'
|
description: 'The android keyaliasPass'
|
||||||
|
androidTargetSdkVersion:
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
description: 'The android target API level.'
|
||||||
customParameters:
|
customParameters:
|
||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
|
||||||
namespace UnityBuilderAction.Input
|
namespace UnityBuilderAction.Input
|
||||||
|
@ -16,6 +17,8 @@ namespace UnityBuilderAction.Input
|
||||||
PlayerSettings.Android.keyaliasName = keyaliasName;
|
PlayerSettings.Android.keyaliasName = keyaliasName;
|
||||||
if (options.TryGetValue("androidKeyaliasPass", out string keyaliasPass) && !string.IsNullOrEmpty(keyaliasPass))
|
if (options.TryGetValue("androidKeyaliasPass", out string keyaliasPass) && !string.IsNullOrEmpty(keyaliasPass))
|
||||||
PlayerSettings.Android.keyaliasPass = keyaliasPass;
|
PlayerSettings.Android.keyaliasPass = keyaliasPass;
|
||||||
|
if (options.TryGetValue("androidTargetSdkVersion", out string androidTargetSdkVersion) && !string.IsNullOrEmpty(androidTargetSdkVersion))
|
||||||
|
PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions) Enum.Parse(typeof(AndroidSdkVersions), androidTargetSdkVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,6 +179,10 @@ class AndroidVersioning {
|
||||||
core.info(`Using android versionCode ${versionCode}`);
|
core.info(`Using android versionCode ${versionCode}`);
|
||||||
return versionCode;
|
return versionCode;
|
||||||
}
|
}
|
||||||
|
static determineSdkManagerParameters(targetSdkVersion) {
|
||||||
|
const parsedVersion = Number.parseInt(targetSdkVersion.slice(-2), 10);
|
||||||
|
return Number.isNaN(parsedVersion) ? '' : `platforms;android-${parsedVersion}`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
exports.default = AndroidVersioning;
|
exports.default = AndroidVersioning;
|
||||||
|
|
||||||
|
@ -215,6 +219,7 @@ class BuildParameters {
|
||||||
const unityVersion = unity_versioning_1.default.determineUnityVersion(input_1.default.projectPath, input_1.default.unityVersion);
|
const unityVersion = unity_versioning_1.default.determineUnityVersion(input_1.default.projectPath, input_1.default.unityVersion);
|
||||||
const buildVersion = yield versioning_1.default.determineVersion(input_1.default.versioningStrategy, input_1.default.specifiedVersion);
|
const buildVersion = yield versioning_1.default.determineVersion(input_1.default.versioningStrategy, input_1.default.specifiedVersion);
|
||||||
const androidVersionCode = android_versioning_1.default.determineVersionCode(buildVersion, input_1.default.androidVersionCode);
|
const androidVersionCode = android_versioning_1.default.determineVersionCode(buildVersion, input_1.default.androidVersionCode);
|
||||||
|
const androidSdkManagerParameters = android_versioning_1.default.determineSdkManagerParameters(input_1.default.androidTargetSdkVersion);
|
||||||
return {
|
return {
|
||||||
version: unityVersion,
|
version: unityVersion,
|
||||||
customImage: input_1.default.customImage,
|
customImage: input_1.default.customImage,
|
||||||
|
@ -232,6 +237,8 @@ class BuildParameters {
|
||||||
androidKeystorePass: input_1.default.androidKeystorePass,
|
androidKeystorePass: input_1.default.androidKeystorePass,
|
||||||
androidKeyaliasName: input_1.default.androidKeyaliasName,
|
androidKeyaliasName: input_1.default.androidKeyaliasName,
|
||||||
androidKeyaliasPass: input_1.default.androidKeyaliasPass,
|
androidKeyaliasPass: input_1.default.androidKeyaliasPass,
|
||||||
|
androidTargetSdkVersion: input_1.default.androidTargetSdkVersion,
|
||||||
|
androidSdkManagerParameters,
|
||||||
customParameters: input_1.default.customParameters,
|
customParameters: input_1.default.customParameters,
|
||||||
sshAgent: input_1.default.sshAgent,
|
sshAgent: input_1.default.sshAgent,
|
||||||
gitPrivateToken: input_1.default.gitPrivateToken,
|
gitPrivateToken: input_1.default.gitPrivateToken,
|
||||||
|
@ -352,7 +359,7 @@ class Docker {
|
||||||
}
|
}
|
||||||
static run(image, parameters, silent = false) {
|
static run(image, parameters, silent = false) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const { version, workspace, runnerTempPath, platform, projectPath, buildName, buildPath, buildFile, buildMethod, buildVersion, androidVersionCode, androidKeystoreName, androidKeystoreBase64, androidKeystorePass, androidKeyaliasName, androidKeyaliasPass, customParameters, sshAgent, gitPrivateToken, chownFilesTo, } = parameters;
|
const { version, workspace, runnerTempPath, platform, projectPath, buildName, buildPath, buildFile, buildMethod, buildVersion, androidVersionCode, androidKeystoreName, androidKeystoreBase64, androidKeystorePass, androidKeyaliasName, androidKeyaliasPass, androidTargetSdkVersion, androidSdkManagerParameters, customParameters, sshAgent, gitPrivateToken, chownFilesTo, } = parameters;
|
||||||
const command = `docker run \
|
const command = `docker run \
|
||||||
--workdir /github/workspace \
|
--workdir /github/workspace \
|
||||||
--rm \
|
--rm \
|
||||||
|
@ -376,6 +383,8 @@ class Docker {
|
||||||
--env ANDROID_KEYSTORE_PASS="${androidKeystorePass}" \
|
--env ANDROID_KEYSTORE_PASS="${androidKeystorePass}" \
|
||||||
--env ANDROID_KEYALIAS_NAME="${androidKeyaliasName}" \
|
--env ANDROID_KEYALIAS_NAME="${androidKeyaliasName}" \
|
||||||
--env ANDROID_KEYALIAS_PASS="${androidKeyaliasPass}" \
|
--env ANDROID_KEYALIAS_PASS="${androidKeyaliasPass}" \
|
||||||
|
--env ANDROID_TARGET_SDK_VERSION="${androidTargetSdkVersion}" \
|
||||||
|
--env ANDROID_SDK_MANAGER_PARAMETERS="${androidSdkManagerParameters}" \
|
||||||
--env CUSTOM_PARAMETERS="${customParameters}" \
|
--env CUSTOM_PARAMETERS="${customParameters}" \
|
||||||
--env CHOWN_FILES_TO="${chownFilesTo}" \
|
--env CHOWN_FILES_TO="${chownFilesTo}" \
|
||||||
--env GITHUB_REF \
|
--env GITHUB_REF \
|
||||||
|
@ -665,6 +674,9 @@ class Input {
|
||||||
static get androidKeyaliasPass() {
|
static get androidKeyaliasPass() {
|
||||||
return core.getInput('androidKeyaliasPass') || '';
|
return core.getInput('androidKeyaliasPass') || '';
|
||||||
}
|
}
|
||||||
|
static get androidTargetSdkVersion() {
|
||||||
|
return core.getInput('androidTargetSdkVersion') || '';
|
||||||
|
}
|
||||||
static get allowDirtyBuild() {
|
static get allowDirtyBuild() {
|
||||||
const input = core.getInput('allowDirtyBuild') || false;
|
const input = core.getInput('allowDirtyBuild') || false;
|
||||||
return input === 'true';
|
return input === 'true';
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -63,14 +63,24 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
# Create Android keystore, if needed
|
# Prepare Android keystore and SDK, if needed
|
||||||
#
|
#
|
||||||
|
|
||||||
if [[ -z $ANDROID_KEYSTORE_NAME || -z $ANDROID_KEYSTORE_BASE64 ]]; then
|
if [[ "$BUILD_TARGET" == "Android" && -n "$ANDROID_KEYSTORE_NAME" && -n "$ANDROID_KEYSTORE_BASE64" ]]; then
|
||||||
echo "Not creating Android keystore."
|
echo "Creating Android keystore."
|
||||||
else
|
|
||||||
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$UNITY_PROJECT_PATH/$ANDROID_KEYSTORE_NAME"
|
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$UNITY_PROJECT_PATH/$ANDROID_KEYSTORE_NAME"
|
||||||
echo "Created Android keystore."
|
echo "Created Android keystore."
|
||||||
|
else
|
||||||
|
echo "Not creating Android keystore."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$BUILD_TARGET" == "Android" && -n "$ANDROID_SDK_MANAGER_PARAMETERS" ]]; then
|
||||||
|
echo "Updating Android SDK with parameters: $ANDROID_SDK_MANAGER_PARAMETERS"
|
||||||
|
export JAVA_HOME="$(awk -F'=' '/JAVA_HOME=/{print $2}' /usr/bin/unity-editor.d/*)"
|
||||||
|
"$(awk -F'=' '/ANDROID_HOME=/{print $2}' /usr/bin/unity-editor.d/*)/tools/bin/sdkmanager" "$ANDROID_SDK_MANAGER_PARAMETERS"
|
||||||
|
echo "Updated Android SDK."
|
||||||
|
else
|
||||||
|
echo "Not updating Android SDK."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -130,6 +140,7 @@ unity-editor \
|
||||||
-androidKeystorePass "$ANDROID_KEYSTORE_PASS" \
|
-androidKeystorePass "$ANDROID_KEYSTORE_PASS" \
|
||||||
-androidKeyaliasName "$ANDROID_KEYALIAS_NAME" \
|
-androidKeyaliasName "$ANDROID_KEYALIAS_NAME" \
|
||||||
-androidKeyaliasPass "$ANDROID_KEYALIAS_PASS" \
|
-androidKeyaliasPass "$ANDROID_KEYALIAS_PASS" \
|
||||||
|
-androidTargetSdkVersion "$ANDROID_TARGET_SDK_VERSION" \
|
||||||
$CUSTOM_PARAMETERS
|
$CUSTOM_PARAMETERS
|
||||||
|
|
||||||
# Catch exit code
|
# Catch exit code
|
||||||
|
|
|
@ -28,4 +28,14 @@ describe('Android Versioning', () => {
|
||||||
expect(AndroidVersioning.determineVersionCode('1.2.3', 2)).toBe(2);
|
expect(AndroidVersioning.determineVersionCode('1.2.3', 2)).toBe(2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('determineSdkManagerParameters', () => {
|
||||||
|
it('defaults to blank', () => {
|
||||||
|
expect(AndroidVersioning.determineSdkManagerParameters('AndroidApiLevelAuto')).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('uses the specified api level', () => {
|
||||||
|
expect(AndroidVersioning.determineSdkManagerParameters('AndroidApiLevel30')).toBe('platforms;android-30');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -34,4 +34,9 @@ export default class AndroidVersioning {
|
||||||
core.info(`Using android versionCode ${versionCode}`);
|
core.info(`Using android versionCode ${versionCode}`);
|
||||||
return versionCode;
|
return versionCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static determineSdkManagerParameters(targetSdkVersion) {
|
||||||
|
const parsedVersion = Number.parseInt(targetSdkVersion.slice(-2), 10);
|
||||||
|
return Number.isNaN(parsedVersion) ? '' : `platforms;android-${parsedVersion}`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import Versioning from './versioning';
|
import Versioning from './versioning';
|
||||||
import UnityVersioning from './unity-versioning';
|
import UnityVersioning from './unity-versioning';
|
||||||
|
import AndroidVersioning from './android-versioning';
|
||||||
import BuildParameters from './build-parameters';
|
import BuildParameters from './build-parameters';
|
||||||
import Input from './input';
|
import Input from './input';
|
||||||
import Platform from './platform';
|
import Platform from './platform';
|
||||||
|
@ -10,6 +11,10 @@ const determineUnityVersion = jest
|
||||||
.spyOn(UnityVersioning, 'determineUnityVersion')
|
.spyOn(UnityVersioning, 'determineUnityVersion')
|
||||||
.mockImplementation(() => '2019.2.11f1');
|
.mockImplementation(() => '2019.2.11f1');
|
||||||
|
|
||||||
|
const determineSdkManagerParameters = jest
|
||||||
|
.spyOn(AndroidVersioning, 'determineSdkManagerParameters')
|
||||||
|
.mockImplementation(() => 'platforms;android-30');
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
});
|
});
|
||||||
|
@ -44,6 +49,11 @@ describe('BuildParameters', () => {
|
||||||
await expect(BuildParameters.create()).resolves.toEqual(expect.objectContaining({ androidVersionCode: 1003037 }));
|
await expect(BuildParameters.create()).resolves.toEqual(expect.objectContaining({ androidVersionCode: 1003037 }));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('determines the android sdk manager parameters only once', async () => {
|
||||||
|
await BuildParameters.create();
|
||||||
|
expect(determineSdkManagerParameters).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns the platform', async () => {
|
it('returns the platform', async () => {
|
||||||
const mockValue = 'somePlatform';
|
const mockValue = 'somePlatform';
|
||||||
jest.spyOn(Input, 'targetPlatform', 'get').mockReturnValue(mockValue);
|
jest.spyOn(Input, 'targetPlatform', 'get').mockReturnValue(mockValue);
|
||||||
|
@ -154,6 +164,14 @@ describe('BuildParameters', () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns the android target sdk version', async () => {
|
||||||
|
const mockValue = 'AndroidApiLevelAuto';
|
||||||
|
jest.spyOn(Input, 'androidTargetSdkVersion', 'get').mockReturnValue(mockValue);
|
||||||
|
await expect(BuildParameters.create()).resolves.toEqual(
|
||||||
|
expect.objectContaining({ androidTargetSdkVersion: mockValue }),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns the custom parameters', async () => {
|
it('returns the custom parameters', async () => {
|
||||||
const mockValue = '-profile SomeProfile -someBoolean -someValue exampleValue';
|
const mockValue = '-profile SomeProfile -someBoolean -someValue exampleValue';
|
||||||
jest.spyOn(Input, 'customParameters', 'get').mockReturnValue(mockValue);
|
jest.spyOn(Input, 'customParameters', 'get').mockReturnValue(mockValue);
|
||||||
|
|
|
@ -21,6 +21,8 @@ class BuildParameters {
|
||||||
public androidKeystorePass!: string;
|
public androidKeystorePass!: string;
|
||||||
public androidKeyaliasName!: string;
|
public androidKeyaliasName!: string;
|
||||||
public androidKeyaliasPass!: string;
|
public androidKeyaliasPass!: string;
|
||||||
|
public androidTargetSdkVersion!: string;
|
||||||
|
public androidSdkManagerParameters!: string;
|
||||||
public customParameters!: string;
|
public customParameters!: string;
|
||||||
public sshAgent!: string;
|
public sshAgent!: string;
|
||||||
public gitPrivateToken!: string;
|
public gitPrivateToken!: string;
|
||||||
|
@ -43,6 +45,8 @@ class BuildParameters {
|
||||||
|
|
||||||
const androidVersionCode = AndroidVersioning.determineVersionCode(buildVersion, Input.androidVersionCode);
|
const androidVersionCode = AndroidVersioning.determineVersionCode(buildVersion, Input.androidVersionCode);
|
||||||
|
|
||||||
|
const androidSdkManagerParameters = AndroidVersioning.determineSdkManagerParameters(Input.androidTargetSdkVersion);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
version: unityVersion,
|
version: unityVersion,
|
||||||
customImage: Input.customImage,
|
customImage: Input.customImage,
|
||||||
|
@ -61,6 +65,8 @@ class BuildParameters {
|
||||||
androidKeystorePass: Input.androidKeystorePass,
|
androidKeystorePass: Input.androidKeystorePass,
|
||||||
androidKeyaliasName: Input.androidKeyaliasName,
|
androidKeyaliasName: Input.androidKeyaliasName,
|
||||||
androidKeyaliasPass: Input.androidKeyaliasPass,
|
androidKeyaliasPass: Input.androidKeyaliasPass,
|
||||||
|
androidTargetSdkVersion: Input.androidTargetSdkVersion,
|
||||||
|
androidSdkManagerParameters,
|
||||||
customParameters: Input.customParameters,
|
customParameters: Input.customParameters,
|
||||||
sshAgent: Input.sshAgent,
|
sshAgent: Input.sshAgent,
|
||||||
gitPrivateToken: Input.gitPrivateToken,
|
gitPrivateToken: Input.gitPrivateToken,
|
||||||
|
|
|
@ -35,6 +35,8 @@ class Docker {
|
||||||
androidKeystorePass,
|
androidKeystorePass,
|
||||||
androidKeyaliasName,
|
androidKeyaliasName,
|
||||||
androidKeyaliasPass,
|
androidKeyaliasPass,
|
||||||
|
androidTargetSdkVersion,
|
||||||
|
androidSdkManagerParameters,
|
||||||
customParameters,
|
customParameters,
|
||||||
sshAgent,
|
sshAgent,
|
||||||
gitPrivateToken,
|
gitPrivateToken,
|
||||||
|
@ -64,6 +66,8 @@ class Docker {
|
||||||
--env ANDROID_KEYSTORE_PASS="${androidKeystorePass}" \
|
--env ANDROID_KEYSTORE_PASS="${androidKeystorePass}" \
|
||||||
--env ANDROID_KEYALIAS_NAME="${androidKeyaliasName}" \
|
--env ANDROID_KEYALIAS_NAME="${androidKeyaliasName}" \
|
||||||
--env ANDROID_KEYALIAS_PASS="${androidKeyaliasPass}" \
|
--env ANDROID_KEYALIAS_PASS="${androidKeyaliasPass}" \
|
||||||
|
--env ANDROID_TARGET_SDK_VERSION="${androidTargetSdkVersion}" \
|
||||||
|
--env ANDROID_SDK_MANAGER_PARAMETERS="${androidSdkManagerParameters}" \
|
||||||
--env CUSTOM_PARAMETERS="${customParameters}" \
|
--env CUSTOM_PARAMETERS="${customParameters}" \
|
||||||
--env CHOWN_FILES_TO="${chownFilesTo}" \
|
--env CHOWN_FILES_TO="${chownFilesTo}" \
|
||||||
--env GITHUB_REF \
|
--env GITHUB_REF \
|
||||||
|
|
|
@ -226,6 +226,19 @@ describe('Input', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('androidTargetSdkVersion', () => {
|
||||||
|
it('returns the default value', () => {
|
||||||
|
expect(Input.androidTargetSdkVersion).toStrictEqual('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('takes input from the users workflow', () => {
|
||||||
|
const mockValue = 'secret';
|
||||||
|
const spy = jest.spyOn(core, 'getInput').mockReturnValue(mockValue);
|
||||||
|
expect(Input.androidTargetSdkVersion).toStrictEqual(mockValue);
|
||||||
|
expect(spy).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('allowDirtyBuild', () => {
|
describe('allowDirtyBuild', () => {
|
||||||
it('returns the default value', () => {
|
it('returns the default value', () => {
|
||||||
expect(Input.allowDirtyBuild).toStrictEqual(false);
|
expect(Input.allowDirtyBuild).toStrictEqual(false);
|
||||||
|
|
|
@ -75,6 +75,10 @@ class Input {
|
||||||
return core.getInput('androidKeyaliasPass') || '';
|
return core.getInput('androidKeyaliasPass') || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static get androidTargetSdkVersion() {
|
||||||
|
return core.getInput('androidTargetSdkVersion') || '';
|
||||||
|
}
|
||||||
|
|
||||||
static get allowDirtyBuild() {
|
static get allowDirtyBuild() {
|
||||||
const input = core.getInput('allowDirtyBuild') || false;
|
const input = core.getInput('allowDirtyBuild') || false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue