Total: Today: Yesterday:
개발/Unity | 2020. 6. 10. 12:10 | Posted by 자수씨

컨텐츠 업데이트 워크플로우 (Content update workflow)

유니티는 게임 컨텐츠를 두 가지 범주로 구성하는 것을 권장한다.

  • Cannot Change Post Release: 업데이트 하지 않을 것으로 예상되는 정적 컨텐츠
  • Can Change Post Release: 업데이트 될 수 있는 동적 컨텐츠

이 구조에서 Cannot Change Post Release 로 지정된 컨텐츠는 애플리케이션과 함께 제공(설치 즉시 다운로드되어 로드되거나) 되고 매우 작은 번들에 상주한다. Can Change Post Release 로 지정된 컨텐츠는 각 업데이트에 필요한 데이터 양을 최소화하기 위해 작은 번들에 온라인으로 상주한다. 어드레서블 에셋 시스템의 목표 중 하나는 스크립트를 변경하지 않고도 이 구조를 쉽게 작업하고 변경할 수 있도록 하는 것이다.

 

작동 원리 (How it works)

어드레서블은 컨텐츠 카탈로그를 사용하여 로드하는 위치와 방법을 지정하여 각 에셋의 주소를 매핑한다. 앱에 매핑이 변경되는 기능을 제공하려면 원본 앱이 카탈로그의 온라인 사본을 알고 있어야 한다. 이러한 설정을 하기 위해서는 AddressableAssetSettings 인스펙터에서 Build Remote Catalog 설정을 활성화해야 한다. 이를 통해 카탈로그 사본이 지정된 경로에 빌드되어 로드되는 것을 보장한다. 앱이 제공된 이후에는 이 로드 경로를 변경할 수 없다. 컨텐츠 업데이트 프로세스는 파일 이름이 동일한 카탈로그의 새 버전을 작성하여 이전에 지정된 로드 경로에서 파일을 겹쳐 쓴다.

애플리케이션을 빌드하면 고유한 앱 컨텐츠 버전 문자열이 생성되어 각 앱이 로드해야 하는 컨텐츠 카탈로그를 식별한다. 서버는 충돌없이 여러 버전의 앱 카탈로그가 포함될 수 있다. 필요한 데이터는 addressables_content_state.bin 파일에 저장된다. 여기에는 Cannot Change Post Release 로 지정된 그룹에 포함된 모든 에셋에 대한 새시 정보와 함께 버전 문자열이 저장된다. 기본적으로 프로젝트 디렉토리의 Assets/AddressableAssetsData/\<platform\> 에 위치한다.

addressables_content_state.bin 파일에는 어드레서블 시스템의 모든 Cannot Change Post Release 에셋 그룹에 대한 해시 및 종속성 정보가 포함되어 있다. StreamingAssets 폴더에 빌드된 모든 그룹은 Cannot Change Post Release 로 지정되어야 하지만 대규모 원격 그룹도 이러한 지정에 이점을 가질 수 있다. 다음 단계 (아래에 설명된 컨텐츠 업데이트 준비)에서 이 해시 정보는 Cannot Change Post Release 그룹에 변경된 자산이 포함되어 있는지 여부를 결정하므로 해당 에셋을 다른 곳으로 이동해야 한다.

 

고유 번들 ID (Unique Bundle IDs)

에셋 번들을 메모리에 로드할 때 유니티는 동일한 내부 이름으로 두 개의 번들을 로드할 수 없도록 강제한다. 이로 인해 런타임 시 번들 업데이트에 제한이 있을 수 있다. 현재 어드레서블은 초기화 외부에서 카탈로그 업데이트를 지원하므로 이미 로드된 컨텐츠를 업데이트 할 수 있다.

이 작업을 수행하려면 두 가지 중 하나가 발생해야 한다. 한 가지 옵션은 카탈로그를 업데이트하기 전에 모든 어드레서블 컨텐츠를 언로드하는 것이다. 두 번째 옵션은 업데이트 된 에셋번들에 고유한 내부 식별자가 있는지 확인하는 것이다. 이를 통해 새 번들을 로드할 수 있으며 이전 번들은 여전히 메모리에 있게 된다. 두 번째 옵션을 활성화하는 옵션은 AddressableAssetSettings 인스펙터에서 "Unique Bundle IDs" 를 켜는 것이다. 이 옵션의 단점은 번들을 종속성 체인으로 재구성해야 한다는 것이다. 한 그룹에서 매터리얼을 변경한 경우 기본적으로 매터리얼 번들만 다시 작성하면 되지만 "Unique Bundle IDs" 옵션이 활성화되면 해당 매터리얼을 참조하는 모든 에셋을 리빌딩해야 한다.

 

