쿠킹된 데이터 스냅샷의 사용 방법을 살펴보기 전에 Zenserver를 쿠킹된 출력 저장소로 사용하기에서 설명한 대로 젠 스토리지 서버(Zenserver)가 쿠킹된 출력 저장소로서 활성화되었는지 확인합니다.
쿠킹된 데이터 스냅샷을 사용하는 목적은 다음과 같습니다.
-
자동화 시스템으로 다른 곳에서 이미 빌드한 데이터를 다시 쿠킹하는 일을 방지합니다.
-
자동화 시스템으로 다른 곳에서 생성한 베이스 빌드 위에 향후 점진적으로 쿠킹할 수 있습니다.
-
쿠킹된 데이터에 아직 없는 데이터 조각을 효율적으로 델타 다운로드 가능합니다.
종합하자면 이를 달성하기 위해서는 사용자에게 다른 곳에서 생성된 빌드에 쿠킹된 데이터를 가져오는 편리한 수단을 제공하고, 그 위에 로컬 수정을 쿠킹하도록 허용하면 됩니다.
기본적으로, 쿠킹된 데이터 스냅샷의 콘셉트는 간단합니다. Zenserver를 쿠킹된 출력 저장소로 사용할 때, Zenserver 내의 프로젝트 및 대상 플랫폼의 쿠킹된 출력을 소스 위치에서 익스포트하고 대상 위치에 임포트할 수 있습니다.
이러한 익스포트/임포트는 다음과 같습니다.
-
완전성: 대상에서 수행하는 모든 작업은 쿠킹을 소스 위치에서 수행했을 때와 작업 결과가 같아야 합니다. 여기에는 다음이 포함됩니다.
-
컨테이너 파일(
.pak/.utoc/.ucas)에 스테이징. -
Zenserver 스트리밍을 사용하여 게임 실행.
-
소스 위치에서 쿠킹할 당시 데이터 세트에 포함되지 않았던 추가적인 변경사항을 점진적으로 쿠킹.
-
-
효율성: 대상 위치에 없는 데이터만 복사합니다.
-
유연성: 다음 스토리지 메커니즘 가운데 하나를 사용하여 데이터를 저장할 수 있습니다.
-
언리얼 클라우드 DDC(Unreal Cloud DDC)
-
언리얼 Zenserver
-
파일 아카이브
-
스냅샷 디스크립터
스냅샷 안의 쿠킹된 데이터는 디스크립터 구조체를 사용하여 참조할 수 있습니다. 이 구조체에는 쿠킹된 데이터의 저장 위치, 저장 방법, 저장 콘텐츠에 대한 데이터가 포함되어 있습니다. 스냅샷 디스크립터는 일반적으로 JSON으로, 파일 시스템이나 다른 저장 매체에서 파일로 표현될 수 있습니다. JSON으로 표현되는 디스크립터의 예는 다음과 같습니다.
디스크립터 JSON
{
"snapshots": [
{
"name": "lyra.lyra-package-and-test.lyra-cl-35690018.e0ebea.ece6.windows",
"type": "cloud",
"targetplatform": "Windows",
"host": "https://cloud-ddc.example.com",
"namespace": "myproject.oplog",
"bucket": "ue5-main.windows",
"key": "4302aee18444cb9e9cff59fc079319cc9ac27c0e"
}
]
}
자동화된 빌드에서 스냅샷에 쿠킹된 데이터 익스포트하기
엔진이 제공하는 BuildAndTestProject.xml 빌드 그래프 사용하기
엔진과 함께 제공되는 샘플 빌드 그래프는 Engine\Build\Graph\Tasks\BuildAndTestProject.xml 에 있습니다. 이 샘플에는 스냅샷 익스포트용 인프라가 포함되어 있습니다. 이미 자동화된 빌드를 생성할 때 이 빌드 그래프를 활용하고 있다면, 이 빌드로 아래 섹션에 설명된 스토리지 메커니즘에 저장용 스냅샷을 익스포트할 수 있습니다.
쿠킹된 출력 데이터에 어떤 스토리지 메커니즘을 사용하든 상관없이 스냅샷은 작은 스냅샷 디스크립터 파일을 생성하여 지정된 NetworkSnapshotDescFileRoot 위치의 하위 디렉터리에 기록합니다. 이 스냅샷 디스크립터 파일에는 나중에 사용자가 스냅샷을 가져오는 데 필요한 모든 정보가 담겨 있습니다.
언리얼 클라우드 DDC 저장 스냅샷
-
스냅샷을 저장할 네임스페이스(예:
myproject.oplog)를 선택합니다. 네임스페이스는 반드시 언리얼 클라우드 DDC(Unreal Cloud DDC) 관리자가 생성해야 합니다. -
빌드 그래프의
NetworkSnapshotDescFileRoot프로퍼티에 스냅샷 디스크립터 저장에 사용할 네트워크 파일 서버 위치의 경로를 설정합니다. 예를 들어,\\myfileshare\Builds\Snapshots와 같이 설정합니다. -
빌드 그래프 실행 시
PublishCloudSnapshot옵션을 true로 설정합니다. -
스냅샷을 익스포트할 언리얼 클라우드 DDC 서버의 호스트 이름과 스키마에
UE-CloudPublishHost환경 변수(Mac 또는 Linux에서는UE_CloudPublishHost)를 설정합니다. 예를 들어,https://cloud-ddc.example.com과 같이 설정합니다. -
앞서 1단계에서 선택한 네임스페이스에
UE-CloudPublishNamespace환경 변수(Mac 또는 Linux에서는UE_CloudPublishNamespace)를 설정합니다. 예를 들어,myproject.oplog와 같이 설정합니다.
언리얼 클라우드 DDC 저장 스냅샷을 사용할 때는 새 스냅샷을 구성하고 저장할 때 레퍼런스로 사용할 스냅샷의 마지막/베이스 버전을 확인할 수 있다면 매우 유용합니다. 그러면 연속된 스냅샷 사이의 중복된 스토리지 제거 효율을 극대화할 수 있습니다. BuildAndTestProject.xml 빌드 그래프는 다음과 같은 언리얼 호드(Unreal Horde) 시스템에서 제공하는 환경 변수를 사용하여 이러한 목적을 달성합니다.
-
UE_HORDE_JOBID -
UE_HORDE_STEPID -
UE_HORDE_TEMPLATEID -
UE_HORDE_LAST_WARNING_CL
이러한 환경 변수가 없어도 UAT에서 호출한 BuildAndTestProject.xml 은 여전히 스냅샷을 생성해서 언리얼 클라우드 DDC에 저장하지만, 연속된 스냅샷 간에 더 많은 데이터가 중복되어 시간이 지날수록 필요한 스토리지 용량이 커질 수 있습니다.
언리얼 Zenserver 저장 스냅샷
-
빌드 그래프의
NetworkSnapshotDescFileRoot프로퍼티에 스냅샷 디스크립터 저장에 사용할 네트워크 파일 서버 위치의 경로를 설정합니다. 예를 들어,\\myfileshare\Builds\Snapshots와 같이 설정합니다. -
빌드 그래프 실행 시
PublishZenSnapshot옵션을 true로 설정합니다. -
스냅샷을 익스포트할 언리얼 젠 서버의 호스트 이름과 스키마에
UE-ZenPublishHost환경 변수(Mac 또는 Linux에서는UE_ZenPublishHost)를 설정합니다. 예를 들어,https://shared-zen.example.com:8558과 같이 설정합니다.
커스텀 빌드 그래프 사용하기
엔진에서 제공하는 BuildAndTestProject.xml 그래프 대신 자체 빌드 그래프를 사용하는 경우, 자체 빌드 그래프의 ZenExportSnapshot 태스크를 사용하여 빌드 컴퓨터의 로컬 Zenserver에 저장되어 있는 쿠킹된 출력을 다음 위치 중 하나로 익스포트할 수 있습니다.
-
언리얼 클라우드 DDC 서버
-
다른 Zenserver
-
파일 아카이브
BuildAndTestProject.xml 에서 가져온 사용 예시
BuildAndTestProject.xml
<ZenExportSnapshot
Project="$(TargetProject)" Platform="$(CookPlatform)"
DestinationStorageType="Cloud"
DestinationCloudHost="$(UE-CloudPublishHost)"
DestinationCloudHttpVersion="$(UE-CloudPublishHttpVersion)"
SnapshotDescriptorCloudHost="$(UE-CloudPublishDescriptorHost)"
SnapshotDescriptorCloudHttpVersion="$(UE-CloudPublishDescriptorHttpVersion)"
DestinationCloudNamespace="$(UE-CloudPublishNamespace)"
DestinationCloudBucket="$(EscapedBranch).$(CookPlatform)" DestinationIdentifier="$(SnapshotIdentifier)"
SnapshotDescriptorFile="$(SnapshotLocalDir)/$(StagedPlatformFolder)/$(SnapshotFilenamePrefix)-cloud.json"
SnapshotBaseDescriptorFile="$(SnapshotBaseDescriptorFile)"
/>
이 태스크의 각 파라미터는 Engine\Source\Programs\AutomationTool\BuildGraph\Tasks\ZenExportSnapshotTask.cs 소스 파일에 문서화되어 있습니다.
필수는 아니지만 언리얼 클라우드 DDC에 스냅샷을 저장할 때는 SnapshotBaseDescriptorFile 파라미터를 사용하여 이전 스냅샷과 최대한 오버래핑하고 중복을 제거하여 새 스냅샷을 만드는 것이 좋습니다. 이렇게 하면 언리얼 클라우드 DDC에서 스냅샷의 디스크 사용량을 줄일 수 있습니다.
스냅샷에서 쿠킹된 데이터 임포트하기
ushell에서
.zen 명령 사용하기
ushell 내에서 .zen` 명령을 사용하여 스냅샷 디스크립터 파일에 설명된 대로 스냅샷을 임포트할 수 있습니다. 예를 들어, 프로젝트의 체인지리스트/리비전 777에서 Android용으로 쿠킹된 데이터 스냅샷을 익스포트한 경우, 다음 위치에 스냅샷 디스크립터가 작성되었을 것입니다.
파일 위치
\\myserver\myshare\CloudSnapshots\mystream\myproject\Android_ETC2\777\name-cloud.json
이 스냅샷 디스크립터의 콘텐츠에는 쿠킹된 출력 데이터를 임포트하기에 충분한 정보가 포함되어 있으며, ushell 명령 프롬프트에서 다음 명령을 실행하여 수행할 수 있습니다.
ushell 명령
.zen importsnapshot \\myserver\myshare\CloudSnapshots\mystream\myproject\Android_ETC2\777\name-cloud.json
스냅샷이 임포트될 때, 쿠킹된 출력 디렉터리에는 다음과 같이 ue.projectstore 라는 이름의 단일 파일만 포함됩니다.
나머지 데이터는 Zenserver에 저장됩니다. 이 시점부터 Android 플랫폼의 체인지리스트 777에 프로젝트를 직접 쿠킹한 것과 똑같아집니다. 이제 다음 단계를 진행할 수 있습니다.
-
빌드를 컨테이너(
.pak/.utoc/.ucas)나 젠 스트리밍을 사용하여 스테이징/디플로이/실행할 수 있습니다. -
향후 계획: 로컬에서 변경한 체인지리스트 777에 포함되지 않은 추가 변경사항을 적용하기 위해 점진적으로 쿠킹할 수 있습니다.
스냅샷을 임포트하고 게임 실행파일을 빌드하고 빌드를 Android에 스테이징/디플로이/실행하는 데 필요한 명령의 포괄적인 예시입니다.
ushell 명령
.zen importsnapshot \\myserver\myshare\CloudSnapshots\mystream\myproject\Android_ETC2\777\name-cloud.json
.build game android
.stage game android
.deploy game android
.run game android
본인의 타이틀이 클라이언트와 서버 런타임 실행파일을 분리한 빌드를 사용하는 경우, 위 명령은 게임 런타임 대신 클라이언트 런타임을 실행하도록 변경해야 합니다. 변경한 모습은 다음과 같습니다.
ushell 명령
.zen importsnapshot \\myserver\myshare\CloudSnapshots\mystream\myproject\Android_ETC2Client\777\name-cloud.json
.build client android
.stage client android
.deploy client android
.run client android