[Docker] Perforce를 Docker 컨테이너로 관리해보자

Park Yeongseo·2023년 9월 18일
0

Docker

목록 보기
2/2
post-thumbnail

1. Overview (링크)

[1] 기본적인 버전 컨트롤 Workflow

  1. 특정 레포지토리에 에셋이 있다.
  2. 에셋에는 유저들이 이를 읽거나 수정하기 위한 권한이 주어져 있다.
  3. 한 권한 있는 유저가 애셋을 로컬로 복사해 수정 작업을 하고,
  4. 다른 한 유저도 마찬가지로 해당 에셋을 복사해서 작업했다고 하자.
  5. 첫 유저가 로컬 작업 복사본을 체크 인 했을 때,
  6. 다른 유저도 해당 에셋에 대해 작업을 하고 복사본을 check in하려고 하면 버전 컨트롤 시스템은 두 번째 유저에게 해당 파일이 이미 첫 번째 유저에 의해 수정된 것임을 알려야 한다. (Conflict를 resolve할 수 있게)

버전 관리 시스템은 중앙 집중형이거나 분산형이다. Helix Server는 이 둘을 모두 지원하고, 둘이 섞인 방식도 지원한다.

[2] Helix Server as a version control implementation

Helix 서버는 버전 컨트롤 관리를 구현하기 위해 클라이언트-서버 구조를 사용한다.

(1) Helix Server (Helix Core Server, p4d)

Helix 서버는 공유 파일 레포지토리, 혹은 디포를 관리한다. 이 디포에는 버전 관리 대상이 되는 모든 각 파일들의 수정 내역이 포함되어 있다. 파일들은 디렉토리 트리로 조직되어있다. 이 서버는 또한 파일들과, 혹은 클라이언트의 활동과 연관된 데이터들을 추적하기 위한 DB도 가지고 있다. (예. logs, user permissions, metadata, configuration values 등)

(2) Helix Server Client

Helix 서버 클라이언트는 파일을 디포로부터 check in/out하거나, 충돌을 resolve하거나 하는 등의 작업들을 하기 위한 인터페이스를 제공한다. 여기에는 CLI client(p4)와 GUI client(p4v)가 포함돼있다.

디포에 있는 레포지토리들은 유저의 워크스페이스에 있는 레포지토리에 매핑되고, 유저는 워크스페이스에 있는 파일들로 작업한다.

🐍 Depot : Workspace = Remote : Local

  1. 디포에 있는 파일들을 유저 워크스페이스로 체크 아웃
  2. 파일 수정
  3. 수정된 파일을 디포로 체크 인
  4. 만약 충돌 발생하면 resolve해야 함

파일들을 체크 인-아웃하기 위해서는 Changelist를 사용한다. Changelist는 적어도 하나의 파일들을 포함하고, 수 만 개의 파일들을 포함할 수도 한다. 이 Changelist는 번호 매겨져서 디포 내용의 모든 변화들을 추적할 수 있게 한다.

[3] Multiple user access to a set of files

Helix Server는 다음의 두 방법으로 여러 사용자들이 같은 프로젝트에 대해 동시에 작업할 수 있도록 한다.

  • File Locking : 한 명이 작업하고 있는 파일이 있으면 락을 걸어서 다른 유저들이 수정하는 것을 막을 수 있다.
  • Branching and Merging : 브랜칭, 머징해서 여러 유저들이 같은 파일을 동시에 수정할 수 있다.

2. Helix Core Server Administrator (링크)

[1] Helix Core 설치

  1. Helix Core 설치 (링크)
  2. 설치 후에는 여기에 따라 초기 설정 (서비스 명, root 디렉토리 명, 포트, 슈퍼 유저 이름과 비밀번호 등)

3. Helix Server Client

Helix Server Client에는 CLI(p4), GUI(p4v)가 있음.

[1] 설치 및 접속 (설치 링크)

(1) p4v 연결

설치한 p4v를 열면 연결하는 창이 뜬다. 혹은 위쪽에서 Connection - Open Connection을 눌러 연결해주면 된다.

[2] 사용법

(1) p4

(2) p4v

  • 아래 5.Perforce + Unreal 연동에서 다룹니다.

4. Helix4Git & Git Connector (공식문서)

[1] Helix4Git?