컨텐츠 업데이트 준비 (Preparing for content updates)

Cannot Change Post Release 그룹에서 에셋을 수정한 경우 Check for Content Update Restrictions 명령을 실행해야 한다. 이 명령을 통해 수정된 에셋이 Cannot Change Post Release 그룹에서 제거되어 새 그룹으로 이동한다. 새 에셋 그룹을 생성하려면 아래와 같다.

  1. 유니티 에디터에서 Addressable Groups window 를 연다. (Window > Asset Management > Addressables > Groups)
  2. Addressable Groups window 에서 메뉴바의 Tools > Check for Content Update Restrictions 를 선택한다.
  3. 빌드 데이터 파일 (Build Data File) 다이얼로그 팝업이 열리면 addressable_content_state.bin 파일을 선택한다.

이 데이터는 애플리케이션이 마지막으로 빌드 된 이후 수정된 에셋 또는 종속성을 결정하는데 사용된다. 시스템은 컨텐츠 업데이트 빌드를 준비하기 위해 이러한 에셋을 새 그룹으로 옮긴다.

참고: 이 명령은 모든 변경 사항이 Can Change Post Release 그룹으로 제한된 경우 아무 작업도 수행하지 않는다.

중요: 준비 작업을 실행하기 전에 버전 관리 시스템을 분기하는 것이 좋다. 준비 작업은 컨텐츠 업데이트에 적합한 방식으로 에셋 그룹을 재정렬한다. 분기는 다음에 새 플레이어의 제공 시점에 원하는 컨텐츠 배열로 돌아갈 수 있도록 한다.

개발/Unity | 2020. 6. 9. 13:03 | Posted by 자수씨

영여 실력이 번역할 정도는 아니지만 내용 파악을 위해 진행한다.

 

 

Addressable Assets (이하 어드레서블 에셋) 의 주요 이점은 컨텐츠의 배열, 빌드 그리고 로드하는 방법을 분리하는 것이다. 전통적으로 이러한 개발 측면에서는 이런 것들이 밀접하게 연관되어 있었다.

전통적인 에셋 관리

Resource 디렉토리에 컨텐츠를 배열하면 기본 애플리케이션에 내장되며 리소스에 대한 경로를 파라미터로 사용하는 Resources.Load 메소드를 사용하여 컨텐츠를 로드해야 한다. 다른 곳에 저장된 컨텐츠를 접근하려면 직접 참조나 asset bundle (이하 에셋 번들) 을 사용한다. 에셋 번들을 사용하는 경우 리소스 로드와 구성 전략을 함께 묶어 경로 별로 다시 로드한다. 에셋 번들이 원격 환경에 있거나 다른 번들에 종송된 경우 모든 번들의 다운로드, 로드 및 언로드를 관리하는 코드를 작성해야 한다.

어드레서블 에셋 관리

에셋에 주소를 부여하면 프로젝트의 위치나 에셋 빌드 방법과 상관없이 해당 주소를 사용하여 로드할 수 있다. 어드레서블 에셋의 경로나 파일이름을 문제 없이 변경할 수 있다. 또한 로딩하는 코드 변경 없이 리소스 폴더 또는 로컬 빌드 대상에서 다른 빌드 위치 (원격 환경 포함) 로 어드레서블 에셋을 이동할 수 있다.

에셋 그룹 스키마 (Asset Group schemas)

스키마는 일련의 데이터를 정의한다. 인스펙터에서 스키마를 자산 그룹에 연결할 수 있다. 예를 들어 packed 모드로 빌드할 때 BundledAssetGroupSchema 스키마가 첨부된 그룹은 에셋 번들의 소스로 작동한다. 새로운 그룹을 정의하는데 사용하는 템플릿으로 스키마 집합을 결합할 수 있다. AddressableAssetsSettings 인스펙터를 통해 스키마 템플릿을 추가할 수 있다.

