--- title: Perforce Helix Core搭建 date: 2022-12-21 14:51:55 excerpt: tags: Perforce rating: ⭐ --- # Perforce Docker 可以使用这个容器: https://hub.docker.com/r/sourcegraph/helix-p4d 但这个容器是2020年构建的,我这里重新调整了一下,并且手动构建成功,具体可以参考下文。 ## DockerFile构建 大致步骤如下: 1. 下载**blueroseslol/helix-docker**仓库的所有文件。 2. 构建DockerFile。 ```bash cd /home/perforce/helix-docker/helix-p4d/ && \ docker build -f /home/perforce/helix-docker/helix-p4d/Dockerfile -t helix-p4d:2024.5 . ``` docker build --file ./helix-p4d/Dockerfile --tag helix-p4d:2023.7 . ## 使用 ```shell docker run -d --name helix-p4d\ -p 1666:1666 \ -v /home/perforce/p4:/p4 \ helix-p4d:2024.5 ``` ```bash docker run -d \ -p 1666:1666 \ -v /home/perforce/p4:/p4 \ sourcegraph/helix-p4d:2020.2 ``` admin pass12349ers ### Github文档 ```shell docker run --rm \ --publish 1666:1666 \ sourcegraph/helix-p4d:2020.2 ``` 默认端口`:1666`, 默认用户名为 `admin`, 默认密码: `pass12349ers`。以下是所有配置的默认值。 ```shell NAME=perforce-server P4HOME=/p4 P4NAME=master P4TCP=1666 P4PORT=1666 P4USER=admin P4PASSWD=pass12349ers P4CASE=-C0 P4CHARSET=utf8 JNL_PREFIX=perforce-server ``` 可以使用`--env` 覆盖上述环境变量: ```shell docker run --rm \ --publish 1666:1666 \ --env P4USER=amy \ --env P4PASSWD=securepassword \ sourcegraph/helix-p4d:2020.2 ``` 请注意,尽管服务器在重启后仍能存活(即数据被保留),但如果你在初始启动后(即镜像的第一次运行,在选项被硬编码为Perforce Helix核心服务器自身配置时)改变选项,它可能会中断。要启动一个长期运行的生产容器,记得要把数据目录(`P4HOME`)容器,把`--rm`标志换成`d`(分离): ```shell docker run -d \ --publish 1666:1666 \ --env P4PASSWD=securepassword \ --volume ~/.helix-p4d-home:/p4 \ sourcegraph/helix-p4d:2020.2 ``` ### 启用SSL 首先生成自签名证书: ```shell mkdir ssl pushd ssl openssl genrsa -out privatekey.txt 2048 openssl req -new -key privatekey.txt -out certrequest.csr openssl x509 -req -days 365 -in certrequest.csr -signkey privatekey.txt -out certificate.txt rm certrequest.csr popd ``` 接下来设置SSL文件映射目录也就是`P4SSLDIR`的值,并且设置`P4PORT`使用SSL。 ```shell docker run --rm \ --publish 1666:1666 \ --env P4PORT=ssl:1666 \ --env P4SSLDIR=/ssl \ --volume ./ssl:/ssl \ sourcegraph/helix-p4d:2023.1 ``` ### 时间显示问题 1. 修改容器内系统时区。 2. 修改P4V时间显示,Edit - Preferences - Display - Show date andtime as,Server time => Local time。 ##### Docker容器修改时间 方法一:配置Dockerfile镜像时修改,这样打包出来的镜像文件是需要的时区的。 操作方式:Dockerfile中添加代码 ```bash # 在安装tzdata之前最好先update和upgrade,以防apt-get获取不到tzdata RUN apt-get update -y && apt-get upgrade -y # 安装,中国用户填写[Asia/Shanghai] ,表示亚洲/上海 ,东八区 RUN apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ``` 缺点:由于构建时需要更新ubuntu,所以需要需要网络支持,网络不好的时候拖累构建镜像的速度。亲测,在中国白天速度快,晚上慢。 **建议通过env进行指定**: ```bash ENV TZ=Asia/Shanghai RUN In -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ``` 方法二(强烈不推荐):在运行的容器中,进行修改 操作方式:docker attach 登录到运行的容器中执行如下代码 ```bash # 在安装tzdata之前最好先update和upgrade,以防apt-get获取不到tzdata apt-get update -y && apt-get upgrade -y # 安装 apt-get install -y tzdata # 配置 echo "Asia/Shanghai" > /etc/timezone # dpkg-reconfigure -f noninteractive tzdata 或者这个。 dpkg-reconfigure tzdata ``` 方法三:启动容器的时候进行设置 操作方式:启动命令中添加 挂载目录,例如: ```bash # 启动容器时挂载宿主机目录 docker run -v /etc/localtime:/etc/localtime:ro # 其中 -v 参数中ro代表只读模式(read only) # 如果您的项目中已经使用了-v 没有关系,启动时挂载多个目录只要写多个-v就可以 ``` 缺点:依赖于宿主机,一般生产环境宿主机都是linux,如果你也是Linux内核,推荐使用 ### 推送镜像到Dockerhub 登录 ```bash docker login # Github docker login ghcr.io -u 378100977@qq.com -p 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 ``` 推送 ```bash docker tag 5572f8b12de1 blueroses/perforce-helix-p4d:2024.5 docker push blueroses/perforce-helix-p4d:2024.5 # 登录github docker push ghcr.io/blueroses/perforce-helix-p4d:2024.5 ``` ## helix-proxy Docker Package: helix-proxy Priority: optional Section: non-free/vcs Installed-Size: 30 Maintainer: Perforce Software, Inc. Architecture: amd64 Source: perforce Version: 2024.1-2596294~focal # IDE设置 - VSCode - Settings - Extensions - Perforce - Client:工作区名称 - Dir:工作目录 - Password:密码 - Port:服务器ip与端口 - User:用户名 - Rider - Settings - Version Control - Perforce - 输入Server、User、Workspace、utf8 # Perforce ## 参考 - 官方文档 - https://www.perforce.com/manuals/p4guide/Content/P4Guide/Home-p4guide.html - https://help.perforce.com/helix-core/quickstart-unreal/Content/quickstart/game-home-quickstart.html - 知乎&UE官方文档 - https://docs.unrealengine.com/5.1/en-US/using-perforce-as-source-control-for-unreal-engine/ - [UE5 源码引擎构建&UGS部署与搭建](https://zhuanlan.zhihu.com/p/414193101?utm_id=0) - [UE4管理多重项目-WiseeEngineering](https://zhuanlan.zhihu.com/p/364346565) - [UnrealEnigne源码构建&Perforce&(UnrealGameSync)开发版本控制基础部署](https://zhuanlan.zhihu.com/p/362276094) - [打通UE4美术资源版本控制关节](https://zhuanlan.zhihu.com/p/261692804) - [UE5+Perforce+阿里云ECS版本控制搭建流程与工作流程](https://zhuanlan.zhihu.com/p/640743305) - 视频 - [ [英文直播]版本控制基础 | Version Control Fundamental(真实字幕组)](https://www.bilibili.com/video/BV1tp4y1C7f8/?spm_id_from=333.337.search-card.all.click&vd_source=d47c0bb42f9c72fd7d74562185cee290) - [配置管理软件Perforce代码版本管理中分支和标签应用示例—4.Local库的分支](https://www.bilibili.com/video/BV14z411b7VB/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290) - [配置管理软件Perforce代码版本管理中分支和标签应用示例—5.stream库的分支](https://www.bilibili.com/video/BV1xK41177W1/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290) - [P4V进阶教学自用——stream分支基本操作+文件resolve+分支制作](https://www.bilibili.com/video/BV1LC411z76w/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290) ### cmd - 设置默认服务器IP:`p4 set P4PORT=servername:port` - 设置默认用户名:`p4 set P4USER=your.username` - 设置typemap:`p4 -P YourPassword typemap` - 设置p4ignore - `p4 set P4IGNORE=.p4ignore` - `p4 ignores` - `p4 add -f ...`:add(add所有文件并且包含文件名含通配符的文件) - `p4 reconcile -aed`:检查所有增加/修改/删除的文件并且放到Pending Changelist - [p4 clean](https://www.perforce.com/manuals/cmdref/Content/CmdRef/p4_clean.html) - `p4 clean -a`:从工作区中删除没有add的文件。 - `p4 clean -n`:不执行任何操作即可预览操作结果。 - `p4 clean -i`:可清除ignore的文件。 ## 规划 ### 开发目录设计 - [UE4管理多重项目-WiseeEngineering(翻译)](https://zhuanlan.zhihu.com/p/364346565) - ArtSource(美术资源:引擎中相应的美术资产应该统一从ArtSource仓库导入,这样美术人员可以集中在标准资产管线下的资产迭代,可以更加集中注意力于美术资产质量,所以前提是项目初期必须构建标准稳定的渲染和审核验收流程(这一点也是国内很多项目及经常返工,开发成本极高的原因)) - Engine(引擎路径,这里我用于个人使用则不需要太多的分流) - Project(项目工程) Example: - e:\\Perforce - ArtSource - ShowRoom - UnrealEngine ### ASoul P4的设计 仓库: 1. Engine(Stream Depot) 1. 引擎源码 2. Project(Stream Depot) 1. 构建引擎。 2. 项目工程。 3. ArtSource(Local Depot) 1. 美术资产。 #### 分支 1. Release 2. Mainline 3. Development 1. UE4 2. UE5 3. Trunk分支(主干) 4. shiwan(线上分支) 1. shiwanxxx 2. shiwanpico 3. ... 使用最暴力的Mainland(主干)分支开发模式,如有试玩需求,会创建shiwan分支。 #### 用户 1. admin 2. art 3. director 4. ~~remote~~ (这个用户名无法登陆) 5. qa #### 权限管理 `//仓库名/分支/目录/...` 1. * 1. read://... 2. art: 1. write://Project/Development/LiveDirector/Content/... 3. director 1. write://Project/Development/LiveDirector/Content/... 4. qa 1. write://Project #### WorkSpace设置 1. 编码使用:UTF8-no bom 2. Connection–>Edit Current Workspace–>Advanced,设置为 1. Line ending characters for text file -> `UNIX style linefeed` 2. OnSubmit -> `Don't submit unchanged files` 3. 勾选 1. Allwrite 2. Clobbr 3. Altsync(直播棚不要勾这个) #### .p4ignore ```bash # Ignore IDE related files .vscode\ .vsconfig\ # Ignore project-specific files LiveDirector\Binaries\**\*.pdb LiveDirector\Binaries\**\*-Debug.* LiveDirector\Binaries\**\*-Shipping.* LiveDirector\Build\Receipts\* LiveDirector\DerivedDataCache\* LiveDirector\Intermediate\* LiveDirector\Plugins\**\Intermediate\* LiveDirector\Saved\* LiveDirector\*.sln LiveDirector\*.vcxproj LiveDirector\*.vs\ LiveDirector\*.idea\ LiveDirector\obj\ LiveDirector\**\FileOpenOrder\ Tools\VCluster\Binaries\**\*.pdb Tools\VCluster\Binaries\**\*-Debug.* Tools\VCluster\Binaries\**\*-Shipping.* Tools\VCluster\Build\Receipts\* Tools\VCluster\DerivedDataCache\* Tools\VCluster\Intermediate\* Tools\VCluster\Plugins\**\Intermediate\* Tools\VCluster\Saved\* Tools\VCluster\*.sln Tools\VCluster\*.vcxproj Tools\VCluster\*.vs\ Tools\VCluster\*.idea\ Tools\VCluster\obj\ Tools\VCluster\**\FileOpenOrder\ # Ignore Engine temporary files Engine\**\__pycache__\*.pyc # Ignore temporary files for Editor runs Engine\Engine\Intermediate\EditorRuns\ # Add back binary-distributed plugins !LiveDirector\Plugins\DirectorAssistanter\Intermediate\ # Ignore RiderLink LiveDirector\Plugins\Developer\RiderLink\ # Ingore LiveCoding(?) temporary files Engine\**\Intermediate\Build\**\*.h.old # Ignore UnrealInsights temporary files Engine\Engine\Programs\UnrealInsights\Saved\ Engine\Engine\Programs\UnrealInsights\Intermediate\ # Ignore Node.js moddules for RemoteControlWebInterface Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\**\node_modules\ Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\**\package.json Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\**\package-lock.json Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\WebApp\**\build\ Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\WebApp\Server\public\ # Ignore all Engine files. Engine\ # Ignore Ts History LiveDirector\ts_file_versions_info.json ``` ## 搭建p4顺序 1. 搭建Perforce服务 2. 创建一个Stream Depot或者所有Depot。 3. 设置 p4 typemap 4. 创建MainLine分支 5. 添加.p4ignore文件 6. 创建一个工作区,设置工作区设置后上传文件。 ## Typemap typemap 的设置能够在 Perforce 中控制文件的只读和可写的形式。 然后要做这件事情,需要管理员先在命令行cmd下设置 P4 的环境变量。 在指定仓库上右键,点击`Open Command Windows Here`,输入`p4 -P YourPassword typemap`即可在弹出的txt文件中修改保存关闭即可。(输入UE官方推荐的内容即可) ```text # The form data below was edited by Jeff # 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: text //....asp text //....cnf text //....css text //....htm text //....html text //....inc text //....js text //....ts text+w //....log text+w //....ini text+w //....pdm binary+Fl //....zip binary+Fl //....bz2 binary+Fl //....rar binary+Fl //....gz binary+Fl //....avi binary+Fl //....jpg binary+Fl //....jpeg binary+Fl //....mpg binary+Fl //....gif binary+Fl //....tif binary+Fl //....mov binary+Fl //....jar binary+l //....ico binary+l //....exp binary+l //....btr binary+l //....bmp binary+l //....doc binary+l //....dot binary+l //....xls binary+l //....ppt binary+l //....pdf binary+l //....tar binary+l //....exe binary+l //....dll binary+l //....lib binary+l //....bin binary+l //....class binary+l //....war binary+l //....ear binary+l //....so binary+l //....rpt binary+l //....cfm binary+l //....ma binary+l //....mb binary+l //....pac binary+l //....m4a binary+l //....mp4 binary+l //....aac binary+l //....wma binary+l //....docx binary+l //....pptx binary+l //....xlsx binary+l //....png binary+l //....raw binary+l //....odt binary+l //....ods binary+l //....odg binary+l //....odp binary+l //....otg binary+l //....ots binary+l //....ott binary+l //....psd binary+l //....sxw binary+S2w //....exe binary+S2w //....dll binary+S2w //....lib binary+S2w //....app binary+S2w //....dylib binary+S2w //....stub binary+S2w //....ipa binary //....bmp text //....ini text //....config text //....cpp text //....h text //....c text //....cs text //....m text //....mm text //....py binary+l //....uasset binary+l //....umap binary+l //....upk binary+l //....udk binary+w //....exe binary+w //....dll binary+w //....lib binary+w //....app binary+w //....dylib binary+w //....stub binary+w //....ipa binary //....bmp text //....ini text+w //....config text //....cpp text //....h text //....c text //....cs text //....m text //....mm text //....py binary+l //....uasset binary+l //....umap binary+l //....upk binary+l //....udk binary+l //....ubulk text //....ignore ``` ## 相关概念 ### Workspace - 官方工作区文档:https://www.perforce.com/manuals/p4guide/Content/P4Guide/configuration.workspace.options.html Workspace可以理解为,depot到本地的一个映射,对应本地的一个目录,**存储了该工作区域的相关设置以及历史记录**。 新建Workspace,在p4admin中depot查看在服务器中存放的所有Ddepot仓库 开发的过程中可以有多个Workspace(例如一个用来开发,一个用来更新验证保证提交没有错误),但一般只推荐有一个Workspace。 ### WorkspaceView - 官方工作区文档:https://www.perforce.com/manuals/p4guide/Content/P4Guide/configuration.workspace_view.html PS. 非流用户可以通过以下方式更新客户端工作区视图 1. 调用 **[p4 client](https://www.perforce.com/manuals/cmdref/Content/CmdRef/p4_client.html)** 命令,打开客户端规范。 2. 编辑 **View:** 客户端规范中的字段。 ### AltSync 这是一种2024.1推出的新的同步技术,允许您减少从库同步到客户端工作区时的初始等待时间,从而加快工作速度。您可以节省时间、磁盘空间和网络带宽,因为您只在需要时下载所需的内容。相关文档: - 文档: - https://www.perforce.com/manuals/p4vfs/Content/P4VFS/p4vfs-intro.html - https://www.perforce.com/manuals/p4vfs/Content/P4VFS/p4vfs-and-p4v.html - p4vfs(需要额外安装) - https://www.perforce.com/downloads/helix-core-virtual-file-service ### P4ExcludeList ### .p4ignore 创建`.p4ignore`文件后,执行命令行设置ignore ```bash p4 set P4IGNORE=.p4ignore p4 ignores ``` ```text # Ignore project files in the root *.sln !*\*.sln .vs *.suo *.opensdf *.sdf *.pdb *-Debug.dll *.xcodeproj .\Makefile .\CMakeLists.txt .\.ue4dependencies ipch\* # Packaged engine builds LocalBuilds\* # DDC should never be checked in Engine\DerivedDataCache\* Templates\**\DerivedDataCache\* # Engine intermediates & binaries Engine\Intermediate\* Engine\Plugins\**\Intermediate\* Engine\Programs\**\Intermediate\* Engine\Binaries* Engine\Plugins\**\Binaries\* # Feature Packs (they might get updated with langauge packs?) FeaturePacks\* # Samples & Templates Templates\**\Intermediate\* Templates\**\Saved\* Samples\**\Intermediate\* # C# Intermediate folders Engine\Source\Programs\**\obj\* Engine\Platforms\**\Programs\**\obj\* # Saved folders for programs should not be checked in Engine\Programs\**\Saved\* Engine\Programs\UnrealBuildTool\* # Ignore any saved local files Engine\Saved\* # Ignore any build receipts Engine\Build\Receipts\* # Ignore Unix backup files *~ # Ignore Mac desktop services store files .DS_Store # Ignore crash reports crashinfo--* # Ignore linux project files *.user *.pro *.pri *.kdev4 # # Setup.bat Ignores # # There already might be some files pushed into the repo that would otherwise be # filtered: those are from the initial commit, coming directly from UE4-GitHub. # After running Setup.bat, the folders below will be populated with ~46GB of # files. Hence we'll be blanked ignoring some directories such as ThirdParty, # Media, Content, etc. If we want to change anything in those blanked-ignored # folders, we should unignore the specific thing we're adding. # .git\* Samples\**\Content\* Samples\**\Media\* Templates\**\Content\* Templates\**\Media\* Templates\Media\* Engine\Platforms\**\Content\* Engine\Documentation\* Engine\Extras\* Engine\Content\* Engine\Build\* Engine\Source\ThirdParty\* Engine\Source\Programs\* Engine\Source\Developer\* Engine\Plugins\* # Specific files Engine\Config\ShaderCategories.csv .tgitconfig .ue4dependencies # After all this above, there's still a couple folders and files left that doesn't # fit the filtering criteria above, so we handle them individually here. Engine\Source\Runtime\Navmesh\RecastDemo* Engine\Source\Runtime\Launch\Resources\Mac* Engine\Source\Runtime\Launch\Resources\Linux* Engine\Source\Runtime\Experimental\Voronoi\Private\voro++* Engine\Source\Runtime\Apple\MetalRHI\Public\ue4_stdlib.metal Engine\Source\Runtime\AVEncoder\Private\Microsoft\Windows\ThirdParty\NvEncoder\LicenseAgreement.pdf Engine\Source\Runtime\Experimental\Chaos\.clang-format Engine\Source\Runtime\TraceLog\Private\Trace\LZ4\Epic.patch Templates\TemplateResources\Standard\*.FBX # # PLUGINS # # Plugins that come with Setup.bat are ignored above altogether, so we un-ignore # the custom plugins we want to ship with the customized UE4. !Engine\Plugins\Marketplace* !Engine\Plugins\Runtime\HoudiniEngine* # ... but keep ignoring their Build & Intermediate Engine\Plugins\Marketplace\**\Intermediate\* Engine\Plugins\Marketplace\**\Binaries\* Engine\Plugins\Runtime\**\Intermediate\* Engine\Plugins\Runtime\**\Binaries\* # # PackageEngine.bat Ignores # # Packaging the engine will generate some .ini files which are safe to ignore # Samples\**\Saved\* ``` ## Helix4Git - 官方文档 - https://www.perforce.com/manuals//helix-for-git/Content/Helix4Git/install-config.install.html - https://www.perforce.com/manuals//helix-for-git/Content/Helix4Git/install-config.config.html - 代理商知乎 - https://zhuanlan.zhihu.com/p/545765248 DockerFile搞起来太麻烦…… # Perforce Proxy - 官方文档 - https://www.perforce.com/manuals/p4dist/Content/P4Dist/chapter.proxy.html 一种用于同步主Perforce服务器数据的远程服务器。适合远程的分布式协作。 # 其他 ## 注册源码引擎到EpicGames 经过上面的步骤,源码引擎已经构建成功,但是在对项目就行选择引擎版本的时候,发现并没有这个版本 。这是因为,构建的引擎没有注册到EpicGames中,找到EpicGames安装目录下的注册器。复制到源码工程并且运行即可。 ```text Launcher\Engine\Binaries\Win64\UnrealVersionSelector.exe ```