UnityException: Error
mainTemplate.gradle file is using the old aaptOptions noCompress property definition which does not include types defined by unityStreamingAssets constant.
특정 버전 설치의 경우: brew install akamai@{version} e.g. brew install akamai@1.2.1
패키지 설치 후 커맨드도 별도로 설치가 필요하다
Usage:
akamai [global flags] command [command flags] [arguments...]
Commands:
config
install (alias: get)
list
search
uninstall
update
upgrade
help
Global Flags:
--edgerc value, -e value Location of the credentials file [$AKAMAI_EDGERC]
--section value, -s value Section of the credentials file [$AKAMAI_EDGERC_SECTION]
--accountkey value, --account-key value Account switch key [$AKAMAI_EDGERC_ACCOUNT_KEY]
--help show help (default: false)
--bash Output bash auto-complete (default: false)
--zsh Output zsh auto-complete (default: false)
--proxy value Set a proxy to use
--version Output CLI version (default: false)
Copyright (C) Akamai Technologies, Inc
젠킨스에서 Subversion 플러그인으로 체크아웃을 받는 도중 E175002 SVNException 에러가 발생하는 현상
ERROR: Failed to check out https://URL@REVISION
org.tmatesoft.svn.core.SVNException: svn: E175002: Connection reset
svn: E175002: REPORT request failed on '/svn/REPO/!svn/vcc/default'
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:112)
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:96)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:765)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:352)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:340)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:910)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.doReport(DAVConnection.java:363)
...중략...
Caused by: java.net.SocketException: Connection reset
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
...중략...
Caused: org.tmatesoft.svn.core.SVNException: svn: E175002: Connection reset
svn: E175002: REPORT request failed on '/svn/REPO/!svn/vcc/default'
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:112)
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:96)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:765)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:352)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:340)
...중략...
Caused: java.io.IOException: Failed to check out https://URL@REVISION
at hudson.scm.subversion.CheckoutUpdater$SubversionUpdateTask.perform(CheckoutUpdater.java:150)
at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:168)
at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:176)
at hudson.scm.subversion.UpdateUpdater$TaskImpl.perform(UpdateUpdater.java:191)
at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:168)
...중략...
Archiving artifacts
Finished: FAILURE
| 해결방법
1. /usr/local/opt/jenkins 혹은 /usr/local/Cellar/jenkins 폴더에서 homebrew.mxcl.jenkins.plist 파일 열기
(homebrew 설치 기준) 2. ProgramArguments에 위 사진과 같이 옵션 입력 3. 젠킨스 재시작
keystore 정보는 ProjectSettings.asset 파일에 아래와 같이 저장된다.
AndroidKeystoreName: '{inproject}: Keystore/name.keystore'
AndroidKeyaliasName: name
...중략...
androidUseCustomKeystore: 1
하지만 비밀번호와 같은 정보는 별도로 저장되다보니 체크아웃을 새로 받을 때마다, keystore 세팅을 다시 해줘야했다.
| 현상
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':launcher:packageRelease'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> com.android.ide.common.signing.KeytoolException: Failed to read key creature from store "/Users/${USER}/.jenkins/workspace/${PROJECT_NAME}/Keystore/user.keystore": Keystore was tampered with, or password was incorrect
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.1.1/userguide/command_line_interface.html#sec:command_line_warnings
ProjectSettings.asset 파일에는 androidUseCustomKeystore값은 1로 남아있는데,
alias나 비밀번호 같은 값이 날아가 버려서 위와 같은 에러가 발생한다.
| 해결
using UnityEditor;
using UnityEngine;
namespace Tools.Settings
{
[FilePath("UserSettings/BuildConfigs.asset", FilePathAttribute.Location.ProjectFolder)]
public class BuildConfigs : ScriptableSingleton<BuildConfigs>
{
public string __ks_pass;
public string __ks_key_alias;
public string __key_pass;
public string KeyStorePassword => Base64.Decode(__ks_pass);
public string KeyAlias => Base64.Decode(__ks_key_alias);
public string KeyPass => Base64.Decode(__key_pass);
public void Save()
{
Save(true);
}
}
sealed class BuildConfigsProvider : SettingsProvider
{
public const string Url = "{url}/manage/configure";
public BuildConfigsProvider()
: base("Preferences/Build Configs", SettingsScope.User)
{
}
public override void OnGUI(string search)
{
var settings = BuildConfigs.instance;
var __ks_pass = settings.KeyStorePassword;
var __ks_key_alias = settings.KeyAlias;
var __key_pass = settings.KeyPass;
EditorGUI.BeginChangeCheck();
__ks_pass = EditorGUILayout.PasswordField("--ks-pass", __ks_pass);
__ks_key_alias = EditorGUILayout.PasswordField("--ks-key-alias", __ks_key_alias);
__key_pass = EditorGUILayout.PasswordField("--key-pass", __key_pass);
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
if (GUILayout.Button("Overview"))
{
Application.OpenURL(Url);
}
GUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck())
{
settings.__ks_pass = Base64.Encode(__ks_pass);
settings.__ks_key_alias = Base64.Encode(__ks_key_alias);
settings.__key_pass = Base64.Encode(__key_pass);
settings.Save();
}
}
}
static class BuildConfigsRegister
{
[SettingsProvider]
public static SettingsProvider CreateCustomSettingsProvider()
=> new BuildConfigsProvider();
}
}
CI 툴에서 파라미터로 전달해도 되지만,
버전 관리 툴에서 관리되었으면 해서 UserSettings에 값을 저장할 수 있도록 하였다.
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/<user>/.jenkins/workspace/<job>/GradleProject/unityLibrary/build.gradle' line: 176
* What went wrong:
Execution failed for task ':unityLibrary:BuildIl2CppTask'.
> NDK is not installed
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings
Gradle 빌드 중 설치된 NDK를 인식하지 못하는 현상
UnityHub가 도입되고 고도화되면서 Unity 설치 시에 각 플랫폼 별 빌드 지원하는 툴들을 설치하게 되었다.
그 후로는 유사한 이슈가 발생하지 않았는데 2021.3.22f1버전에서 2022.3.6f1버전으로 업그레이드 하면서 발생했다.
| 해결
using System.IO;
using UnityEditor.Android;
namespace Tools
{
#if UNITY_2022_3_OR_NEWER
public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
{
public int callbackOrder => 1;
public void OnPostGenerateGradleAndroidProject(string path)
{
Debug.Log("OnPostGenerateGradleAndroidProject: " + path);
var di = new DirectoryInfo(path);
var localPropertiesFile = Path.Combine(di.Parent.FullName, "local.properties");
if (File.Exists(localPropertiesFile))
{
var hasNdkProp = HasNdkProp(localPropertiesFile);
if (false == hasNdkProp)
{
var ndkDir = $"{System.Environment.NewLine}ndk.dir={AndroidExternalToolsSettings.ndkRootPath}";
File.AppendAllText(localPropertiesFile, ndkDir);
}
}
}
private bool HasNdkProp(string path)
{
using (var streamReader = new StreamReader(path, System.Text.Encoding.UTF8))
{
string line = string.Empty;
while ((line = streamReader.ReadLine()) != null)
{
if (line.StartsWith("ndk.dir="))
return true;
}
}
return false;
}
}
#endif
}
근본적인 해결책은 아니지만 Android Project를 생성할 때, local.properties 파일에 NDK 정보를 입력하는 식으로 해결하였다.