当我推送到GitHub时,我正在使用Travis自动部署我的Firebase托管网站和云功能,详见此处。然而,即使对于我的云功能数量有限的小型网站来说,部署所有功能也需要相当长的时间。如果我手动部署,我将能够使用--only
来精确地指定我实际更改的那些函数。有没有一种方法可以让Travis获得这些信息,从而只重建必要的功能?
https://m.youtube.com/watch?v=iyGHW4UQ_Ts
最小值30和之后
这个家伙通过将所有函数复制到云存储桶中,然后为每个文件做一个diff来解决这个问题。如果您的所有逻辑都在一个文件中,则此操作效果良好。但这不是你想要的大型项目。对于我自己的项目,我使用webpack为每个包含导入的函数创建一个文件。然后,我为该文件生成一个md5哈希,并将其保存到functions-lock.json中。在下一次运行时,我可以很容易地检查旧的哈希值,只部署更改后的函数。ci应该通过将锁文件上传到云中或进行一些git魔术来管理锁文件的状态
不幸的是,这并不是一件简单的事——Firebase CLI部署了您的所有功能,因为几乎不可能只分析代码并找出哪些功能受到影响(因为您可能需要其他文件,所以您可能更新了依赖项,但没有更改文件,等等)
我能想到的一件事可能是破解,那就是为函数或函数组命名分支。然后,您可以将git push
传递到要部署的特定函数的分支,并使用该分支名称作为信号的脚本将--only functions:<fnName>
传递到firebase deploy
命令。这不是最迷人的解决方案,但根据你的错误程度,它可能会有所帮助。
所以这有点晚了,但漫长的部署时间已经困扰了我们一段时间。
我们的解决方案基于CircleCI,但应该可以进行调整。
首先,我们在最后一次与合并的PR中获得所有更改的文件
git log -m -1 --name-only --pretty="format:" ${process.env.CIRCLE_SHA1}
CIRCLE_SHA1是最后一次合并提交的SHA,即featurebranch->主
然后我们从/functions/目录中获取所有函数文件名,并使用
madge生成一个包含这些函数所有依赖项的数组。
接下来,我们查看从git获得的所有更改文件,并检查它们的文件名是否是特定云函数的依赖数组的一部分,如果是,我们将cloudfunction添加到另一个数组中。
一旦完成了这项工作,我们几乎就有了一个来自所有受特定文件更改影响的云函数的数组,现在我们可以将其映射到它们的实际云函数名称以进行部署。
现在,我们不再总是部署75个云函数(需要45分钟),而是只部署20个。