弹性 Beanstalk "git aws.push" 只提交了差异?

4

我们将PHP项目存储在Github上。

为了快速部署,我们使用.bat文件将git推送更改到AWS Elastic Beanstalk云:

"C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c "git aws.push --environment envname"

我们在推送之前每次都进行提交,这很完美地按照预期工作。
不幸的是,由于某些原因,有时它会非常快速地推送(仅推送PHP代码更改的差异),但有时它会发送整个300mb项目(包括所有媒体)。
是否有任何方法只推送更改的差异?也许在推送或准备git命令之前有任何其他参数?或者也许有一种方法告诉AWS EB从github存储库中拉取最后一次提交?
感谢任何帮助。

我对此感到困惑,因为Elastic Beanstalk的应用程序版本不允许如此大的捆绑包。在某个地方有一个硬性限制,大约在400MB左右。 - Nick Humrich
@Humdinger 这里的5Gb是一个相对值 :) 实际上大约是300mb,但是由于我们国家的互联网连接,上传需要大约30分钟。 - Kainax
为什么要踩?无论项目重量是300mb还是5gb,问题都是一样的——如何防止全库推送而不是仅推送更改? - Kainax
1
@Kainax 我也遇到了同样的问题,有时候 git aws.push 会上传整个 300MB(和我一样),有时候只上传更改部分。 - Jose Nobile
3个回答

2

好的,经过几个月的困扰,我终于找出了问题的原因。

问题在于

aws.push

Elastic Beanstalk命令正在检查您当前的文件是否已提交到git或者它们超前于存储库。如果您的文件与最后一次git提交相同,则EB只拉取差异,但是如果您的文件超前于最后一次git提交,则它将拉取整个文件夹

为了避免问题,我为Windows制作了一个deploy.bat文件,在aws.push命令之前尝试提交更改:

cls
git add .
git commit -a
git aws.push --environment myenvironment
pause

如果您在运行此.bat文件之前已经提交过更改,那么您将只上传差异。否则,在上传差异之前,将要求您提供git提交消息。

注意:如果您尝试再次推送已经存在于EB上的版本,则还将尝试上传整个文件夹。

请注意,如果出现EB尝试拉取整个文件夹的情况,请关闭窗口,对源代码进行小的更改(如添加新行或注释),保存,将更改提交到git并重新运行deploy.bat文件。

非常好用!

编辑:

对于使用新的独立eb cli的用户,代码将是:

cls
git add .
git commit -a
eb deploy your_environment_name
pause

2
当您执行git aws.push命令时,整个git代码库会被压缩并上传到Elastic Beanstalk,因此推送时间较长。这是该命令的实现方式。在此讨论中有一个很好的讨论和更改请求。
我不确定哪些文件在您的代码中占用了这么多的空间,但通常最好不要将它们存储在应用程序git中。
如果这些是媒体文件,请将它们存储在S3(或任何其他可访问的网络位置)中。 如果大部分文件是在您的git中的外部库,则可以通过EB预部署脚本进行预安装。

关于媒体文件大小 - 实际上是动态生成的360度图像,每当3D艺术家更改模型时就会发生变化,因此在开发期间不断变化,并且必须在每次更改时上传,因此目前手动S3存储桶上传对我们来说不是一个解决方案。如果我们找不到解决方案,我认为我将扩展自定义图像生成软件以实现自动S3上传。 - Kainax
这个答案是错误的,至少在Windows中,git aws.push是使用powershell实现的,它获取用户和要推送的URL,然后执行普通的git push。我认为,因为亚马逊是分布式的,并且URL不同,所以它不会推送到相同的服务器,需要推送整个仓库。您是否接受此信息作为答案? - Jose Nobile
@JoseNobile 你好,谢谢你的提示。其实原因很明显,但是有没有解决这个问题的方法呢?问题仍然存在,也许有人知道如何修复它。 - Kainax

2

因为这是Amazon的一个bug,我实施了一种解决方法。

我在服务器上设置了一个git帐户(我使用了Gitlab,可以免费使用私人存储库和无限的协作者),您可以使用任何您想要的(github,gitlab,您自己的服务器)。

您和git服务器之间的过程是可靠的,您只需始终推送更改。在EC2服务器上,我设置了一个git存储库(您可以使用配置文件.ebextensions / * .config或手动完成,我建议手动完成,以便不在所有实例中设置),该存储库连接到我的git服务器,并从EC2服务器执行git pull和git aws.push。

你可以设置一个Web钩子来通知你何时进行git push,然后自动执行git pull和git aws.push。在我的情况下,我更喜欢使用SSH决定何时部署,而这并不总是当我将提交推送到我的git服务器时。

这样,从EC2服务器向弹性Beanstalk服务器执行git aws.push非常快,无论它推送全部内容还是只推送更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接