如何清理 Firebase 托管中的旧部署版本?
How to clean old deployed versions in Firebase hosting?
每次您部署到 Firebase 托管时,都会创建一个新的部署版本,以便您可以回滚并查看部署的人员。这意味着每次您部署的每个文件都被存储并占用更多space。
除了手动删除每个已部署的版本外,有没有自动清理那些无用文件的方法?
你是对的。您需要使用 Firebase 托管控制台一个一个地删除旧的已部署版本。
没有其他方法可以做到这一点,所以我建议您提交 feature request 以启用在 Firebase 托管控制台中删除多个部署的版本。
更新:
您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 团队提出的备选方案之一(批量删除,仅保留 X 个版本,保留发布日期 < Y 的版本)
我不知道它能不能帮到你,但我可以从 "hosting" 菜单中删除旧部署,如下所示:
Delete or rollback old deployment
更新Mar/2019
现在有一个合适的解决方案:“版本历史设置”允许保留最后的 X 版本。
https://support.google.com/firebase/answer/9242086?hl=en
更新Feb/2019
Google 员工@github.com/firebase/firebase-tools/issues/...
确认
It is actively being worked on.
继续阅读之前:
您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 团队提出的备选方案之一
因此,通过使用 Chrome 开发工具,我找到了删除多个版本的方法。请记住,它需要一些工作(小心操作,因为 删除的版本无法恢复 并且您不会像使用 UI 时那样收到任何警告)。
第 1 步。检索版本列表。
- 打开 Chrome 开发工具(如果您不知道如何操作,您应该等待 Firebase 团队的适当解决方案)。
- 打开 Firebase 的控制台并转到 "Hosting" 选项卡。
- 转到 CDT 上的 "Network" 选项卡并使用 Websockets 过滤器。
- Select 名为
.ws?v=5&ns=firebase
的请求
- 打开 "Frames" 选项卡
- 现在是乏味的部分:Select 具有最高 "length" 值的帧。 (根据您的数据,它可能是 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,请执行以下请求:
DELETE https://firebasehosting.clients6.google.com/v1beta1/sites/PROJECT_NAME/versions/-VERSION_ID?key=KEY
我使用 Sublime(创建请求字符串)+ Paw。
可以从 CDT 的任何请求中复制 "KEY"。它与 Firebase 的 Web API key
不匹配
=> 在执行请求之前:记下您不想从 Firebase 提供的 table 中删除的版本。 (网站上列出的每个版本在您的电子邮件下方都有其 ID 的最后 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 是移动到下一页。将鼠标放在第一个三点菜单上,然后开始吧!
此脚本还不是非常可靠,因此使用它需要您自担风险。我稍后会尝试更新它,但现在对我有用。
只需 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)
})
由于选择器依赖于当前的 DOM 结构和托管仪表板上的 类,这可能有点脆弱,但它对我有用!
注意:此脚本(如果从控制台执行)或书签将单击并确认删除当前视图中的所有行。我相当确定即使您在当前部署上单击删除也不会删除它。
控制台中 运行 的函数:
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)()
Firebase 最终为此实施了解决方案。
现在可以设置保留版本的限制。
https://firebase.google.com/docs/hosting/deploying#set_limit_for_retained_versions
编辑:之前的 link 已过时。这是一个有效的新 link:
https://firebase.google.com/docs/hosting/usage-quotas-pricing#control-storage-usage
在发布历史 table 顶部,单击工具栏和 select "Version history settings"。设置为所需数量并单击 save.This 将自动删除旧部署。
每次您部署到 Firebase 托管时,都会创建一个新的部署版本,以便您可以回滚并查看部署的人员。这意味着每次您部署的每个文件都被存储并占用更多space。
除了手动删除每个已部署的版本外,有没有自动清理那些无用文件的方法?
你是对的。您需要使用 Firebase 托管控制台一个一个地删除旧的已部署版本。
没有其他方法可以做到这一点,所以我建议您提交 feature request 以启用在 Firebase 托管控制台中删除多个部署的版本。
更新:
您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 团队提出的备选方案之一(批量删除,仅保留 X 个版本,保留发布日期 < Y 的版本)
我不知道它能不能帮到你,但我可以从 "hosting" 菜单中删除旧部署,如下所示: Delete or rollback old deployment
更新Mar/2019
现在有一个合适的解决方案:“版本历史设置”允许保留最后的 X 版本。
https://support.google.com/firebase/answer/9242086?hl=en
更新Feb/2019
Google 员工@github.com/firebase/firebase-tools/issues/...
确认It is actively being worked on.
继续阅读之前:
您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 团队提出的备选方案之一
因此,通过使用 Chrome 开发工具,我找到了删除多个版本的方法。请记住,它需要一些工作(小心操作,因为 删除的版本无法恢复 并且您不会像使用 UI 时那样收到任何警告)。
第 1 步。检索版本列表。
- 打开 Chrome 开发工具(如果您不知道如何操作,您应该等待 Firebase 团队的适当解决方案)。
- 打开 Firebase 的控制台并转到 "Hosting" 选项卡。
- 转到 CDT 上的 "Network" 选项卡并使用 Websockets 过滤器。
- Select 名为
.ws?v=5&ns=firebase
的请求
- 打开 "Frames" 选项卡
- 现在是乏味的部分:Select 具有最高 "length" 值的帧。 (根据您的数据,它可能是 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,请执行以下请求:
DELETE https://firebasehosting.clients6.google.com/v1beta1/sites/PROJECT_NAME/versions/-VERSION_ID?key=KEY
我使用 Sublime(创建请求字符串)+ Paw。
可以从 CDT 的任何请求中复制 "KEY"。它与 Firebase 的 Web API key
不匹配=> 在执行请求之前:记下您不想从 Firebase 提供的 table 中删除的版本。 (网站上列出的每个版本在您的电子邮件下方都有其 ID 的最后 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 是移动到下一页。将鼠标放在第一个三点菜单上,然后开始吧!
此脚本还不是非常可靠,因此使用它需要您自担风险。我稍后会尝试更新它,但现在对我有用。 只需 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)
})
由于选择器依赖于当前的 DOM 结构和托管仪表板上的 类,这可能有点脆弱,但它对我有用!
注意:此脚本(如果从控制台执行)或书签将单击并确认删除当前视图中的所有行。我相当确定即使您在当前部署上单击删除也不会删除它。
控制台中 运行 的函数:
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)()
Firebase 最终为此实施了解决方案。
现在可以设置保留版本的限制。
https://firebase.google.com/docs/hosting/deploying#set_limit_for_retained_versions
编辑:之前的 link 已过时。这是一个有效的新 link:
https://firebase.google.com/docs/hosting/usage-quotas-pricing#control-storage-usage
在发布历史 table 顶部,单击工具栏和 select "Version history settings"。设置为所需数量并单击 save.This 将自动删除旧部署。