(1) Architecture & Components

Helix4Git은 두 컴포넌트들로 이뤄져 있다.

  • Helix Server(p4d)
  • Git Connector : Git 클라이언트에게 Git 서버 역할을 함

Git 사용자는 디포에서 파일들을 가져와 수정하고 푸시하기 위해서 Git 클라이언트를 사용하고, Git 클라이언트는 Git Connector를 통해 Helix Server와 소통한다.

(2) Typical Scenario

  1. Git 사용자는 Git Connector로 수정 사항을 푸시
  2. Git Connector는 수정 사항을 Helix Server로 푸시
  3. CI 서버 (e.g. P4Jenkins)는 수정 사항을 탐지하고 한 워크스페이스를 이용해서 빌드

[2] 설치 및 설정

(1) 설치 (설치 링크)

(2) 설정 (설정 링크)

(3) Git Connector에 맞게 Helix Server 설정하기 (링크)

[3] 사용법

graph 타입의 디포 repo를 만들어서 사용한다.

만약 다른 graph depot를 만드려면 gconn-user에게 admin 권한을 줘야 한다.

(1) Git User의 Git Connector 설정 (링크)

(2) Push, Clone, Pull 하기 (링크)

[4] ⭐ 미러링 (공식문서)

Helix4Git은 GitHub, GitLab 등의 Git 서버로의 커밋을 Helix Core 서버로 복제할 수 있다.

젠킨스 등의 CI tool을 하나만 이용해서 빌드하기 위해서 필요함.

웹 훅을 이용해서 해당 깃 서버로 커밋이 발생하면 Git Connector가 이 웹 훅 메시지를 받아서, 다시 Helix Core 서버로 보내주는 방식

[깃랩 기준]

1. sudo su git 으로 로그인
2. export GCONN_CONFIG=/opt/perforce/git-connector/gconn.conf 환경 변수 설정
3. gconn --mirrorhooks add graphDepotName/repoName 
		https://access-token:secret@GitHost.com/project/repoName.git
4. 3의 결과로 얻을 수 있는 Webhook URL, Webhook secret token을 복사
5. 깃랩 레포-Settings-Webhooks에 주소/{Webhook URL}, Webhook secret token 입력
6. 아래에서 알아서 설정. SSL 활성화.
7. 웹 훅 생성

⇒ 깃 레포지토리에 코드 올리면 웹 훅으로 Helix Core 서버로 보내고, Helix Core에서 Jenkins로 CI를 한다.


5. Perforce + Unreal 연동

[1] 관련 문서

[2] UE5 공식 문서 정리 및 세팅 (위 관련 문서(2))

Perforce를 이용하면 에셋과 코드를 다른 팀원들과 공유할 수 있고, 백업 및 수정 내역을 저장해 어떤 파일에 오류가 발생했을 때 이전 버전으로 롤 백 할 수 있다.

(1) 세팅 - P4 TypeMap

디포에 파일들을 올리기 전에 반드시 P4 TypeMap을 설정해서 Perforce가 Unreal의 파일들을 어떻게 대해야 할지를 명시해줘야 한다. 이렇게 하려면 우선 명령 프롬프트를 열어서 p4 환경 변수들을 설정해줘야 한다.

p4 set P4USER=your.username
p4 set P4PORT=localhost:1666

p4 -P YourPassword typemap
    # Perforce File Type Mapping Specifications.
    #
    #  TypeMap:             a list of filetype mappings; one per line.
    #                       Each line has two elements:
    #
    #                       Filetype: The filetype to use on 'p4 add'.
    #
    #                       Path:     File pattern which will use this filetype.
    #
    # See 'p4 help typemap' for more information.

    TypeMap:
                    binary+w //depot/....exe
                    binary+w //depot/....dll
                    binary+w //depot/....lib
                    binary+w //depot/....app
                    binary+w //depot/....dylib
                    binary+w //depot/....stub
                    binary+w //depot/....ipa
                    binary //depot/....bmp
                    text //depot/....ini
                    text //depot/....config
                    text //depot/....cpp
                    text //depot/....h
                    text //depot/....c
                    text //depot/....cs
                    text //depot/....m
                    text //depot/....mm
                    text //depot/....py
                    binary+l //depot/....uasset
                    binary+l //depot/....umap
                    binary+l //depot/....upk
                    binary+l //depot/....udk
                    binary+l //depot/....ubulk

