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>
This commit is contained in:
David Finol 2021-11-24 06:51:52 -06:00 committed by GitHub
parent 11a0d0947e
commit 239273ca72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 83 additions and 5 deletions

View File

@ -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: ''

View File

@ -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);
} }
} }
} }

BIN
dist/index.js generated vendored

Binary file not shown.

BIN
dist/index.js.map generated vendored

Binary file not shown.

19
dist/steps/build.sh vendored
View File

@ -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

View File

@ -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');
});
});
}); });

View File

@ -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}`;
}
} }

View File

@ -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);

View File

@ -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,

View File

@ -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 \

View File

@ -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);

View File

@ -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;