我正在尝试使用更具成本效益的方式来部署我的Rails应用,并通过Ruby Starter Projects来了解Google云端平台。
它几乎完美,而且价格肯定具有竞争力,但我无法弄清楚如何在重新部署后自动删除旧部署的版本实例。
ie:假设我有每个实例的一个版本在运行:
然后我对我的应用进行了更改并重新部署:
$ gcloud preview app deploy app.yaml worker.yaml --promote
所以现在我已经部署了每个实例的两个版本(因为Google会智能地在它们之间切换,我会假设):
但现在呢?这些实例是否会自行关闭?到目前为止,我发现摆脱它们的最好方法是the tutorial's Deleting the project page:
删除应用版本
您可以在Versions page中找到应用版本列表。要删除非默认版本,请选中复选框,然后点击删除。
Google App Engine上的每个人都只是手动删除其应用的旧部署吗?
答案 0 :(得分:6)
要停止所有模块的所有非默认版本的所有实例(独立于这些模块所在的语言),您可以使用control
添加一个用Python编写的小modules
模块API:
from google.appengine.api.modules import modules
# core logic (inside a cron or other handler)
for m in modules.get_modules():
dv = modules.get_default_version(m)
for v in modules.get_versions(m):
if v != dv: modules.stop_version(m, v)
这不会删除非默认版本(modules
API似乎当前不支持删除),但确保没有任何实例正在运行(所以不会对他们产生任何费用。)
这个核心逻辑用于将其包装在处理程序中,因此您可以根据需要触发它,例如在cron作业中,或在常规"从外部触发的处理程序(使用适当的身份验证),例如通过wash或curl在你的bash脚本中。
我不相信这是Python的google.appengine.api.modules.modules
的Ruby版本,但是,我可能错了......我只是找不到它。但是,一个简单的Python编码模块应该允许您控制以任何其他App Engine语言编码的模块(因为App Engine允许您混合和匹配以不同语言编码的模块)。
答案 1 :(得分:3)
以下内容将删除除5个最新版本以外的所有版本:
使用ghead
(在macOS上为brew install coreutils
),对于Linux使用head
替换。
gcloud app versions delete `gcloud app versions list | sed 's/ */:/g' | cut -f 2 -d : | tail -n +2 | ghead -n -5 | tr "\n" " "`
答案 2 :(得分:2)
以下命令可能有效:
gcloud app deploy app.yaml worker.yaml --promote --stop-previous-version
请参阅:https://cloud.google.com/sdk/gcloud/reference/app/deploy
我找不到任何有关promote
和stop-previous-version
默认值的文档。据我观察,promote
是True
,而stop-previous-version
是False
。
为了安全起见,我都写了这两个选项。
答案 3 :(得分:0)
要关闭与旧版本相关联的实例,您可以尝试使用delete tutorial resources doc中提到的拆解脚本(最终自定义):
如果您尝试了有关如何在Compute Engine上运行Ruby的教程,请参阅 该教程的Deployment and teardown scripts部分
小心删除应用程序,但您无法重新使用应用程序ID!
由于旧版本不再是默认版本,因此至少不会为它们自动启动新版本。您可能仍需要手动删除它们,除非Google自动删除超过应用程序允许的最大版本数的旧版自动分配版本。
答案 4 :(得分:0)
我们创建了一个小小的Python脚本来自动删除旧版本。我们在每次部署之前都运行它,以使我们的部署始终成功(并且永远不会因部署了太多版本而失败)。
答案 5 :(得分:0)
我们从Cloud Build部署App Engine实例,这是一种常见的部署模式。在cloudbuild.yaml的末尾,我们指定以下命令,该命令将删除除最后5个版本以外的所有版本:
versions=$(gcloud app versions list \
--service default \
--sort-by '~version' \
--format 'value(VERSION.ID)' \
--project ${PROJECT_ID} | tail -n +6)
if [ -n "$versions" ]; then
gcloud app versions delete "$versions"
--service default
--project ${PROJECT_ID}
--quiet
fi
答案 6 :(得分:0)
在阅读了所有其他提供的解决方案后,只是把我的解决方案扔在这里:
gcloud app versions list --format="value(version.id)" --sort-by="~version.createTime" | tail -n +6 | xargs -r gcloud app versions delete --quiet
主要好处是即使现有版本不超过 5 个,它仍然可以成功运行。
答案 7 :(得分:0)
使用zx,你可以用相对干净的代码来编写它。
#!/usr/bin/env zx
// firstly, deploy
await $`gcloud app deploy --quiet --project=XXX`
// secondly, delete versions except the one deployed just now
let versions = await $`gcloud app versions list --project=XXX | sed 's/ */:/g' | cut -f 2 -d : | tail -n +2 | ghead -n -1`
console.log("---")
versions = versions.toString().split("\n") // makes array
versions.pop() // removes last blank element created by new line
console.log(versions)
await Promise.all(versions.map(version =>
$`gcloud app versions delete ${version} --project=XXX`
))
console.log("done!")
答案 8 :(得分:0)
对于那些不熟悉 xargs 语法的人,我从@bkanuka 那里得到了非常好的答案,并将其分成两行。它保留最后 5 个版本,即使部署的版本少于 5 个也能正常工作:
VERSIONS=$(gcloud app versions list --format="value(version.id)" --sort-by="~version.createTime" | tail -n +6 )
gcloud app versions delete --quiet $VERSIONS