빌드 스크립트 (Build scripts)

빌드 스크립트는 프로젝트 내에 IDataBuild 인터페이스를 구현한 ScriptableObject 에셋으로 표시된다. 사용자는 자신만의 빌드 스크립트를 생성하고 인스펙터를 통해 AddressableAssetsSettings 객체에 추가할 수 있다. Addressable Groups window (Window > Asset Management > Addressables > Groups) 에서 빌드 스크립트를 적용하려면, 플레이 모드 스크립트(Play Mode Script)와 드롭다운 옵션을 선택한다. 현재 전체 애플리케이션 빌드를 지원하기 위해 구현된 세 가지 스크립트와 에디터에서 반복하기 위한 세 가지 플레이 모드 스크립트가 있다.

플레이 모드 스크립트 (Play mode scripts)

어드레서블 에셋 패키지에는 앱 개발 속도를 높이는 플레이 모드 데이터를 만드는 데 도움을 주는 세 가지 빌드 스크립트가 있다.

에셋 데이터 베이스 사용 (Use Asset Database, faster)

빠른 모드 (BuildScriptFastMode) 를 사용하면 게임 흐름을 진행하면서 빠르게 실행할 수 있다. 빠른 모드는 분석이나 에셋 생성 없이 빠른 반복을 위해 에셋 베이터베이스를 이용하여 에셋을 직접 로드한다.

그룹 시뮬레이션 (Simulate Group, advanced)

가상 모드 (BuildScriptVirtualMode) 는 에셋 번들을 생성없이 컨텐츠를 레이아웃과 종속성을 위한 컨텐츠를 분석한다. 마치 에셋 ResourceManager 가 번들을 통해 로드 된 것 처럼 에셋 데이터베이스에서 로드한다. 게임 플레이 중 번들이 언제 로드 또는 언로드되는지는 Addressable Event Viewer window (Window > Asset Mangement > Addressables > Event Viewer) 에서 에셋 사용량을 확인할 수 있다.

가상모드를 사용하면 로드 전략을 시뮬레이션하고 컨텐츠 그룹을 조정하여 제품 릴리즈에 적합한 균형을 찾을 수 있다.

기존 빌드 사용 (Use Existing Build, requires built groups)

압축 재생 모드 (BuildScriptPAckedPlayMode) 는 이미 구축된 에셋 번들을 사용한다. 이 모드는 배포된 애플리케이션 빌드와 가장 일치하지만 별도의 단계로 데이터를 빌드해야 한다. 에셋을 수정하지 않으면 이 모드는 플레이 모드로 들어갈 때 데이터를 처리하지 않기 때문에 가장 빠르다. Build > New Build > Default Build Script 를 선택하거나 게임 스크립트의 메소드를 사용하여 Addressable window (Window > Asset Management > Addressables > Groups) 에서 AddressableAssetSettings.BuildPlayerContent() 메소드를 이용하여 이 모드의 컨텐츠를 빌드해야 한다.

분석 및 디버깅 (Analysis and debugging)

기본적으로 어드레서블 에셋은 경고/에러에 대해 기록만 한다. 상세 로그를 활성화 하기 위해서는 Player settings window (Edit > Project Settings... > Player) 을 열고 Other Settings > Configuration 섹션으로 이동한 후 Scripting Define Symbols 필드에 ADDRESSABLES_LOG_ALL 를 추가한다.

초기화 객체 (Initialization objects)

어드레서블 에셋 설정에 객체를 첨부하고 런터임에 초기화 프로세스로 전달할 수 있다. CacheInitializationSettings 객체는 런타임 시 유니티의 캐싱 API 를 제어한다. 자체 초기화 객체를 만드려면 IObjectInitializationDataProvider 인터페이스를 구현하는 ScriptableObject 를 만든다. 이는 런타임 데이터로 직렬화된 ObjectInitializationData 를 생성을 담당하는 시스템의 Editor 구성요소이다.

커스터마이징 URL 평가 (Customizing URL Evaluation)

런타임 시에 에셋 (일반적으로 에셋 번들) 의 경로 또는 URL 을 커스터마이징 해야 하는 몇 가지 시나리오가 있다. 가장 일반적인 예는 서명된 URL 을 생성하는 것이다. 다른 하나는 동적 호스트 결정일 수 있다.

