资产构建CI
全库目录221
本文目录7
构建机拿到的是LFS指针,导入器仍可能报文件损坏。资产CI先确认真实输入和工具版本,再按依赖执行验证、构建与发布。缓存键包括源、配置和依赖,才能让增量结果与干净构建一致。
资产 CI
一次资产变更可执行:
- 检出正确 Commit/Changelist 和 LFS/Depot 内容;
- 恢复锁定的工具与依赖版本;
- 计算受影响资产;
- 运行验证器/导入器/Cook;
- 比较预算、引用和 Golden Result;
- 发布 Report、产物和清单;
- 失败时阻止合入或发布。
CI 要使用专用服务账号,最小权限,并处理 DCC 与引擎许可。不要把个人账号和 Token 写进脚本。
缓存
DCC 转换、纹理压缩、着色器编译和 Cook 都昂贵。缓存键应包含源内容哈希、设置、工具版本、Platform 和依赖。
缓存命中结果仍要验证元数据。错误缓存键会复用过期产物,比没有缓存更难查。
缓存应有容量、淘汰、命中率和污染恢复策略。CI 日志记录缓存命中与未命中及耗时,才能判断收益。
变更范围与依赖
只检查本次直接修改文件可能漏掉下游。纹理改变会影响材质、Prefab、关卡和资源包。需要资产依赖图或导入数据库计算受影响集合。
全库检查最可靠但反馈慢。实践中:
- Pre-submit 检查直接资产和关键反向依赖;
- 合并检查构建受影响资源包/场景;
- 夜间任务做全库 Cook 与预算扫描;
- 发布做目标平台完整构建。
CI 中检查 LFS 指针
大型二进制文件应在仓库中保存为 LFS 指针。下面的 Bash 机制片段检查暂存区中常见大型资产是否具有 LFS 指针首行。-z 与 read -d '' 用 NUL 分隔文件名,保留中文、空格和换行;pipefail 把枚举命令及检查管道的失败传回调用方:
set -o pipefail
git diff --cached --name-only -z --diff-filter=ACM | while IFS= read -r -d '' path; do
case "$path" in
*.psd|*.fbx|*.wav|*.mp4)
if ! git show ":$path" \
| head -n 1 \
| grep -qx 'version https://git-lfs.github.com/spec/v1'; then
echo "应由 Git LFS 跟踪: $path" >&2
exit 1
fi
;;
esac
done该片段以NUL分隔路径,可以保留文件名中的换行;外层必须正确传播循环的失败退出码。管道直接检查暂存 Blob 的首行,不把二进制内容放入 Shell 变量。规则中的扩展名应与项目 .gitattributes 和资产类型表一致。仅检查扩展名不能识别改名或自定义容器,CI 还可结合文件大小和文件头。验证时分别提交一个 LFS 文件和一个普通 Blob,确保失败能指向具体路径。
首行匹配只是一项快速筛查,真实指针还包含合法对象哈希和大小。发布前应使用 Git LFS 自身的指针与对象校验能力,并确认工作区已经取得真实内容:Git 暂存区应保存指针,导入器读到的工作区文件应保存资产,两者目标相反。缺失对象时先报告 LFS 下载或权限错误,再阻止导入,避免把存储故障误报成模型损坏。
增量验收也要检查依赖闭包。例如材质引用贴图,修改贴图后,只有直接依赖内容的节点需要重新转换,打包节点仍需更新引用的内容身份。把所有反向引用无条件重建会浪费工作,完全忽略依赖变化又会发布旧包;依赖边应明确表示内容输入、元数据输入或仅运行时引用。
验证方法
在干净工作区与缓存工作区构建同一输入,对比输出hash和诊断。修改依赖、工具版本或导入设置应触发正确节点;缺LFS、部分失败与发布中断保留可诊断状态。完整发布机制以资产构建与发布为主归属。
实现状态:正文片段用于解释本页数据流与边界条件;完整宿主的编译、运行及性能测量尚未执行。可运行的独立模型以本页列出的具体测试为准。
本机验证:独立样例 的五项 Git 暂存区检查已通过,直接运行正文 Bash 片段,覆盖中文与空格文件名、英文及中文非指针拒绝,以及暂存内容与工作区内容不同的情况。它不访问 LFS 服务器,也不替代完整指针格式与对象存在性校验。
相关主题
参考资料
-
Git:git-diff:
-z选项规定 NUL 文件名分隔及路径不转义;本文 Bash 检查采用此约定。 -
Git LFS:Pointer file specification:指针格式和对象身份;正文首行检查仅作快速筛查,完整性需对照实体内容。