From 239273ca72686f9c6c6d4e981f64c4fc1b6a5f90 Mon Sep 17 00:00:00 2001 From: David Finol Date: Wed, 24 Nov 2021 06:51:52 -0600 Subject: [PATCH] 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 * 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 --- action.yml | 4 ++++ .../Input/AndroidSettings.cs | 5 ++++- dist/index.js | Bin 14729912 -> 14730750 bytes dist/index.js.map | Bin 8949826 -> 8950752 bytes dist/steps/build.sh | 19 ++++++++++++++---- src/model/android-versioning.test.ts | 10 +++++++++ src/model/android-versioning.ts | 5 +++++ src/model/build-parameters.test.ts | 18 +++++++++++++++++ src/model/build-parameters.ts | 6 ++++++ src/model/docker.ts | 4 ++++ src/model/input.test.ts | 13 ++++++++++++ src/model/input.ts | 4 ++++ 12 files changed, 83 insertions(+), 5 deletions(-) diff --git a/action.yml b/action.yml index 2f5777cb..6d778ac2 100644 --- a/action.yml +++ b/action.yml @@ -98,6 +98,10 @@ inputs: required: false default: '' description: 'The android keyaliasPass' + androidTargetSdkVersion: + required: false + default: '' + description: 'The android target API level.' customParameters: required: false default: '' diff --git a/dist/default-build-script/Assets/Editor/UnityBuilderAction/Input/AndroidSettings.cs b/dist/default-build-script/Assets/Editor/UnityBuilderAction/Input/AndroidSettings.cs index ffa025ee..c8daaecb 100644 --- a/dist/default-build-script/Assets/Editor/UnityBuilderAction/Input/AndroidSettings.cs +++ b/dist/default-build-script/Assets/Editor/UnityBuilderAction/Input/AndroidSettings.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using UnityEditor; namespace UnityBuilderAction.Input @@ -16,6 +17,8 @@ namespace UnityBuilderAction.Input PlayerSettings.Android.keyaliasName = keyaliasName; if (options.TryGetValue("androidKeyaliasPass", out string keyaliasPass) && !string.IsNullOrEmpty(keyaliasPass)) PlayerSettings.Android.keyaliasPass = keyaliasPass; + if (options.TryGetValue("androidTargetSdkVersion", out string androidTargetSdkVersion) && !string.IsNullOrEmpty(androidTargetSdkVersion)) + PlayerSettings.Android.targetSdkVersion = (AndroidSdkVersions) Enum.Parse(typeof(AndroidSdkVersions), androidTargetSdkVersion); } } } diff --git a/dist/index.js b/dist/index.js index 05579577f1bc829ae0f63789a18d8fc66e0c327d..0e93c1353ebb9c08e4ca81b08d7be956ec5f0a15 100644 GIT binary patch delta 1495 zcmZ|M_fu0@6u|MpLQ_OV1r+qDM3NN{yMhQoBBGmsA&Y(CNuC&iB)kM0Hbli<_O3?P zZLVcmD;j%Qd+)uMzr%6VFA6AwzM0Pt@7#0F+;i^H#T9<GPFZy+ z8FqK0nmAXHEnm^b_R+;iz2kL>L4i{3rz-AJ)n3=Y<}%49?WZ=@+U`0jS&EL95~Mt5 zk?fx0P>WrOvfZjWY$4XzsImsRbMwT$j4s~F$OwNSCHi*yoM-*kSRziNYyYhSttioi z23YEb79XNQJ7Ao1 zZ`b!bonoX$MfDHjeVb%%Chny8M_csfbb}=~J8e{Mj=`Lrk!ecm7FE`$rI3@uYw~;6 zBpUT5eY(M%o257FjRp&4U)6kBhbTzx>@}uN&;@_mw6%UJ&uHNjA+j97B7T}*V0}18 zluXrDR25cM75bnFnxYw+!xw(=M*srR0xc1QRtQFGv_V^hpdH$y140poaCAf`L?9BK z(FGE^q8qv+3L5l4G_=s+2lPY?ViAX4h(~YqL0|Mke+kN;Yh~_WMCvl;YS!@LME~>8fIj}f}fCsF&K++7>@~)aV-40~9e#npuUL-_@L(f0;Wuo?@Aw0M;xGJ-E%*mpu?^d?1OK85|6wO~VK??* zFZQ7t`*8qX9K<0U#t|IFF&xJUoWv>okJC7Vvp9$IxPXhegv+>stGI^ixPhCvh1@KEeH) znjCUvS#rqPX<=!Je~JcXg_jCVk2{(rBv3OlBPftmEvaxIDmpee5D^n!B{?%8B{Lxl zSqUPTY-A^dP;!uyT;wJXdC5n93Q&+j6s8D8DMoQhP?A!VCX8?*C_`DwQJxA^q!N)- zrV3T5Ms;dXlUmfK4t1$VeHze^Mnut=CN!lP&1pePqG?5I+R&C5+R>g4bfgoV=|We! z5lbB1=|N9=(VIT>r62tnz(C>|#9)Rnlwk~K1S1*6XvQ#>ag1jI6Pd*Sx5-RlD$|(G z3}!Nm+00=s^GIYq3s}e^7L&vhl3B_!mXpE?R;2R-wgdeN=payo|=g zmDjj1#*K-=1S4h=B@$V=G8z*%Zq$`4<5r@He;y&Iu=pi2bG~!uoICvBq4D#hhsO2+ zk!6*UVlhwNdSWnT)&@>js$sP$s8y?)+7gTfwWv9!YE8iyC9mv@h;;dCn@C#kI@{6^ z)CyZwEgE!&V^c!3gd*X>XmhABXfD`b$ybVtEV8CYB+J`x4T-x#QJ3m6k2MCo<6(@BCq86OuE-0KF*TuMxhlQ&LGJlQ&N4f)ECl&1H92Iqg1=&0X&B_-gGH zKCi=F>#TBFk7nnz&2X^%;ujeuqv1-M%U14i`>JhjTcyK8>(st!=cYGR-`^nmEpq6( zNSLzl>t}`x`R;~D{r?&}ZiqF#BR2&Mm<1zdBLRt+0~6+A9_C{K7Ge>Suoz3Q6v;?I zDwbh6(y#*QScz50KqeGqAsefagItWxl?O8{Sc`SYM*#}49z`g|25iJ8Y(@#TU@Nwv z6x*=_R_sI>cEN_-*aJHp*o$)PgA@Bvfdi<73stB_4cw@O2X*k`AP(U$j-Vb#aSX@d zgC8my(1-wnIDsadLK2aFD+SRD@ ob}vCz_jQ|kJ%e#vL>n&QGOpk%+R=e)=tLK~(W83?d%u791999w!2kdN delta 689 zcmXBOyHC?$6oBD;rKPO`qJTv%)+&gKtybiIDWX!P3aC}QREsV3#{J%(3Kpx>LDTUY zTnr0gFfq~ajS&6?5*7v>8dm5An{UhTBR-a{;lwvRia&NWGI(MMDx|IUwqfAs*w0~Hs*^9=#T+D49J8LCYW&m2a$zr zQIjcG@=R3Xn_l@xPmrZ#Wh?n7{V|{Fp4pZV*-;H!~e$ f$rTN6@ec1XgIRn)1atU^C_dpc=2dbfw!Quz2H`U9 diff --git a/dist/steps/build.sh b/dist/steps/build.sh index 4017157c..2e7e3909 100755 --- a/dist/steps/build.sh +++ b/dist/steps/build.sh @@ -63,14 +63,24 @@ else fi # -# Create Android keystore, if needed +# Prepare Android keystore and SDK, if needed # -if [[ -z $ANDROID_KEYSTORE_NAME || -z $ANDROID_KEYSTORE_BASE64 ]]; then - echo "Not creating Android keystore." -else +if [[ "$BUILD_TARGET" == "Android" && -n "$ANDROID_KEYSTORE_NAME" && -n "$ANDROID_KEYSTORE_BASE64" ]]; then + echo "Creating Android keystore." echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$UNITY_PROJECT_PATH/$ANDROID_KEYSTORE_NAME" 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 # @@ -130,6 +140,7 @@ unity-editor \ -androidKeystorePass "$ANDROID_KEYSTORE_PASS" \ -androidKeyaliasName "$ANDROID_KEYALIAS_NAME" \ -androidKeyaliasPass "$ANDROID_KEYALIAS_PASS" \ + -androidTargetSdkVersion "$ANDROID_TARGET_SDK_VERSION" \ $CUSTOM_PARAMETERS # Catch exit code diff --git a/src/model/android-versioning.test.ts b/src/model/android-versioning.test.ts index 1951549d..59d3b64a 100644 --- a/src/model/android-versioning.test.ts +++ b/src/model/android-versioning.test.ts @@ -28,4 +28,14 @@ describe('Android Versioning', () => { 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'); + }); + }); }); diff --git a/src/model/android-versioning.ts b/src/model/android-versioning.ts index e5fd464a..7b1c0c45 100644 --- a/src/model/android-versioning.ts +++ b/src/model/android-versioning.ts @@ -34,4 +34,9 @@ export default class AndroidVersioning { core.info(`Using android versionCode ${versionCode}`); return versionCode; } + + static determineSdkManagerParameters(targetSdkVersion) { + const parsedVersion = Number.parseInt(targetSdkVersion.slice(-2), 10); + return Number.isNaN(parsedVersion) ? '' : `platforms;android-${parsedVersion}`; + } } diff --git a/src/model/build-parameters.test.ts b/src/model/build-parameters.test.ts index 307bea8d..6413ce9b 100644 --- a/src/model/build-parameters.test.ts +++ b/src/model/build-parameters.test.ts @@ -1,5 +1,6 @@ import Versioning from './versioning'; import UnityVersioning from './unity-versioning'; +import AndroidVersioning from './android-versioning'; import BuildParameters from './build-parameters'; import Input from './input'; import Platform from './platform'; @@ -10,6 +11,10 @@ const determineUnityVersion = jest .spyOn(UnityVersioning, 'determineUnityVersion') .mockImplementation(() => '2019.2.11f1'); +const determineSdkManagerParameters = jest + .spyOn(AndroidVersioning, 'determineSdkManagerParameters') + .mockImplementation(() => 'platforms;android-30'); + afterEach(() => { jest.clearAllMocks(); }); @@ -44,6 +49,11 @@ describe('BuildParameters', () => { 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 () => { const mockValue = 'somePlatform'; 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 () => { const mockValue = '-profile SomeProfile -someBoolean -someValue exampleValue'; jest.spyOn(Input, 'customParameters', 'get').mockReturnValue(mockValue); diff --git a/src/model/build-parameters.ts b/src/model/build-parameters.ts index 3c1439e2..62352246 100644 --- a/src/model/build-parameters.ts +++ b/src/model/build-parameters.ts @@ -21,6 +21,8 @@ class BuildParameters { public androidKeystorePass!: string; public androidKeyaliasName!: string; public androidKeyaliasPass!: string; + public androidTargetSdkVersion!: string; + public androidSdkManagerParameters!: string; public customParameters!: string; public sshAgent!: string; public gitPrivateToken!: string; @@ -43,6 +45,8 @@ class BuildParameters { const androidVersionCode = AndroidVersioning.determineVersionCode(buildVersion, Input.androidVersionCode); + const androidSdkManagerParameters = AndroidVersioning.determineSdkManagerParameters(Input.androidTargetSdkVersion); + return { version: unityVersion, customImage: Input.customImage, @@ -61,6 +65,8 @@ class BuildParameters { androidKeystorePass: Input.androidKeystorePass, androidKeyaliasName: Input.androidKeyaliasName, androidKeyaliasPass: Input.androidKeyaliasPass, + androidTargetSdkVersion: Input.androidTargetSdkVersion, + androidSdkManagerParameters, customParameters: Input.customParameters, sshAgent: Input.sshAgent, gitPrivateToken: Input.gitPrivateToken, diff --git a/src/model/docker.ts b/src/model/docker.ts index 432286bf..29a8b9f0 100644 --- a/src/model/docker.ts +++ b/src/model/docker.ts @@ -35,6 +35,8 @@ class Docker { androidKeystorePass, androidKeyaliasName, androidKeyaliasPass, + androidTargetSdkVersion, + androidSdkManagerParameters, customParameters, sshAgent, gitPrivateToken, @@ -64,6 +66,8 @@ class Docker { --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 \ diff --git a/src/model/input.test.ts b/src/model/input.test.ts index 13b5318e..f2eb7467 100644 --- a/src/model/input.test.ts +++ b/src/model/input.test.ts @@ -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', () => { it('returns the default value', () => { expect(Input.allowDirtyBuild).toStrictEqual(false); diff --git a/src/model/input.ts b/src/model/input.ts index c7a06933..339318fa 100644 --- a/src/model/input.ts +++ b/src/model/input.ts @@ -75,6 +75,10 @@ class Input { return core.getInput('androidKeyaliasPass') || ''; } + static get androidTargetSdkVersion() { + return core.getInput('androidTargetSdkVersion') || ''; + } + static get allowDirtyBuild() { const input = core.getInput('allowDirtyBuild') || false;