CI/CD로도 알려진 빌드 자동화(Build Automation) 는 에픽게임즈에서 호드(Horde)를 대상으로 한 최초 사용 사례이자 가장 발전된 사용 사례였습니다.
빌드 자동화는 BuildGraph를 1급 객체로 지원하여, 에이전트 간 중간 빌드 아티팩트의 자동 트래킹과 전송을 통해 효율적으로 배포 및 병렬화된 빌드 파이프라인을 스크립팅할 수 있도록 설계되었습니다.
빌드 자동화는 다음 기능도 지원합니다.
- 빌드 상태
- Perforce 메타데이터 캐싱, 워크스페이스 관리
- 작업 큐 기반 자동 확장 지원
- 추가 메타데이터 주석이 자동으로 달린 다수의 일반 UE 타입으로 구조화된 로깅 지원
- 프로파일링 및 원격 측정 기능
CI는 계산량이 많은 워크로드를 여러 에이전트 간에 분산하는 호드의 원격 실행 기능, 그리고 캐시된 중간 및 최종 아티팩트를 아카이브에 보관하고 얻는 스토리지 기능과 함께 작동합니다.
BuildGraph
BuildGraph는 빌드 파이프라인을 파라미터화된 그래프로 묘사합니다. 그래프의 각 노드는 일련의 입력(다른 노드에 의해 생성된 파일 형식)에 대해 순차적인 작업 세트를 수행하고 일련의 출력(파일 세트 형식)을 생성합니다. 하나 이상의 노드는 동기화된 Perforce 워크스페이스를 통해 에이전트에서 순차적으로 실행됩니다.
호드에서 작업 실행 시 BuildGraph 스크립트, BuildGraph 스크립트에 전달할 명령줄 실행인자, 평가할 하나 이상의 노드 이름을 지정합니다. 호드는 머신 프로비저닝, Perforce에서의 동기화, 임시 스토리지로의 입력 및 출력 전송을 관리합니다.
CI 기능 활성화하기
호드에서 CI 기능을 활성화하려면 다음 단계를 수행해야 합니다.
- BuildGraph 스크립트를 작성하여 소스 컨트롤에 제출합니다.
*.project.json환경설정 파일이 포함된Globals.json파일에서 프로젝트를 정의합니다.*.stream.json환경설정 파일이 포함된.project.json파일에서 스트림을 정의합니다.- BuildGraph 스크립트에서 단계를 실행할 수 있는 머신을 정의하는
에이전트 타입을 선언합니다. - BuildGraph 스크립트의 파라미터를 정의하고 소스 컨트롤에서 참조하는
작업 템플릿을 선언합니다.
참고: 퀵스타트 - 빌드 자동화
에이전트 타입
에이전트 타입은 BuildGraph 스크립트에 지정된 이름을 고려하여 특정 타입의 작업을 실행하고자 하는 머신을 지정합니다. 이 인디렉션 레이어는 여러 스트림에서 동일한 BuildGraph 스크립트를 실행하거나 서로 다른 프로젝트에서 실행할 동일한 BuildGraph 스크립트를 파라미터화할 때 유용합니다.
관리의 용이성을 위해 일반적으로 에이전트는 에이전트 타입 정의에 포함될 스태틱 또는 다이내믹 풀로 그룹화됩니다. 에이전트 타입은 또한 작업을 실행하기 위해 머신에서 어떤 파일을 동기화해야 하는지 지정하는 워크스페이스를 참조할 수 있습니다. 특정 스트림에서 사용할 용도로 환경설정된 에이전트는 필요시 보다 빨리 작업을 제공할 수 있도록 해당 스트림에서 데이터의 '핫' 싱크를 유지하므로, 동기화할 파일을 필터링하면 디스크 공간을 줄이고 머신별 워크스페이스의 고밀도 패킹이 가능합니다.
에이전트 타입 환경설정에 대한 자세한 내용은 .stream.json 레퍼런스를 참고하세요.
작업 템플릿
작업 템플릿은 작업 실행에 필요한 파라미터와 기본 실행인자, 그리고 호드 대시보드에서 이러한 파라미터를 사용자에게 표시하는 데 사용할 수 있는 위젯을 설명합니다. 일반적인 템플릿은 다음과 같습니다.
{
"id": "editor-only",
"name": "Editor Only",
"arguments": [
"-Target=Editor Only",
"-Script=Engine/Restricted/NotForLicensees/Build/DevStreams.xml"
],
"parameters": [
{
"type": "List",
"style": "List",
"label": "Toolchain Versions",
"items": [
{
"text": "Latest",
"argumentIfEnabled": "-set:WithLatest=true",
"argumentIfDisabled": "-set:WithLatest=false",
"default": true
},
{
"text": "Preview",
"argumentIfEnabled": "-set:WithPreview=true",
"argumentIfDisabled": "-set:WithPreview=false",
"default": true
},
{
"text": "Clang",
"argumentIfEnabled": "-set:WithClang=true",
"argumentIfDisabled": "-set:WithClang=false",
"default": true
}
]
}
]
}
parameters 블록에서 다양한 위젯 타입을 지정할 수 있습니다. 아래 스크린샷과 환경설정 인용부는 튜토리얼의 파라미터 데모 작업 타입에서 가져왔습니다.
텍스트 파라미터
유효성 검사를 위한 선택적 정규 표현식으로 실행인자에 임의 텍스트를 입력할 수 있습니다.
{
"type": "Text",
"label": "Text Parameter",
"argument": "-set:TextParameter=",
"default": "",
"validation": "[a-zA-Z0-9_]+",
"validationError": "Should be a sequence of alphanumeric characters",
"hint": "Enter a string of alphanumeric characters",
"toolTip": "Tooltip for text parameter"
}
유효한 프로퍼티는 TextParameterData를 참고하세요.
리스트 파라미터
사용자가 사전 정의된 목록에서 하나 이상의 옵션을 선택할 수 있습니다.
{
"type": "List",
"label": "List Parameter (Default Style)",
"toolTip": "Tooltip for list parameter",
"items": [
{
"text": "Option 1",
"argumentIfEnabled": "-set:ListParameter=Option1"
},
{
"text": "Option 2",
"argumentIfEnabled": "-set:ListParameter=Option2",
"default": true
},
{
"text": "Option 3",
"argumentIfEnabled": "-set:ListParameter=Option3"
}
]
}
유효한 프로퍼티는 ListParameterData를 참고하세요.
멀티 리스트 파라미터
멀티 리스트 파라미터는 일반적인 목록으로 생성되지만, Style 프로퍼티가 MultiList 로 설정되어 있습니다. 드롭다운 목록에서 항목에 체크하여 여러 옵션을 지정할 수 있습니다. 목록 항목의 Group 프로퍼티는 아래에 항목을 그룹화할 헤딩을 지정합니다.
{
"type": "List",
"style": "MultiList",
"label": "List Parameter (MultiList Style)",
"toolTip": "Tooltip for list parameter (MultiList)",
"items": [
{
"group": "First group",
"text": "Option 1",
"argumentIfEnabled": "-set:MultiListOption1=true",
"default": true
},
{
"group": "First group",
"text": "Option 2",
"argumentIfEnabled": "-set:MultiListOption2=true"
},
{
"group": "Second group",
"text": "Option 3",
"argumentIfEnabled": "-set:MultiListOption3=true",
"default": true
},
{
"group": "Second group",
"text": "Option 4",
"argumentIfEnabled": "-set:MultiListOption4=true"
}
]
},
유효한 프로퍼티는 ListParameterData를 참고하세요.
태그 피커 파라미터
태그 피커 파라미터는 멀티 리스트 파라미터와 비슷하지만, 항목 선택을 활성화할 때 목록에서 선택하는 것이 아니라 몇 개의 문자를 입력합니다.
{
"type": "List",
"style": "TagPicker",
"label": "List Parameter (TagPicker Style)",
"toolTip": "Tooltip for list parameter (TagPicker)",
"items": [
{
"text": "Option 1",
"argumentIfEnabled": "-set:TagPickerOption1=true",
"default": true
},
{
"text": "Option 2",
"argumentIfEnabled": "-set:TagPickerOption2=true"
},
{
"text": "Option 3",
"argumentIfEnabled": "-set:TagPickerOption3=true",
"default": true
},
{
"text": "Option 4",
"argumentIfEnabled": "-set:TagPickerOption4=true"
}
]
}
부울 파라미터
옵션을 활성화할지 또는 비활성화할지 여부를 토글할 수 있습니다.
{
"type": "Bool",
"label": "Bool Parameter",
"toolTip": "Tooltip for bool parameter",
"argumentIfEnabled": "-set:BoolParameter=true",
"argumentIfDisabled": "-set:BoolParameter=false"
}
유효한 프로퍼티는 BoolParameterData를 참고하세요.
예약
템플릿을 사용하여 자동으로 트리거할 예약 및 정책도 지정할 수 있습니다. 예를 들면 변경사항이 제출될 때마다, 마지막 n 이 변경될 때 또는 특정 파일이 수정될 때마다 실행할 수 있습니다. 자세한 내용은 환경설정 레퍼런스의 ScheduleConfig 섹션을 참고하세요.
워크스페이스
워크스페이스 정의는 작업을 실행하기 위해 소스 컨트롤에서 어떤 데이터를 어떻게 동기화할지 에이전트에 알려줍니다.
view 프로퍼티는 스트림 뷰에 적용할 추가 필터 세트로 스트림 정의를 구체화하며, 여기에는 표준 Perforce 구문에서 지정된 와일드카드가 사용됩니다.
incremental 프로퍼티는 증분 워크스페이스를 정의합니다. 기본적으로 호드는 작업을 실행하기 전에 아무런 수정도 하지 않은 깨끗한 상태로 워크스페이스를 되돌립니다. 이 플래그가 설정된 경우 트래킹된 파일이 깨끗한 상태로 다시 동기화되지만(즉, 타임스탬프로 결정된 수정된 파일이 원본 버전으로 리셋됨), 워크스페이스의 다른 파일은 그대로 사용됩니다. 이를 통해 툴의 종속성 트래킹이 파일을 리빌드해야 하는지 여부를 결정하기에 충분히 강력한 경우 컴파일 아티팩트와 같은 중간 상태를 유지할 수 있습니다.
AutoSDK
AutoSDK 시스템은 타깃 플랫폼 SDK를 배포하고, 엔진에서 온디맨드로 사용하는 용도로 환경설정하기 위한 메커니즘을 제공합니다. 이 시스템은 빌드 에이전트에 필요한 수동 환경설정의 양을 감소시키므로 빌드 팜에서 여러 코드 줄을 관리할 때 특히 유용합니다.
AutoSDK 저장소 생성에 대한 자세한 내용은 언리얼 엔진 소스 트리에서 Engine/Extras/AutoSDK 아래의 문서를 참고하세요.
AutoSDK는 globals.json 파일의 perforceClusters 섹션에서 호드용으로 환경설정할 수 있습니다. 에이전트의 프로퍼티 일치에 따라 다음과 같이 다양한 AutoSDK 스트림을 지정할 수 있습니다.
"autoSdk": [
{
"properties": [ "OSFamily=Windows" ],
"stream": "//UE5/Private-AutoSDK-Windows"
},
{
"properties": [ "OSFamily=MacOS" ],
"stream": "//UE5/Private-AutoSDK-Mac"
},
{
"properties": [ "OSFamily=Linux" ],
"stream": "//UE5/Private-AutoSDK-Linux"
}
]