| 플러그인 설치

 

  • Jenkins > Jenkins 관리 > 플러그인 관리 > Available plugins > S3 검색
  • S3 Publisher 설치

 

| 환결성정

 

  • Jenkins > Jenkins 관리 > 시스템 설정 > Amazon S3 profiles > '추가' 버튼 클릭
  • 아래와 같이 Profile name / Access key / Secret key를 입력

 

| JOB 설정

 

  • 사용할 Profile을 선택
  • Source: 업로드할 파일의 경로를 입력 (ant glob syntax를 따름)
  • Exclude: 제외되어야 할 파일 경로 혹은 패턴
  • Destination bucket: 파일을 업로드할 위치
  • Storage class: 아마존 S3 스토리지 클래스 [자세히 알아보기]
  • Bucket Region: ap-northest-2 [Asia Pacific (Seoul) Region]

 

| 참고

 

 

 

객체 스토리지 클래스 – Amazon S3

 

aws.amazon.com

 

 

아시아 태평양(서울) 리전 - AWS CloudFormation

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

FileSet Type

erroronmissingdir Specify what happens if the base directory does not exist. If true a build error will happen, if false, the fileset will be ignored/empty. Since Apache Ant 1.7.1 No; defaults to true (for backward compatibility reasons)

ant.apache.org

 

반응형

| 현상

UnityException: Error
mainTemplate.gradle file is using the old aaptOptions noCompress property definition which does not include types defined by unityStreamingAssets constant.

 

 

| 해결방법

android {
	aaptOptions {
		noCompress = ['.unity3d', '.ress', '.resource', '.obb'] + unityStreamingAssets.tokenize(', ')
	}
}

 

반응형

| 현상

 

Android AAR 플러그인을 유니티 프로젝트에 추가, 유니티 빌드 시 아래와 같은 에러를 마주하는 경우가 있다.

Failed to install the following Android SDK packages as some licences have not been accepted.

위 에러는 SDK에 라이센스가 없어서 발생하는 문제인데, 해당 이슈의 전체 에러 콘솔로그이다.

 

 

| 해결

 

안드로이드 스튜디오를 통해 SDK가 설치된 경로를 확인하면 아래와 같다.

C:\Users\${User}\AppData\Local\Android\Sdk

위 경로에 licenses 디렉토리를 유니티의 SDK가 설치된 경로에 복사해준다.

C:\Program Files\Unity\Hub\Editor\${Unity}\Editor\Data\PlaybackEngines\AndroidPlayer\SDK

복사 후 재빌드 시 해당 문제는 해결된 것을 확인할 수 있다.

반응형

| 패키치 설치

 

brew install akamai

특정 버전 설치의 경우: 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

 

 

| 커맨드 설치

 

akamai install purge

 

 

| Authentication credentials 만들기

 

 

Create authentication credentials

Follow these steps to create an authentication credential that contains the client token and client secret required to authenticate Akamai API, CLI, or Terraform requests.👍In order to complete these steps, you need access to Akamai Control Center and a

techdocs.akamai.com

 

 

| 자격증명 설정

 

cli를 실행하기 위해선 위에서 만든 인증 자격증명 파일을 이용해 인증을 하게 된다. 
(이때 커스텀 HTTP 요청 서명 프로토콜인 EdgeGrid를 이용)

인증 자격증명 파일은 클라이언트 토큰/시크릿 , 호스트, 액세스 토큰 등의 내용이 기입된다.

 

[ccu]
client_secret = {client_secret}
host = {host}
access_token = {access_token}
client_token = {client_token}

 

 

| 젠킨스 설정

 

 

  1. 젠킨스 > 잡 > 설정 
  2. 파라미터 추가 > 문자열 파라미터 CACHE_URL 추가
  3. 빌드 스탭 > Exectue Shell 추가
  4. akamai purge delete $CACHE_URL 기입
반응형

| 현상

 

젠킨스에서 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. 젠킨스 재시작

반응형

'Workspace > Jenkins' 카테고리의 다른 글

[Jenkins] AWS S3 통합 가이드  (2) 2023.08.21
[Jenkins] akamai cli 통합 가이드  (0) 2023.08.18
[Jenkins] AppCenter 연동  (0) 2023.03.27
[Jenkins] akamai cli 통합 가이드  (0) 2023.03.24
[Jenkins] 원결 빌드 유발  (0) 2023.03.23

나들이겸 식사로 울산 강동몽돌해변에 있는 '공간나인'이란 곳을 방문했다.

날이 좋지 않지만, 강동몽돌해변 전경
어무이랑 한컷

 

| 메뉴

 

 


바질크림 리조또

느끼한듯 짠듯 오묘한 간, 그래도 맛있게 먹었다.

 

로제파스타

해물이 곁들여져있는 로제 파스타

 

불고기피자

메뉴판의 이미지에 비해 토핑이 부족해보이는 건 기분탓이겠죠?

 


점심시간 가족단위 손님들이 몰리면서 음식 나오는 시간이 꽤 걸려 아쉬웠다.
음식이 나오자마자 폭풍흡입해서 먹는 시간보다 기다린 시간이 더 길었던...

 

 

| 위치

 

 

주차공간의 경우, 아래층 카페와 같이 쓰는 듯 했다.
어린이날 연휴 임에도 비가 와서인지 빈자리가 많아서 문제없이 주차할 수 있었다.

반응형

| 개요

 

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에 값을 저장할 수 있도록 하였다.

 

 

 

| 참고

 

 

Unity - Scripting API: SettingsProvider

In order to add new Project settings or preference pages, define a SettingsProvider. The SettingsProvider class provides the hooks to display any UI (using either IMGUI or UIElements to draw it). It also provides an API that allows you to specify keywords

docs.unity3d.com

 

반응형

| 현상

 

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 정보를 입력하는 식으로 해결하였다.

| 참고

 

 

빌드 구성  |  Android 개발자  |  Android Developers

Android 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포할 수 있는 APK로 패키징합니다.

developer.android.com

 

Unity - Scripting API: LocalPropertiesFile

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

※ 2023.1버전대부터 Ndk, LocalPropertiesFile 등 Gradle 관련 세팅을 제어하는 클래스들이 Unity.Android.Gradle 네임스페이스에 추가된다.

 

 

Unity - Scripting API: AndroidExternalToolsSettings

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

※ Preferences > External Toos > Android에서 설정한 값들을 위 클래스를 통해 제어할 수 있다.

반응형

+ Recent posts