아래 코드는 모든 URL 에 쿼리 문자열을 추가하는 예이다.

//Implement a method to transform the internal ids of locations
string MyCustomTransform(IResourceLocation location)
{
    if (location.ResourceType == typeof(IAssetBundleResource) && location.InternalId.StartsWith("http"))
        return location.InternalId + "?customQueryTag=customQueryValue";
    return location.InternalId;
}

//Override the Addressables transform method with your custom method.  This can be set to null to revert to default behavior.
[RuntimeInitializeOnLoadMethod]
static void SetInternalIdTransform()
{
    Addressables.InternalIdTransformFunc = MyCustomTransform;
}

※ Android 플랫폼에서 비디오 파일을 로드할 목적으로 비디오 파일을 어드레서블 파일에 번들로 묶을 경우 CacheInitializationSettings 객체를 생성하고 해당 객체에 Compress Bundles 를 비활성화한 후 ddressableAssetSettings 객체의 초기화 객체 목록에 추가한다. (아직 없는 경우)

 

 

참고자료: https://docs.unity3d.com/Packages/com.unity.addressables@1.9/manual/AddressableAssetsDevelopmentCycle.html

 

Addressable Assets development cycle | Addressables | 1.9.2

Addressable Assets development cycle One of the key benefits of Addressable Assets is decoupling how you arrange, build, and load your content. Traditionally, these facets of development are heavily tied together. Traditional asset management If you arrang

docs.unity3d.com

 

노하우/Linux | 2020. 5. 31. 19:36 | Posted by 자수씨

1. yum 을 최신으로 업데이트 한 후에 gcc 와 make 를 설치한다.

$ sudo yum update
$ sudo yum install gcc make

 

2. 레디스 최신 버전 소스를 내려받아 빌드한다.

$ wget http://download.redis.io/releases/redis-6.0.4.tar.gz
$ tar xzf redis-6.0.4.tar.gz
$ cd redis-6.0.4
$ make

 

3. 디렉토리 생성 및 복사

$ sudo mkdir /etc/redis 
$ sudo mkdir /var/lib/redis
$ sudo cp src/redis-server src/redis-cli /usr/local/bin/
$ sudo cp redis.conf /etc/redis/

 

4. /etc/redis/redis.conf 수정

daemonize yes
bind 0.0.0.0
dir /var/lib/redis
logfile "/var/log/redis_6379.log"

 

5. 자동 실행을 위한 설정

$ cd /tmp
$ wget https://raw.github.com/saxenap/install-redis-amazon-linux-centos/master/redis-server
 
$ sudo mv redis-server /etc/init.d
$ sudo chmod 755 /etc/init.d/redis-server

$ sudo chkconfig --add redis-server
$ sudo chkconfig --level 345 redis-server on

 

6. redis 서버 실행

$ sudo service redis-server start
Starting redis-server (via systemctl):                 [  OK  ]

 

참고자료:

1. https://redis.io/download

 

Redis

*Download Redis uses a standard practice for its versioning: major.minor.patchlevel. An even minor marks a stable release, like 1.2, 2.0, 2.2, 2.4, 2.6, 2.8. Odd minors are used for unstable releases, for example 2.9.x releases are the unstable versions of

redis.io

2. https://github.com/saxenap/install-redis-amazon-linux-centos

 

saxenap/install-redis-amazon-linux-centos

his is a installation script to setup Redis 2.6 as a service on Amazon Linux AMI and CentOS distributions. - saxenap/install-redis-amazon-linux-centos

github.com

 

'노하우 > Linux' 카테고리의 다른 글

[EC2] htop, iftop, iotop  (0) 2021.07.22
[scouter] AWS EC2 인스턴스에 scouter-paper 설치하기  (0) 2019.04.23
[AWS] EC2 인스턴스에 nodejs 설치  (0) 2019.04.23
Linux 에 OpenJDK 8 설치  (0) 2019.04.13
포트 우회하기  (0) 2019.04.12

노하우/Server | 2020. 5. 31. 18:58 | Posted by 자수씨

