测试时跳过 Webpack
发布于 作者 Chris Fidao
让我们聊聊如何在 CI 管道中摆脱 NodeJS。
我运行 Chipper CI(Laravel 的持续集成)。我一直都很困扰,Webpack 构建比 CI 管道的实际 *有价值* 部分花费更多时间并导致更多问题。
我们大多数人只需要运行我们的测试,也许还要启动部署。Node 构建任务会增加很多时间,并需要更多 CPU/RAM 使用量。
如果我们不需要 Node 在我们的管道中呢?我们可以… 不用吗?
答案是:当然可以,也许吧!
功能测试
很多时候,在 CI 管道中构建静态资产的唯一原因是生成 mix-manifest.json
文件。
这使得 mix()
助手在运行 Laravel **功能** 测试时可以正常工作。功能测试对您的应用程序进行 HTTP 调用,因此通常会渲染使用 mix()
助手的 Blade 模板。
如果您没有清单文件,就会抛出错误!
生成此清单文件涉及构建您的静态资产 - 换句话说,使用 npm(或 yarn)安装依赖项并运行 Webpack 任务
# Build static assets npm ci --no-auditnpm run dev
旁注:您几乎肯定应该提交您的
package-lock.json
文件并运行npm ci --no-audit
而不是npm install
!
如果您查看您的 public/mix-manifest.json
文件,它可能看起来像这样(无论是否包含哈希,取决于您是否启用了版本控制)
{ "/js/app.js": "/js/app.js", "/js/foo.js": "/js/foo.js", "/css/app.css": "/css/app.css"}
关键是:您不需要此文件存在才能进行测试!
在您的测试的 setUp()
方法中,您可以添加以下魔法
protected function setUp(): void{ parent::setUp(); $this->withoutMix();}
有了它,mix()
助手就不会因缺少清单文件而返回任何错误。您的测试可以在不运行 NodeJS 任务的情况下通过!
您还可以为您的 CI 管道创建一个清单文件,并在测试时复制它。
假设我们的 Mix 配置生成上述 mix-manifest.json
文件。我们可以将一个虚拟清单文件提交到 tests/mix-manifest.json
,它将始终可用!
然后,在我们的 CI 管道脚本中,我们可以使用该文件而不是安装/构建我们的 Node 依赖项
# What if we created a mix-manifest.json file just for testing?# During CI, we can just move it where it needs to gocp tests/mix-manifest.json public/mix-manifest.json # And then run your tests, no NodeJS required!php artisan test
有了此文件,mix()
助手将正常工作,您的功能测试将不会出现任何问题!
这(或任何方法!)创建一个正确的清单文件可以帮助您在 CI 构建管道中节省大量时间和服务器资源。
您需要在您以添加文件到真实清单文件的方式更改配置时更新您的
tests/mix-manifest.json
文件。
什么时候需要构建资产?
有时,您 *确实* 需要在 CI 管道中构建资产!以下是您最常需要构建资产的时间
- 当您构建生产资产以将它们捆绑到一个“工件”(zip 文件、容器镜像等)中,以便您可以部署它
- 当您在测试套件中运行其他 node 命令时,例如
eslint
- 当您使用 Laravel Dusk 进行浏览器测试时
如果我需要构建资产怎么办?
即使您需要在 CI 脚本中构建静态资产,您仍然可以节省宝贵的时间!
我最喜欢的用于此的包是 Airdrop(由 Aaron Francis 创建)。它可以帮助您 *仅在* 提交之间发生更改时构建静态资产。如果没有变化,您可以从 S3 等文件系统驱动程序下载它们。