让我们来谈谈在你的CI管道中摆脱NodeJS的问题。
我运行Chipper CI(Laravel的持续集成)。我一直很恼火,Webpack的构建比CI管道中实际有价值的部分花费更多的时间,造成更多的问题。
我们中的大多数人只需要运行我们的测试,也许还需要启动一个部署。Node构建任务增加了大量的时间,需要更多的CPU/内存使用。
如果我们在管道中不需要Node呢?我们可以......不需要吗?
答案是。当然可以,也许吧
功能测试
很多时候, 在CI管道中建立静态资产的唯一原因是为了生成mix-manifest.json 文件.
这使得mix() 帮助器可以在运行Laravel特性测试时发挥作用。功能测试会对你的应用程序进行HTTP调用,因此经常会渲染使用mix() 帮助器的刀片模板。
如果你没有manifest文件, 就会出现错误!
生成该清单文件涉及构建您的静态资产--换句话说,使用 npm(或 yarn)来安装依赖项并运行 Webpack 任务。
# Build static assets
npm ci --no-audit
npm 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 go
cp 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 文件、容器镜像等)时
- 当你运行其他节点命令作为你的测试套件的一部分,如
eslint - 当你在用Laravel Dusk进行浏览器测试时
如果我需要构建资产呢?
即使你需要在CI脚本中构建你的静态资产,你仍然可以节省宝贵的时间!
我最喜欢的软件包是Airdrop(由Aaron Francis编写).它可以帮助你只在静态资产在两次提交之间发生变化时才进行构建。如果它们没有变化,你可以从文件系统驱动器(如S3)中下载它们。