🐍 EC2에 들어가서 default로 있는 typemap 뒤 쪽에 추가해줬습니다.

(2) 세팅 - 프로젝트를 Perforce에 올리기

만들어진 워크스페이스에 depot 폴더를 만들고 언리얼 프로젝트 폴더를 싹 다 복붙한다.

  1. 초록색으로 칠해진 것들은 반드시 퍼포스 depot에 들어가야 하고, Binaries 폴더는 선택적입니다.

It is not required if every team member is going to compile their editor/game themselves, but should be included in the initial add if any team members will just be grabbing a version from the depot to create content.

  1. 위의 폴더들을 선택하고 오른쪽 클릭 후 Mark for Add를 눌러 change list에 추가해줍니다.

change list에 추가할 때에는 default가 아니라 new를 쓰고, 세부적인 내용들을 써주세요

  1. 파일들이 change list에 추가되면 오른쪽의 Pending에서 현재 추가된 파일들을 볼 수 있습니다.
  2. 변경된 파일 내역을 Perforce에 제출하려면 Submit을 클릭하면 됩니다.

🐍 위는 Perforce에 UE 프로젝트를 처음 올려 구성할 때에 씁니다. 이 프로젝트에서는 한 명이 전체적인 프로젝트를 한 번 올리고 나서는 모두 한 디포를 공용으로 쓰게 될 것이므로 위 작업은 한 번만 하면 됩니다.

(3) 언리얼 엔진과의 연동

  1. 프로젝트를 열고 나면 오른쪽 아래에서 리비전 컨트롤을 찾을 수 있습니다.
  2. 리비전 컨트롤을 눌러 리비전 컨트롤 세팅 변경을 클릭하면 다음과 같은 창이 뜹니다
  3. 서버와 사용자명, 워크스페이스를 입력하고 세팅 수락을 누르면 끝입니다.

[3] Workflow (관련 영상)

⚠️설명은 영상으로 대체하겠습니다

(1) Remind

🐍 Depot : Workspace = Remote : Local

(2) Lock

For this reason, when working on a file the Editor will lock that file (this is known as Checking Out in Perforce nomenclature) so that other users cannot concurrently edit it. When the user is done with editing the file(s) they have locked, they check in, or commit those files, uploading the changes to the server and releasing the lock on the file.
(위 공식 문서 (2)에 적혀있습니다)

따로 Lock 혹은 Checkout 할 필요 없이 언리얼 에디터에서 변경하면 자동으로 check out돼서 다른 사용자들은 건드릴 수 없게 됩니다.
매일 프로젝트를 진행하기 전 어떤 걸 수정하게 될 것인지 서로 공유하고 동시에 건드리지 않도록 하면 될 듯합니다.

(3) Branching (공식 문서)

  1. 소스 폴더나 파일을 선택하고 오른쪽 클릭해서 Branch Files를 선택하면 Branch창이 뜹니다
  2. Choose target files/folders 필드에서 어떤 브랜치를 만들지를 명시합니다.
    1. 만약에 이미 있는 브랜치를 입력하면 branching이 아니라 merging이 됩니다.
  3. 옵션을 설정하고 Branch를 클릭합니다.
  4. auto-submit 옵션을 선택한 경우에는 pending changelist에서 바로바로 submit됩니다.
    1. Add files to pending changelist를 선택하면, 준비되었을 때 수동으로 submit할 수 있습니다.

(4) Resolving (공식 문서)

🐍자동으로 check out이 돼서 conflict가 일어나는 경우는 적을 것 같지만, 만약 conflict가 발생하면 위 공식 문서를 읽으시고 처리하시면 될 것 같습니다.


6 CI/CD

[1] Perforce + Docker (관련 문서)

Why Use Docker with Helix Core?

  • The basic performance of p4d within a Docker container is very similar to outside a container when it comes to read/write of underlying db.* metadata files (from a directory shared with the host).
  • When using basic Docker network forwarding (from outside the container to the p4d inside the container), there can be a significant performance degradation, around 2x, which is due to the docker-proxy process (and not unexpected). An unexpected result, however, is that running the Docker container with “--net=host” (which uses host system network stack) does not significantly improve the performance.

