如何在CI管道中摆脱NodeJS

87 阅读3分钟

让我们来谈谈在你的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 管线中构建资产以下是您需要的最常见的时间。

  1. 当您构建生产资产以将其捆绑到您可以部署的 "工件"(zip 文件、容器镜像等)时
  2. 当你运行其他节点命令作为你的测试套件的一部分,如eslint
  3. 当你在用Laravel Dusk进行浏览器测试时

如果我需要构建资产呢?

即使你需要在CI脚本中构建你的静态资产,你仍然可以节省宝贵的时间!

我最喜欢的软件包是Airdrop(由Aaron Francis编写).它可以帮助你在静态资产在两次提交之间发生变化时才进行构建。如果它们没有变化,你可以从文件系统驱动器(如S3)中下载它们。