From 88c6747f5735c97fc52eb6a0292e5c85babc0c75 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Mon, 14 Mar 2022 18:40:28 -0700 Subject: [PATCH 01/11] build scripts --- .github/workflows/ci.yml | 129 ++++++++++++++++++++++++++++++ .github/workflows/license.yml | 20 +++++ Assets/Editor/TestBuilder.cs | 109 +++++++++++++++++++++++++ Assets/Editor/TestBuilder.cs.meta | 11 +++ 4 files changed, 269 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/license.yml create mode 100644 Assets/Editor/TestBuilder.cs create mode 100644 Assets/Editor/TestBuilder.cs.meta diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..094fb70 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,129 @@ +# CI for pull requests +# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle?learn=continuous_integration&learnProduct=actions +# Using gradle-build-action. See https://github.com/gradle/gradle-build-action + +name: CI + +on: [pull_request,workflow_dispatch] + +# push: +# branches: +# - 'build' +# #- 'releases/**' +# #- '!releases/**-alpha' + +jobs: + build: + runs-on: ubuntu-latest + env: + LICENSE: ${{ secrets.LICENSE }} #unity 2019 license + LICENSE2: ${{ secrets.LICENSE2 }} + LICENSE2020: ${{ secrets.LICENSE_2020 }} + LICENSE2021: ${{ secrets.LICENSE_2021 }} + strategy: + matrix: + unity-version-matrix: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1 ] + + steps: + - name: Checkout Passthrough Example + uses: actions/checkout@v2 + with: + submodules: 'true' +#not great, but let's also set up java so we can run sdkmanager. probably a way to avoid this. + #https://github.com/marketplace/actions/setup-unity + - name: Setup Unity + uses: kuler90/setup-unity@v1 + with: + unity-version: ${{ matrix.unity-version-matrix }} + unity-modules: android + install-path: /opt/Unity + - name: list all files in current dir + run: | + find . + - name: environment tests + run: | + echo $UNITY_PATH + find $UNITY_PATH + echo $ANDROID_HOME + echo $ANDROID_NDK_HOME + echo $NDK_HOME + echo $JAVA_HOME + echo ${{ matrix.unity-version-matrix }} + +# https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a + - name: accept licenses if not already done + continue-on-error: true + run: | + echo "y" | /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Data/PlaybackEngines/AndroidPlayer/SDK/tools/bin/sdkmanager --sdk_root="/opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Data/PlaybackEngines/AndroidPlayer/SDK" --licenses + - name: list all files in unity install dir + run: | + find /opt/Unity/ + - name: write out license file 2019 + if: ${{ contains(matrix.unity-version-matrix,'2019') }} + run: | + echo -n -e "$LICENSE" > license.alf + echo inside a multi-line script: $LICENSE + wc -m license.alf + ls -al *alf + - name: write out license file 2020 + if: ${{ contains(matrix.unity-version-matrix,'2020') }} + run: | + echo -n -e "$LICENSE2020" > license.alf + echo inside a multi-line script: $LICENSE2020 + wc -m license.alf + ls -al *alf + - name: write out license file 2021 + if: ${{ contains(matrix.unity-version-matrix,'2021') }} + run: | + echo -n -e "$LICENSE2021" > license.alf + echo inside a multi-line script: $LICENSE2021 + wc -m license.alf + ls -al *alf + - name: alternate secret test + run: | + echo -n -e "$LICENSE2" > license2.alf + echo inside a multi-line script: $LICENSE2 + wc -m license2.alf + ls -al *alf + #- run: + # name: accept licenses + # command: | + # echo "y" | ${ANDROID_HOME}/tools/bin/sdkmanager --licenses + #https://docs.unity3d.com/Manual/EditorCommandLineArguments.html + - name: manual license activation + run: | + /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -manualLicenseFile license.alf || exit 0 + - name: unity android build + run: | + /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -executeMethod TestBuilder.Build || exit 0 +# - name: Build Unity +# uses: kuler90/build-unity@v1 +# continue-on-error: true +# with: +# build-target: Android +# build-method: TestBuilder.Build + +#return license failed - "activated manually for this computer and can't be returned" https://github.com/hardcoded2/WavePassthroughOverlayExample/runs/5540616684?check_suite_focus=true#step:9:79 +#feels wrong not to do it... just ignore the error code i guess? + + - name: return license + continue-on-error: true + run: | + /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -logFile -noGraphics -returnlicense || exit 0 + + - name: list all files in build dir + run: | + find Builds/ + - name: Archive production artifacts + uses: actions/upload-artifact@v3 + with: + name: build${{ matrix.unity-version-matrix}}_${{github.run_id}}_${{github.run_number}}_${{github.run_attempt}} + retention-days: 30 + path: | + Builds/*.apk + +# - name: 'Upload Artifact' +# uses: actions/upload-artifact@v2 +# with: +# name: build${{ github.run_number }} +# path: Builds/*apk \ No newline at end of file diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml new file mode 100644 index 0000000..edb1a73 --- /dev/null +++ b/.github/workflows/license.yml @@ -0,0 +1,20 @@ +name: License + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + unity-version: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1 ] + + steps: + - uses: pCYSl5EDgo/setup-unity@master + with: + unity-version: ${{ matrix.unity-version }} + has-android: True + has-il2cpp: True + - run: /opt/Unity/Editor/Unity -quit -batchMode -logFile -noGraphics -createManualActivationFile || exit 0 + - run: cat Unity_v${{ matrix.unity-version }}.alf \ No newline at end of file diff --git a/Assets/Editor/TestBuilder.cs b/Assets/Editor/TestBuilder.cs new file mode 100644 index 0000000..54aa0f2 --- /dev/null +++ b/Assets/Editor/TestBuilder.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; +using Random = UnityEngine.Random; + +public class TestBuilder + { + [MenuItem("TestBuilder/TestBuild")] + public static void Build() + { + Debug.Log("Start build"); + var buildNumberFaked = Convert.ToInt32(Random.Range(1f, 1000f)); + try + { + //other axes potentially - unity version, scripting backend, .net api compatibility, rendering pipeline, old/new input, xr input(xri with xr rig and xr origin), other packages, C++ compiler config, release/debug, tbd + var buildConfig = new BuildConfig() + { + BuildOptions = BuildOptions.Development, // | BuildOptions.AutoRunPlayer, + BuildTargetGroup = BuildTargetGroup.Android, + Scenes = BuildConfig.ScenesInApp(), + BundleVersionCode = buildNumberFaked, // PlayerSettings.Android.bundleVersionCode, + AppName = "EscapeRoom "+buildNumberFaked+Application.unityVersion, + BundleIdentifier = "com.defaultCompany.escaperoom" +buildNumberFaked+ Application.unityVersion.Replace(".","_"), + }; + + Builder.BuildAndroid(buildConfig); + + } + catch (Exception e) + { + Debug.LogError("Error during build"); + Debug.LogException(e); + } + Debug.Log("End build"); + EditorApplication.Exit(0); + } + + public class BuildConfig + { + public BuildOptions BuildOptions = BuildOptions.None; + public BuildTargetGroup BuildTargetGroup = BuildTargetGroup.Android; + public string AppName = $"VRTestApp{EscapedUnityVersion()}"; + public string[] Scenes; + public string BundleIdentifier; + public int BundleVersionCode; + + private static string EscapedUnityVersion() + { + return Application.unityVersion.Replace(".", "_"); + } + + public static string[] ScenesInApp() + { + if (Application.levelCount == 0) + { + throw new InvalidOperationException("No levels set in player settings"); + } + List scenes = new List(); + foreach(var scene in EditorBuildSettings.scenes) + { + if(scene.enabled) + scenes.Add(scene.path); + } + + return scenes.ToArray(); + } + public bool IsValid() + { + return BuildTargetGroup != BuildTargetGroup.Unknown && + !string.IsNullOrEmpty(AppName) && + !string.IsNullOrEmpty(BundleIdentifier) && + Scenes != null && Scenes.Count((s => !string.IsNullOrEmpty(s))) >= 1; //at least one valid scene + } + } + public class Builder + { + private static string SafeWindowsFileName(string input) + { + char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); + + // Builds a string out of valid chars + var validFilename = new string(input.Where(ch => !invalidFileNameChars.Contains(ch)).ToArray()); + return validFilename; + } + public static void BuildAndroid(BuildConfig Config) + { + if (Config == null || !Config.IsValid()) + { + throw new ArgumentException("Invalid build config"); + } + PlayerSettings.SetApplicationIdentifier(Config.BuildTargetGroup,Config.BundleIdentifier); + PlayerSettings.productName = Config.AppName; + //Application.productName = AppName; + PlayerSettings.Android.bundleVersionCode = Config.BundleVersionCode; + + var apkName = $"{SafeWindowsFileName(Config.BundleIdentifier.Replace(".", "_"))}.apk"; + const string buildDirName = "Builds"; + if (!Directory.Exists(buildDirName)) + Directory.CreateDirectory(buildDirName); + BuildPipeline.BuildPlayer(new BuildPlayerOptions() + { + target = BuildTarget.Android, scenes = Config.Scenes, locationPathName = $"{buildDirName}/{apkName}",options = Config.BuildOptions + }); + } + } + } diff --git a/Assets/Editor/TestBuilder.cs.meta b/Assets/Editor/TestBuilder.cs.meta new file mode 100644 index 0000000..3f68f53 --- /dev/null +++ b/Assets/Editor/TestBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb711ec0b58905d48bbcaf83cd584b50 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From b79b5cf3de5a8bd1cd44a3fb74825fd7d92c89d0 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Mon, 14 Mar 2022 18:57:44 -0700 Subject: [PATCH 02/11] add readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c5b89f --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +Show how to port an existing example project to the vive platforms if it uses the interaction toolkit. + +[![CI](https://github.com/hardcoded2/EscapeRoom/actions/workflows/ci.yml/badge.svg)](https://github.com/hardcoded2/EscapeRoom/actions/workflows/ci.yml) From 6be09e6511c7de13cde6c713bf8c63828996282f Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Mon, 14 Mar 2022 19:59:41 -0700 Subject: [PATCH 03/11] meta file --- Assets/Editor.meta | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Assets/Editor.meta diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..4a23b12 --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0553004b836b76e4e921d9d677a95b0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From dc90b0b47167dd934af9b2a451b03d8a1611c8de Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Wed, 16 Mar 2022 14:28:14 -0700 Subject: [PATCH 04/11] remove asset that throws an error - i might have mangled it? --- .../Scenes/Final/EscapeRoom/LightingData.asset | Bin 52303 -> 0 bytes .../Final/EscapeRoom/LightingData.asset.meta | 8 -------- 2 files changed, 8 deletions(-) delete mode 100644 Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset delete mode 100644 Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset.meta diff --git a/Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset b/Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset deleted file mode 100644 index 5969460f726a8c71f497b5c9e1ff03ce4a1bf90d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52303 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 O_lgBGGZ(M diff --git a/Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset.meta b/Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset.meta deleted file mode 100644 index 4597047..0000000 --- a/Assets/VR Beginner/Scenes/Final/EscapeRoom/LightingData.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5f76105c17a78f948ae2b622ae8e3d1f -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: From 6e05119c8de88f093fecf603b0c13f0c22a3e5db Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Wed, 16 Mar 2022 16:06:46 -0700 Subject: [PATCH 05/11] try a second pass at building since maybe import errors fail the build --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 094fb70..9fd0a53 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,6 +96,9 @@ jobs: - name: unity android build run: | /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -executeMethod TestBuilder.Build || exit 0 + - name: unity android try again for lulz, although i think it's an encoding thing with oggs maybe + run: | + /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -executeMethod TestBuilder.Build || exit 0 # - name: Build Unity # uses: kuler90/build-unity@v1 # continue-on-error: true From bdaecc8741f9124723dcd46da67fe6aa68d23ec3 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Wed, 16 Mar 2022 16:08:44 -0700 Subject: [PATCH 06/11] use known-good version of unity --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9fd0a53..a048969 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: LICENSE2021: ${{ secrets.LICENSE_2021 }} strategy: matrix: - unity-version-matrix: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1 ] + unity-version-matrix: [ 2020.3.18f1 ] #2019.4.36f1,2020.3.30f1, 2021.2.14f1 #currently only tested this project with 2020.3.18f1 steps: - name: Checkout Passthrough Example From 123bab5574f770bf4bb1ea8fee8991a3ab9a8536 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Wed, 16 Mar 2022 16:09:28 -0700 Subject: [PATCH 07/11] use other builder too --- .github/workflows/ci.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a048969..76d9466 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,12 +99,13 @@ jobs: - name: unity android try again for lulz, although i think it's an encoding thing with oggs maybe run: | /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -executeMethod TestBuilder.Build || exit 0 -# - name: Build Unity -# uses: kuler90/build-unity@v1 -# continue-on-error: true -# with: -# build-target: Android -# build-method: TestBuilder.Build + + - name: Build Unity through other builder + uses: kuler90/build-unity@v1 + continue-on-error: true + with: + build-target: Android + build-method: TestBuilder.Build #return license failed - "activated manually for this computer and can't be returned" https://github.com/hardcoded2/WavePassthroughOverlayExample/runs/5540616684?check_suite_focus=true#step:9:79 #feels wrong not to do it... just ignore the error code i guess? From 58d67284564a76b7422c1e051a1642cd865ca017 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Mon, 4 Apr 2022 16:58:52 -0700 Subject: [PATCH 08/11] fix var names for 2019 and 2022 --- .github/workflows/ci.yml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76d9466..505cea6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,16 +16,16 @@ jobs: build: runs-on: ubuntu-latest env: - LICENSE: ${{ secrets.LICENSE }} #unity 2019 license - LICENSE2: ${{ secrets.LICENSE2 }} + LICENSE2019: ${{ secrets.LICENSE_2019 }} #unity 2019 license from .ulf file created through manual activation https://docs.unity3d.com/Manual/ManualActivationGuide.html LICENSE2020: ${{ secrets.LICENSE_2020 }} LICENSE2021: ${{ secrets.LICENSE_2021 }} + LICENSE2022: ${{ secrets.LICENSE_2022 }} strategy: matrix: - unity-version-matrix: [ 2020.3.18f1 ] #2019.4.36f1,2020.3.30f1, 2021.2.14f1 #currently only tested this project with 2020.3.18f1 + unity-version-matrix: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1, 2022.1.0b14 ] steps: - - name: Checkout Passthrough Example + - name: Checkout Code uses: actions/checkout@v2 with: submodules: 'true' @@ -61,8 +61,8 @@ jobs: - name: write out license file 2019 if: ${{ contains(matrix.unity-version-matrix,'2019') }} run: | - echo -n -e "$LICENSE" > license.alf - echo inside a multi-line script: $LICENSE + echo -n -e "$LICENSE2019" > license.alf + echo inside a multi-line script: $LICENSE2019 wc -m license.alf ls -al *alf - name: write out license file 2020 @@ -79,11 +79,12 @@ jobs: echo inside a multi-line script: $LICENSE2021 wc -m license.alf ls -al *alf - - name: alternate secret test + - name: write out license file 2022 + if: ${{ contains(matrix.unity-version-matrix,'2022') }} run: | - echo -n -e "$LICENSE2" > license2.alf - echo inside a multi-line script: $LICENSE2 - wc -m license2.alf + echo -n -e "$LICENSE2022" > license.alf + echo inside a multi-line script: $LICENSE2022 + wc -m license.alf ls -al *alf #- run: # name: accept licenses From 894f7c3be34ac99c1f8788212c4614ef03393636 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Mon, 4 Apr 2022 17:10:43 -0700 Subject: [PATCH 09/11] list all finles after running but before only in build dir --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 505cea6..9f3b5ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -115,7 +115,9 @@ jobs: continue-on-error: true run: | /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -logFile -noGraphics -returnlicense || exit 0 - + - name: list all files + run: | + find . - name: list all files in build dir run: | find Builds/ From 8be9c7405facedae9101ac0d71f327f9a331690d Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Wed, 6 Apr 2022 12:28:14 -0700 Subject: [PATCH 10/11] update build scripts --- .github/workflows/ci.yml | 67 ++++++++++------------------------- .github/workflows/license.yml | 2 +- 2 files changed, 20 insertions(+), 49 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f3b5ed..b597b92 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,13 +16,10 @@ jobs: build: runs-on: ubuntu-latest env: - LICENSE2019: ${{ secrets.LICENSE_2019 }} #unity 2019 license from .ulf file created through manual activation https://docs.unity3d.com/Manual/ManualActivationGuide.html - LICENSE2020: ${{ secrets.LICENSE_2020 }} - LICENSE2021: ${{ secrets.LICENSE_2021 }} - LICENSE2022: ${{ secrets.LICENSE_2022 }} + UPM_PACKAGE_CREDENTIAL_UPMCONFIG_TOML: ${{ secrets.UPM_PACKAGE_CREDENTIAL_UPMCONFIG_TOML }} strategy: matrix: - unity-version-matrix: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1, 2022.1.0b14 ] + unity-version-matrix: [ 2020.3.30f1, 2021.2.14f1, 2022.1.0b14 ] #2019.4.36f1, steps: - name: Checkout Code @@ -31,12 +28,20 @@ jobs: submodules: 'true' #not great, but let's also set up java so we can run sdkmanager. probably a way to avoid this. #https://github.com/marketplace/actions/setup-unity + #possible modules on linux - android,ios,webgl,linux-il2cpp,mac-mono,windows-mono - name: Setup Unity uses: kuler90/setup-unity@v1 with: unity-version: ${{ matrix.unity-version-matrix }} unity-modules: android install-path: /opt/Unity +#need 2fa to not error out I think + - name: Activate Unity + continue-on-error: true + uses: kuler90/activate-unity@v1 + with: + unity-username: ${{ secrets.UNITY_USERNAME }} + unity-password: ${{ secrets.UNITY_PASSWORD }} - name: list all files in current dir run: | find . @@ -49,6 +54,7 @@ jobs: echo $NDK_HOME echo $JAVA_HOME echo ${{ matrix.unity-version-matrix }} + echo env UNITY_PATH: ${{ env.UNITY_PATH }} # https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a - name: accept licenses if not already done @@ -58,63 +64,28 @@ jobs: - name: list all files in unity install dir run: | find /opt/Unity/ - - name: write out license file 2019 - if: ${{ contains(matrix.unity-version-matrix,'2019') }} - run: | - echo -n -e "$LICENSE2019" > license.alf - echo inside a multi-line script: $LICENSE2019 - wc -m license.alf - ls -al *alf - - name: write out license file 2020 - if: ${{ contains(matrix.unity-version-matrix,'2020') }} - run: | - echo -n -e "$LICENSE2020" > license.alf - echo inside a multi-line script: $LICENSE2020 - wc -m license.alf - ls -al *alf - - name: write out license file 2021 - if: ${{ contains(matrix.unity-version-matrix,'2021') }} - run: | - echo -n -e "$LICENSE2021" > license.alf - echo inside a multi-line script: $LICENSE2021 - wc -m license.alf - ls -al *alf - - name: write out license file 2022 - if: ${{ contains(matrix.unity-version-matrix,'2022') }} - run: | - echo -n -e "$LICENSE2022" > license.alf - echo inside a multi-line script: $LICENSE2022 - wc -m license.alf - ls -al *alf #- run: # name: accept licenses # command: | # echo "y" | ${ANDROID_HOME}/tools/bin/sdkmanager --licenses #https://docs.unity3d.com/Manual/EditorCommandLineArguments.html - - name: manual license activation - run: | - /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -manualLicenseFile license.alf || exit 0 - - name: unity android build - run: | - /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -executeMethod TestBuilder.Build || exit 0 - - name: unity android try again for lulz, although i think it's an encoding thing with oggs maybe - run: | - /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -buildTarget Android -logFile -noGraphics -executeMethod TestBuilder.Build || exit 0 - - - name: Build Unity through other builder + + - name: Build Unity uses: kuler90/build-unity@v1 continue-on-error: true with: build-target: Android build-method: TestBuilder.Build + project-path: ${{ github.workspace }} #return license failed - "activated manually for this computer and can't be returned" https://github.com/hardcoded2/WavePassthroughOverlayExample/runs/5540616684?check_suite_focus=true#step:9:79 #feels wrong not to do it... just ignore the error code i guess? - - name: return license - continue-on-error: true - run: | - /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -logFile -noGraphics -returnlicense || exit 0 +#not sure if needed with kuler90 plugin +# - name: return license +# continue-on-error: true +# run: | +# /opt/Unity/${{ matrix.unity-version-matrix }}/Editor/Unity -quit -batchMode -logFile -noGraphics -returnlicense || exit 0 - name: list all files run: | find . diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index edb1a73..9235f1d 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - unity-version: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1 ] + unity-version: [ 2019.4.36f1,2020.3.30f1, 2021.2.14f1, 2022.1.0b14 ] steps: - uses: pCYSl5EDgo/setup-unity@master From 0a7ce27ae751b695d5c18508c2e6edfe63a34b62 Mon Sep 17 00:00:00 2001 From: Alex Sink Date: Thu, 7 Apr 2022 13:55:31 -0700 Subject: [PATCH 11/11] don't build 2022 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b597b92..c66f617 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: UPM_PACKAGE_CREDENTIAL_UPMCONFIG_TOML: ${{ secrets.UPM_PACKAGE_CREDENTIAL_UPMCONFIG_TOML }} strategy: matrix: - unity-version-matrix: [ 2020.3.30f1, 2021.2.14f1, 2022.1.0b14 ] #2019.4.36f1, + unity-version-matrix: [ 2019.4.36f1, 2020.3.30f1, 2021.2.14f1 ] #, 2022.1.0b14 steps: - name: Checkout Code