如何清理 Firebase 托管中的旧部署版本?

Posted

技术标签:

【中文标题】如何清理 Firebase 托管中的旧部署版本?【英文标题】:How to clean old deployed versions in Firebase hosting? 【发布时间】:2016-12-27 05:47:18 【问题描述】:

每次部署到托管 Firebase 时,都会创建一个新的部署版本,以便您可以回滚并查看部署者。这意味着每次部署的每个文件都会被存储并占用更多空间。

除了手动逐个删除每个部署的版本,有没有什么自动化的方法来清理那些无用的文件?

【问题讨论】:

这是截至 2019 年 3 月的答案:***.com/a/47213789/1271706 【参考方案1】:

你是对的。您需要使用 Firebase 托管控制台一一删除旧部署的版本。

没有其他方法可以做到这一点,所以我建议您提交feature request 以启用在 Firebase 托管控制台中删除多个部署的版本。

更新:

您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 为团队提出的替代方案之一(批量删除,仅保留 X 版本,保留发布日期

【讨论】:

我已经填写了一个功能请求,但我怀疑它会被实现。哦,好吧。 哦,痛苦——就我而言,我有 218 个! (点击菜单,点击删除,点击删除……点击菜单,点击删除,点击删除……重复218次……) @Pier 请链接到您创建的功能请求,以便我们对其进行跟踪。谢谢!编辑:我看到 Firebase 上的功能请求不公开。那有点……不太好。 @Levi 在 firebase-tools repo 上也有报道。致大家:您可以在这里投票(请避免 +1 垃圾邮件,使用反应)github.com/firebase/firebase-tools/issues/… 为团队提出的替代方案之一(批量删除,仅保留 X 版本,保留发布日期的版本【参考方案2】:

2019 年 3 月更新

现在有一个合适的解决方案:“版本历史设置”,它允许保留最新的 X 版本。

https://support.google.com/firebase/answer/9242086?hl=en


2019 年 2 月更新

由谷歌员工@github.com/firebase/firebase-tools/issues/...确认

它正在积极进行中。 ?

???


在继续阅读之前:

您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 为团队提出的替代方案之一


因此,通过使用 Chrome 开发工具,我找到了一种删除多个版本的方法。请记住,这需要一些工作(请小心操作,因为已删除的版本无法恢复,并且您不会收到任何警告,例如使用 UI 时)。

步骤 1. 检索版本列表。

    打开 Chrome 开发工具(如果您不知道如何处理,您应该等待 Firebase 团队提供适当的解决方案)。 打开 Firebase 的控制台并转到“托管”选项卡。 转到 CDT 上的“网络”选项卡并使用 Websockets 过滤器。 选择名为.ws?v=5&ns=firebase的请求 打开“框架”标签 现在是乏味的部分:选择具有最高“长度”值的帧。 (根据您的数据,可能是 2-n 帧。在我的情况下,长度为 14k-16k 的 3 帧) 按顺序粘贴每个帧的数据(这将形成一个有效的 JSON 对象)。 提取数据:有几种方法可以做到这一点。我在 CDT 的控制台上选择了简单的 JS。
    var jsonString = '...';
    var json = JSON.parse(jsonString);
    var ids = Object.keys(json.d.b.d);

步骤 2. 执行请求

差不多了:P

现在您有了 ID,请执行以下请求:

删除https://firebasehosting.clients6.google.com/v1beta1/sites/PROJECT_NAME/versions/-VERSION_ID?key=KEY

我使用了 Sublime(创建请求字符串)+ Paw。

“KEY”可以从 CDT 的任何请求中复制。它与 Firebase 的 Web API 密钥不匹配

=> 在执行请求之前:记下您不想从 Firebase 提供的表格中删除的版本。 (网站上列出的每个版本在您的电子邮件下都有其 ID 的最后 6 位数字)

(未提供屏幕截图,因为所有这些都需要模糊处理和一些工作)

【讨论】:

我已经完成了最后一步,除了我想使用浏览器内的工具来发送删除请求。这似乎是正确的:fetch(`https://firebasehosting.clients6.google.com/v1beta1/sites/$projectID/versions/$versionID?key=$key`, method: "DELETE", credentials: 'include'); 但是,在运行时,它显示“请求缺少所需的身份验证凭据”。这很奇怪,因为“网络”选项卡显示请求是相同的。 (除了两个 cookie 的微小变化,这似乎无关) @Venryx 你明白了吗? 不,抱歉。我最终使用了上面@Aaverin 的解决方案,效果很好。 太棒了。现在应该是答案了。【参考方案3】:

这个脚本还不是超级可靠的,所以使用它需要您自担风险。我稍后会尝试更新它,但现在对我有用。 只需一些 javascript 即可单击按钮以一一删除已部署的项目。

var deleteDeployment = function(it) 
    it.click()
    setTimeout(function() 
        $('.md-dialog-container .delete-dialog button.md-raised:contains("Delete")').click()
    , 300)

$('.h5g-hist-status-deployed').map((i, a) => $(a).parent()).map((i, a) => $(a).find('md-menu button:contains(Delete)')).each((i, it) => 
    setTimeout(function() 
        deleteDeployment(it)
    , (i + 1) * 2000)
)

【讨论】:

这在五分钟内清除了 3GB 的旧部署。谢谢! 酷!你让我的生活更轻松。【参考方案4】:

Firebase终于为此实施了解决方案。

现在可以设置保留版本的限制。

https://firebase.google.com/docs/hosting/deploying#set_limit_for_retained_versions

编辑:以前的链接已过时。这是一个有效的新链接:

https://firebase.google.com/docs/hosting/usage-quotas-pricing#control-storage-usage

【讨论】:

【参考方案5】:

由于选择器依赖于当前 DOM 结构和 Hosting Dashboard 上的类,这可能有点脆弱,但它对我有用!

注意:此脚本(如果从控制台执行)或小书签将单击并确认删除当前视图中的所有行。我相当肯定,即使您在当前部署上单击删除,它也不会删除它。

控制台运行函数:

let deleteAllHistory = () => 
  let deleteBtns = document.querySelectorAll('.table-row-actions button.md-icon-button');

  const deleteBtn = (pointer) => 
        deleteBtns[pointer].click();

        setTimeout(() => 
          document.querySelector('.md-open-menu-container.md-clickable md-menu-item:last-child button').click();

          setTimeout(() => 
            document.querySelector('.fb-dialog-actions .md-raised').click();

            if(pointer < deleteBtns.length - 1) 
              deleteBtn(pointer + 1);
            
          , 500);
        , 500);
  ;

  deleteBtn(0);
;

书签:

javascript:(function()%7Bvar%20deleteBtns%3Ddocument.querySelectorAll('.table-row-actions%20button.md-icon-button')%2CdeleteBtn%3Dfunction(a)%7BdeleteBtns%5Ba%5D.click()%2CsetTimeout(function()%7Bdocument.querySelector('.md-open-menu-container.md-clickable%20md-menu-item%3Alast-child%20button').click()%2CsetTimeout(function()%7Bdocument.querySelector('.fb-dialog-actions%20.md-raised').click()%2Ca%3CdeleteBtns.length-1%26%26deleteBtn(a%2B1)%7D%2C500)%7D%2C500)%7D%3BdeleteBtn(0)%7D)()

【讨论】:

注意这将删除域:|【参考方案6】:

Nathan 的选项很棒,但我有一个使用 AutoHotkey 的快速而简单的方法。删除每个版本大约需要一秒钟,因此您可以在 10 秒内敲出一个页面。

#a::
    Click
    MouseGetPos, xpos, ypos
    MouseMove, xpos, ypos + 30
    Sleep 300
    Click
    Sleep 400
    Click 1456, 816
    MouseMove, xpos, ypos + 82
return
#s::
    Click
    MouseGetPos, xpos, ypos
    MouseMove, xpos, ypos - 820
return

您可能需要修改屏幕的确切像素值,但这在我的 1920x1080 上完美运行。

Win + a 是删除并移动到下一个条目,Win + s 是移动到下一页。将鼠标放在第一个 3 点菜单上即可!

【讨论】:

【参考方案7】:

在发布历史记录表顶部,单击工具栏并选择“版本历史记录设置”。设置为所需数量并单击保存。这将自动删除旧部署。

【讨论】:

【参考方案8】:

我不知道它是否可以帮助您,但我可以从“托管”菜单中删除旧部署,如下所示: Delete or rollback old deployment

【讨论】:

你应该把相关的代码/说明放在这里,以避免将来任何断开的链接让你回答无用。 是的,但您必须手动操作。逐个。你甚至读过这个问题吗?

以上是关于如何清理 Firebase 托管中的旧部署版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新在 Firebase 托管中部署的 Flutter Web 版本

如何使用swift和ios使firebase sdk中的旧消息过期

Firebase 托管 Flutter Web 应用程序未清除首次部署的缓存

如何在 Firebase 托管上部署 next.js 应用程序?

如何在 Firebase 托管上部署流线型 python 应用程序?

使用 CircleCI 部署到 Firebase 托管