웹소켓 서버를 nginx 를 통해 포워딩을 하려고 단순하게 아래와 같이 서버 설정을 할 경우 정상적으로 처리가 되지 않는다.

    server {
        ...

        # forward {context-path}
        location /{context-path}/ {
            proxy_pass http://localhost:{port}/{context-path}/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }

아래와 같이 map 설정을 해주어야 정상동작을 한다.

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        ...

 

참고자료: http://nginx.org/en/docs/http/websocket.html

'노하우 > Server' 카테고리의 다른 글

[MongoDB] CentOS 7에 설치하기  (0) 2019.08.10
[scouter] AWS EC2 인스턴스에 scouter 설치하기  (1) 2019.04.19

노하우/Server | 2019. 8. 10. 18:34 | Posted by 자수씨

1. yum repository 에 MongoDB 추가

# vi /etc/yum.repos.d/mongodb.repo

/etc/yum.repos.d/mongodb.repo

[MongoDB]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=0
enabled=1

2. MongoDB 서버 설치

# yum install mongodb-org

설치하는 시점(2019.08.10)에는 4.0.12 버전으로 설치가 되었습니다.

Installed:
  mongodb-org.x86_64 0:4.0.12-1.el7                                                                                                                                                                     

Dependency Installed:
  mongodb-org-mongos.x86_64 0:4.0.12-1.el7          mongodb-org-server.x86_64 0:4.0.12-1.el7          mongodb-org-shell.x86_64 0:4.0.12-1.el7          mongodb-org-tools.x86_64 0:4.0.12-1.el7

3. MongoDB 서비스 시작

MongoDB 서비스를 시작하기 위해서는 아래와 같은 명령어를 입력합니다.

# systemctl start mongod.service

시스템 부팅 시에 자동으로 시작되게 하기 위해서 아래의 명령어를 입력합니다.

# systemctl enable mongod.service

서비스가 시작된 후 버전 확인을 위해서는 다음 명령을 통해 확인 가능합니다.

# mongod --version
db version v4.0.12
git version: **
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
    distmod: rhel70
    distarch: x86_64
    target_arch: x86_64

참고자료

'노하우 > Server' 카테고리의 다른 글

[nginx] websocket forwarding  (0) 2020.05.31
[scouter] AWS EC2 인스턴스에 scouter 설치하기  (1) 2019.04.19

개발/JAVA | 2019. 6. 2. 19:00 | Posted by 자수씨

개요

spring-session 에 저장방식을 redis 로 지정하고 redis 라이브러리를 lettuce 로 지정하였다.

개발서버에서는 정상적으로 동작하였으나 운영서버에서는 같은 AWS EC2 인스턴스임에도 아래와 같은 오류가 발생하였다.

java.lang.ClassCastException: io.netty.channel.epoll.EpollEventLoopGroup cannot be cast to io.netty.channel.EventLoopGroup
    at io.lettuce.core.resource.DefaultEventLoopGroupProvider.getOrCreate(DefaultEventLoopGroupProvider.java:119) ~[lettuce-core-5.1.6.RELEASE.jar:na]

작업1

lettuce Native-Stransports 를 보면 native netty 의 성능이 더 좋으므로 netty-transport-native-epoll 을 디펜던시에 추가하라고 명시되어 있다.

디펜던시를 추가하고 웹 어플리케이션을 재시작하면 위와 같은 오류는 발생하지 않는다. 하지만 로컬 환경에서 native 디펜던시를 추가하는 것은 또다른 문제가 발생할 것으로 보여 다른 방법을 찾아야 했다.

작업2

lettuce Native-Stransports 를 자세히 살펴보니 native netty 를 사용하지 않는 옵션을 발견하였다.

catalina.sh 에 다음과 같이 시스템 프로퍼티를 추가한다.

# netty native settings
JAVA_OPTS="$JAVA_OPTS -Dio.lettuce.core.epoll=false"

재시작 시 native netty 를 사용하지 않고 정상동작 하는 것을 확인하였다.

INFO 15189 --- [enerContainer-1] io.lettuce.core.EpollProvider            : Starting without optional epoll library
INFO 15189 --- [enerContainer-1] io.lettuce.core.KqueueProvider           : Starting without optional kqueue library

작업3

EPollProvider 를 보다보니 io.netty.channel.epoll.Epoll 클래스가 있는지를 체크하는데 저 클래스로 인해 native netty 가 활성화 된 것으로 추가한 기억이 없는 클래스의 위치를 찾기 위해 classloader.jsp 를 인터넷에서 구하여 위치를 확인해보았다.

예전에 tomcat session 을 redis 로 설정하기 위해 ${catalina_base}/lib 에 추가하였던 redis-session-manager-with-dependencies-2.2.2-SNAPSHOT.jar 이 파일이 문제였다. 이번 작업으로 인해 제거해도 무방했던 jar 파일이라 제거하고 테스트를 해보았더니 정상이였다.

결론

문제의 원인은 이전에 추가하였던 redis-session-manager 라이브러리와의 충돌이였다. 어쩐지 인터넷을 찾아봐도 비슷한 내용이 나오지 않더라니...

돌고 돌았지만 문제의 원인은 확인하고 해결할 수 있었다.

노하우/WAS | 2019. 5. 23. 16:36 | Posted by 자수씨

Apache Http Server 나 Nginx 에서 사용하던 인증서를 Tomcat 에서 사용하려고 보니 바로 적용이 안되군요...
(pkcs12 형식으로 변환이 필요)

./chainca.crt
./mydomain.com.crt
./mydomain.com.key

위와 같이 체인인증서와 ROOT 인증서가 합쳐저 있는 chainca.crt 와 도메인의 인증서가 있는 mydomain.com.crt 를 하나의 파일로 합쳐 줍니다.

$ cat mydomain.com.crt chainca.crt > mydomain.com.chainca.crt

openssl 을 이용하여 pkcs12 형식으로 변환합니다.

$ openssl pkcs12 -export -in mydomain.com.chainca.crt -inkey mydomain.com.key -out mydomain.com.p12 -name tomcat
Enter Export Password: (key 파일 암호입력)
Verifying – Enter Export Password: (key 파일 암호입력)

정상적으로 변환을 확인하려면 아래 명령어를 이용합니다.

$ keytool -list -v -keystore mydomain.com.p12 -storetype pkcs12

$CATALINA_HOME/conf/server.xml

아래와 같이 커넥터를 추가합니다.

<Connector port="{SSL포트}" maxHttpHeaderSize="8192"
           maxThreads="150" enableLookups="false" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true"
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
           keystoreFile="{인증서 경로}"
           keystoreType="PKCS12" keystorePass="{인증서 패스워드}"/>

해당 포트로 정상적으로 접근하면 설정 완료입니다.

참고자료

노하우/Jenkins | 2019. 5. 1. 17:45 | Posted by 자수씨

설정이 복잡한 jenkins job 을 다른 jenkins 서버에 이관할 경우 jenkins-cli 를 통해 쉽게 진행할 수 있습니다.

Jenkins 관리 > Jenkins CLI 에 들어가면 가능한 명령어들을 볼 수 있습니다.

우측 상단에 jenkins-cli.jar 를 내려받아 다음과 같이 실행합니다.

java -jar jenkins-cli.jar -s <jenkins 서버 IP:Port> <명령어>

만약 로그인이 필요한 서버일 경우 다음과 같이 계정 정보를 입력합니다.

java -jar jenkins-cli.jar -s <jenkins 서버 IP:Port> -auth <아이디>:<패스워드> <명령어>

기존 jenkins 서버에서 job 정보를 xml 로 내려받기 위해 get-job 명령어를 이용합니다.

java -jar jenkins-cli.jar -s http://localhost:8080/ -auth user:password get-job myjob > myjob.xml

get-job 명령어는 xml 로 job 정보를 stdout 으로 내보내기 때문에 > 을 이용하여 파일에 저장합니다.

<?xml version='1.1' encoding='UTF-8'?>
<maven2-moduleset plugin="maven-plugin@3.1.2">
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties>
    <com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="gitlab-plugin@1.5.6">
      <gitLabConnection></gitLabConnection>
    </com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
    <jenkins.model.BuildDiscarderProperty>
      <strategy class="hudson.tasks.LogRotator">
        <daysToKeep>20</daysToKeep>
        <numToKeep>20</numToKeep>
        <artifactDaysToKeep>-1</artifactDaysToKeep>
        <artifactNumToKeep>-1</artifactNumToKeep>
      </strategy>
    </jenkins.model.BuildDiscarderProperty>
  </properties>
  ...
<maven2-moduleset>

이관할 jenkins 서버에 job 을 생성하기 위해 create-job 명령어를 이용합니다.

java -jar jenkins-cli.jar -s http://localhost:9080/ -auth user:password create-job myjob < myjob.xml
ERROR: Unexpected exception occurred while performing create-job command.
javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 1; Content is not allowed in prolog.

위와 같은 오류가 발생한다면 xml 에서 <?xml version='1.1' encoding='UTF-8'?> 부분을 제거한 후 다시 실행합니다.

성공적으로 job 이 생성되었다면 서버 환경에 따른 차이점 부분만 조정해주면 됩니다.

노하우/Linux | 2019. 4. 23. 00:25 | Posted by 자수씨

지난번 포스팅 에서 내려받았던 scouter 에 paper 기능을 설치하였습니다.

webapps 설정

인증된 사용자만 노출할 것이므로 net_http_api_auth_bearer_token_enabled 설정을 해주고 collector 서버 설정도 합니다.

net_collector_ip_port_id_pws=127.0.0.1:6100:<계정>:<패스워드>
net_http_port=6180
net_http_api_auth_bearer_token_enabled=true

/scouter/webapps 에서 ./startup.sh 로 실행을 하면 아래와 같이 지정된 포트로 LISTEN 상태를 확인할 수 있습니다.

[ec2-user@~ webapp]$ netstat -na | grep LISTEN
...
tcp        0      0 :::6180                     :::*                        LISTEN    

nat 설정으로 외부포트를 내부 6180 연결하여 로그인이 정상적으로 되지 않습니다.

네트워크 탭을 보면 loginGetToken 에서 오류가 납니다. (외부포트와 내부포트가 달라서 발생하는 문제)

scouter-paper 수정

github 에서 소스를 내려받은 후 강제로 외부포트를 설정하였습니다. 그리고 빌드 후 다시 webapps/extweb 에 배포

/src/App.js

componentWillMount() {
    ...

    // URL로부터 스카우터 서버 정보를 세팅
    let params = getParam(this.props, "address,port,protocol,authentification");
    if (params[0] && params[1]) {
        let paramAddress = params[0];
        let paramPort = params[1];
        let paramProtocol = params[2] ? params[2] : "http";
        let paramAuthentification = params[3] ? params[3] : "none";

        let found = false;
        for (let i=0; i<config.servers.length; i++) {
            let server = config.servers[i];
            if (server.protocol === paramProtocol && server.address === paramAddress && String(server.port) === String(paramPort) && server.authentification === paramAuthentification) {
                found = true;
                server.default = true;
            } else {
                server.default = false;
            }
        }

        if (!found) {
            config.servers.push({
                protocol: paramProtocol,
                address: paramAddress,
                port: paramPort,
                authentification :paramAuthentification,
                default : true
            });
        }
    }

    config.servers[0].port = <외부포트>;

    if (config && config.servers) {
        config.servers.forEach((server) => {
            server.name = server.protocol + "://" + server.address + ":" + server.port
        });
    }
    ...
}

정상적으로 접근이 됩니다.

'노하우 > Linux' 카테고리의 다른 글

[EC2] htop, iftop, iotop  (0) 2021.07.22
[Redis] AWS EC2 인스턴스에 redis-server 설치  (0) 2020.05.31
[AWS] EC2 인스턴스에 nodejs 설치  (0) 2019.04.23
Linux 에 OpenJDK 8 설치  (0) 2019.04.13
포트 우회하기  (0) 2019.04.12

노하우/Linux | 2019. 4. 23. 00:16 | Posted by 자수씨

nvm(노드 버전 관리자)을 설치

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh | bash

nvm 활성화

. ~/.nvm/nvm.sh

npm 설치

2019년 4월 23일 기준 10.15.3 버전이 최신이므로 해당 버전을 설치

[ec2-user@~~]$ nvm install 10.15.3
########################################################################################################################################################################################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v10.15.3 (npm v6.4.1)
Creating default alias: default -> 10.15.3 (-> v10.15.3)

버전 확인

[ec2-user@~~]$ node -e "console.log('Running Node.js ' + process.version)"
Running Node.js v10.15.3

참고자료