Oro 4.x资产构建超时求助:CICD中oro:assets:install无法完成
我之前维护OroCommerce 4.x的CI/CD流水线时,碰到过几乎一模一样的问题——安装时oro:assets:install飞快,到了CI部署阶段就直接卡死,占满CPU和内存还跑不完。折腾了好几天,终于找到几个关键的排查方向和解决方案,给你参考:
1. 拆分命令,定位卡点
Oro的oro:assets:install在生产环境下默认会自动触发webpack构建,但整合命令的日志不够清晰。建议拆成两步执行,单独排查构建环节:
# 仅复制资产文件,不触发webpack构建 php bin/console oro:assets:install --env=prod --no-interaction -vvv --no-build # 单独执行webpack构建,方便查看详细日志 php bin/console oro:webpack:build --env=prod --no-interaction -vvv
如果第一步很快完成,问题肯定出在webpack构建阶段,接下来针对性排查即可。
2. 清理残留资产与缓存,避免增量冲突
CI环境是增量部署,之前的构建残留文件很可能和新代码的资产产生冲突,导致webpack陷入循环处理。在执行资产安装前,先加几步清理操作:
# 删除web目录下的旧资产(Oro 4.x默认是web/assets,Symfony 4结构则为public/assets) rm -rf /var/www/web/assets # 清理Oro的webpack缓存 php bin/console oro:webpack:clean --env=prod --no-interaction -vvv # 清理npm缓存,避免依赖版本不一致 npm cache clean --force # 若用yarn则执行:yarn cache clean
3. 确保Node.js版本与依赖一致性
安装环境和CI环境的Node.js、npm/yarn版本必须完全一致!我之前就是CI用了Node 16,本地安装用的Node 14,导致webpack兼容性问题,直接卡死在模块编译环节。你可以在本地执行node -v和npm -v,然后在CI流水线里强制指定相同版本。
4. 排查自定义/第三方扩展的资产问题
如果项目有自定义Oro扩展或第三方扩展,很可能是某个扩展的webpack配置有问题(比如循环依赖、错误的entry配置),导致构建时陷入无限循环。可以临时在CI里禁用所有自定义扩展,执行构建测试:如果能正常完成,再逐个启用扩展排查,找到出问题的那个。
5. 给Node.js明确分配内存上限
webpack在生产环境构建时需要大量内存,虽然你已经分配了8G,但有时候需要明确指定Node的内存上限:
# 给Node分配8G内存后执行构建 NODE_OPTIONS="--max-old-space-size=8192" php bin/console oro:webpack:build --env=prod --no-interaction -vvv
6. 查看详细日志定位具体环节
把构建日志输出到文件,看最后停在哪个步骤:
php bin/console oro:webpack:build --env=prod --no-interaction -vvv 2>&1 > build.log
打开build.log查看最后几行,通常能看到是在处理某个主题资产、某个扩展的entry文件,或者某个第三方库,这样就能精准定位问题。
我当时的问题是某个自定义扩展的webpack entry引入了循环依赖,导致webpack一直在递归解析模块,占满内存还跑不完,禁用该扩展后就恢复正常了。你可以按照上面的步骤一步步排查,应该能找到根源。
内容的提问来源于stack exchange,提问作者TrotOfDoom