🐍 docker compose Compose V2를 사용해 커맨드를 docker-compose 대신 docker compose 로 사용했습니다.

[2] 😖 주의!!!

Helix Core Server의 depot는 저장소 역할을 해야합니다. 따로 EC2의 호스트의 스토리지에 연결해주지 않으면 컨테이너와 이미지가 내려갔을 때 저장된 모든 데이터가 날아가게 됩니다.
반드시 연결해줍시다!

[3] 도커로 올려 봅시다(링크)

(1) Dockerfile

#Dockerfile
FROM ubuntu:focal

# Update our main system

RUN apt-get update
RUN apt-get dist-upgrade -y

# Get some dependencies for adding apt repositories

RUN apt-get install -y wget gnupg

# Add perforce repo

RUN wget -qO - https://package.perforce.com/perforce.pubkey | apt-key add -
RUN echo 'deb http://package.perforce.com/apt/ubuntu focal release' > /etc/apt/sources.list.d/perforce.list
RUN apt-get update

# Actually install it

RUN apt-get install -y helix-p4d
# RUN apt-get install -y helix-git-connector 

# Go into our directory, start Perforce, and view the log outputs

CMD chown -R perforce:perforce /perforce-data && cd /dbs && p4dctl start master && tail -F /perforce-data/logs/log

(2) docker-compose.yml

# docker-compose.yml
services:
  perforce:
    build: .
    restart: unless-stopped
    volumes:
      - ./p4dctl.conf.d:/etc/perforce/p4dctl.conf.d
      - ./perforce-data:/perforce-data
      - ./dbs:/dbs
    environment:
      - P4PORT=1666
      - P4ROOT=/perforce-data
    ports:
      - {사용할 호스트 포트}:1666

(3) 순서

  1. docker-compose.yml에서 - ./p4dctl.conf.d:/etc/perforce/p4dctl.conf.d 를 우선 주석 처리해야 한다.
    • 설정 파일을 만들기 위함(이라 함)
    • mkdir p4dtcl.conf.d mkdir perforce-data mkdir dbs로 컨테이너에 바인드 마운트 될 디렉토리를 만들어 준다.
    • docker compose run -T --rm perforce tar czf - -C /etc/perforce/p4dctl.conf.d . | tar xvzf - -C p4dctl.conf.d/
      • helix-p4d패키지를 설치하면 /etc/perforce/p4dctl.conf.dREADMEp4d.template파일이 생긴다.
      • 근데 gzip 형식이 아니라는 에러가 뜨면서 이미지만 생길 수도 있다. 이때는 위 docker compose run...를 다시 입력하면 p4dctl.conf.d에 위 두 파일이 생김을 확인할 수 있다.
    • docker images로 도커 이미지를 확인
      • 만약 위에서 만든 이미지 perforce/perforce 가 남아있으면 삭제 (docker rmi <컨테이너 아이디>)
  2. docker-compose.yml에서 주석을 해제
    1. 이제 진짜 Helix Core Server 설정
    2. docker compose run --rm perforce /opt/perforce/sbin/configure-helix-p4d.sh
      • /opt/perforce/sbin/configure-helix-p4d.sh는 Helix Core에서 서버 설정을 위해 사용하던 쉘 파일이다. (2 - [1] -(2) 확인)
      • 서버 이름은 master, 서버 root은 /perforce-data로 설정. 포트는 1666
      • 슈퍼 유저 명과 패스워드를 지정해 줄 수도 있습니다.
  3. docker compose up --build -d
    1. Helix Core Server 실행

(4) p4 Typemap 설정

  1. docker exec -it {컨테이너 id} /bin/bash로 위에서 올려놓은 도커 컨테이너에 들어가기
  2. p4 Typemap 설정은 위 5에서 한 것과 마찬가지로 하면 됩니다.

(5) 접속

외부에서는 마찬가지로 {호스트명}:{포트 번호}로 접속하면 됩니다.


❓의문점 정리

[1] 5인 이상인 팀인데 퍼포스 무료 버전을 쓸 수 있을까?

유저는 5개 이하로 이용하고 워크스페이스를 따로 쓰는 방식으로 사용하면 된다고 함.
⇒ 단 이 경우에는 서로 충돌 안 나게 잘 조정해야 할 것 같음

0개의 댓글