我正在Google App Engine上运行Node.js应用,使用以下命令部署代码:
gcloud app deploy --stop-previous-version
我想要的行为是终止运行以前版本的所有示例,但它们似乎总是存在。我是不是漏掉了什么?我意识到他们没有收到流量,但我仍然为他们支付,他们造成一些背景遥测噪音。是否有更好的方法来运行此命令?gcloud app instances list的输出示例:正如您所看到的,我运行了两个不同的版本。
gcloud app instances list
zu0ti5jz1#
我们不小心在不到30天的时间里花光了免费的Google App Engine信用,因为一个错误的灵活示例没有被后续的部署清除。当我们确定它是原因时,它已经扩展到四个同时发生的示例,这些示例基本上是空闲的。
tl;dr:部署时使用--version标志指定版本名。现有的同版本示例将在下次部署时被替换。
--version
这让我陷入了一个兔子洞,那就是--stop-previous-version。以下是我目前发现的:--stop-previous-version似乎不再受支持。它在gcloud app deploy reference page上的Flags下提到,但是如果你看一下列出所有标志的页面顶部,就找不到它了。我试着用那个标志设置部署,看看会发生什么,但似乎没有效果。一个新的版本仍然被创建,我仍然不得不进去手动删除旧的示例。在gcloud-maven-plugin repo上有一个开放的Github问题,特别指出这是该插件的问题,但这个问题似乎被忽略了。在这一点上,我们最好的选择是将--version=staging或其他任何东西添加到gcloud deploy app。该标志的参考文档似乎表明它将替换共享该“版本”的现有示例:--version=VERSION,-v VERSION此部署将创建或替换的应用程序版本。如果未指定版本,系统将为您生成一个版本。(强调我的)此外,Google自己的reference documentation on app.yaml(该链接用于Python文档,但它仍然相关)特别调用--version标志作为部署时指定版本的“首选”方式:推荐的方法是从app.yaml文件中删除version元素,使用命令行标志指定版本ID
--stop-previous-version
gcloud app deploy
--version=staging
gcloud deploy app
yh2wf1be2#
据我所知,至少对于自动伸缩的标准环境,旧版本保持“服务”是正常的,尽管它们应该希望有零示例(即使您的伸缩配置指定了非零的最小值)。至少我是这么看的我认为(我希望)那些旧的“服务”示例不会导致任何费用,因为计费是每个示例。我知道上面的大多数答案都是针对灵活环境的,但我想我会在这里为那些想知道的人提供这个答案。(And如果Google的人能确认就太好了。)
c86crjj03#
我有同样的问题。使用Flex环境(其中一些也适用于标准环境)和Docker(app.yaml中的runtime: custom),我终于解决了这个问题!我尝试了很多方法,我不确定哪一个解决了它(或者它是否是一个组合),所以我将在这里列出我做的事情,最有可能的解决方案首先列出。
app.yaml
runtime: custom
解决方案1)确保云存储删除旧版本
云存储与任何事情都有什么关系?(我听到你问)有一个小工具提示(Google Cloud Platform Web UI (GCP) > App Engine > Versions > Size),当你把鼠标悬停在上面时,它会说:(Google App Engine)灵活的环境代码从Google Cloud Storage存储并计费。因此,基于此信息和this answer,我访问了GCP > Cloud Storage > Browser,并找到了我的存储桶和一堆我不知道存在的其他存储桶。事实证明,一些bucket存储缓存的云函数代码,一些存储缓存的docker图像,还有一些存储其他缓存的代码/东西(你可以通过浏览bucket来区分哪些是哪些)。所以我给所有的bucket(除了云函数bucket)添加了删除策略,如下所示:转到GCP > Cloud Storage > Browser并单击Lifecycle Rules列中的链接(针对相关存储桶)〉单击添加规则〉然后:对于SELECT ACTION,选择“Delete Object”(删除对象),然后单击“Continue对于SELECT OBJECT,选择“新版本数”并在输入中输入1单击创建这将返回到表视图,您现在应该在生命周期规则列中看到该规则。对所有相关存储桶重复此过程(相关存储桶已在前面描述)。然后删除相关存储桶的内容。警告:某些存储桶警告您不要删除存储桶本身,只删除存储桶内容!现在重新部署,你的最新版本现在应该得到部署,希望你永远不会有这个问题了!
Google Cloud Platform Web UI (GCP) > App Engine > Versions > Size
GCP > Cloud Storage > Browser
Lifecycle Rules
解决方案2)使用部署标志
我加了这些旗子
gcloud app deploy --quiet --promote --stop-previous-version
这可能没有帮助,因为这些标志似乎是默认的,但值得添加以防万一。请注意,仅对于标准环境(我从葡萄藤中听说),您还可以使用--no-cache标志,这可能会有所帮助,但对于flex,此标志导致部署失败(当我尝试时)。
--no-cache
解决方案3)
这可能根本没有帮助,但我补充说:
COPY app.yaml .
到Dockerfile
提示1)
这可能是一个更有帮助/有用的调试方法,而不是修复。访问GCP > App Engine > Versions这将显示您的应用程序的所有版本(每个部署1个),还将显示每个示例正在运行的版本(示例在app.yaml中配置)。确保所有示例都运行最新版本。默认情况下应发生此操作。可能值得删除旧版本。您可以从gcloud app deploy日志(在日志的开头)确定您的版本,但似乎版本是按部署顺序列出的(最新的在顶部)。
GCP > App Engine > Versions
提示2)
访问GCP > App Engine > InstancesSSH进入示例。这只是一个点击几个按钮的问题(见下面的截图)。在运行SSH后:
GCP > App Engine > Instances
docker exec -it gaeapp /bin/bash
这将使您进入运行代码的Docker容器。现在您可以浏览以确保它有您的最新代码。
wz3gfoph4#
Google可能已经更新了@IAmKale的回答中引用的documentation请注意,如果该版本正在自动缩放服务的示例上运行,则使用--stop-previous-version将不起作用,并且以前的版本将继续运行,因为自动缩放服务示例始终在运行。似乎该标志只适用于手动缩放的服务。
3lxsmp7m5#
这是我另一项主要答复以外的补充答复,可选择作答。我现在,除了我的其他答案,自动增量版本手动部署使用脚本。我的剧本内容在下面。基本上,脚本会在每次部署时自动递增版本。我使用的是node.js,所以脚本使用npm version来提升版本,但这一行可以很容易地调整到您使用的任何语言。脚本需要一个干净的git工作目录来部署。该脚本假设当版本被碰撞时,这将导致文件更改(例如对package.json版本的更改)。该脚本基本上会尝试找到您的SSH密钥,如果找到,则会启动SSH代理,并使用您的SSH密钥来git提交和git推送文件更改。否则它只会执行git commit而不执行push。然后使用--version标志进行部署…--version="${deployVer}"我想这可能会对某些人有所帮助,特别是因为最上面的答案谈到了很多关于在部署中使用--version flag的问题。
npm version
package.json
--version="${deployVer}"
--version flag
#!/usr/bin/env bash projectName="vehicle-damage-inspector-app-engine" # Find SSH key sshFile1=~/.ssh/id_ed25519 sshFile2=~/Desktop/.ssh/id_ed25519 sshFile3=~/.ssh/id_rsa sshFile4=~/Desktop/.ssh/id_rsa if [ -f "${sshFile1}" ]; then sshFile="${sshFile1}" elif [ -f "${sshFile2}" ]; then sshFile="${sshFile2}" elif [ -f "${sshFile3}" ]; then sshFile="${sshFile3}" elif [ -f "${sshFile4}" ]; then sshFile="${sshFile4}" fi # If SSH key found then fire up SSH agent if [ -n "${sshFile}" ]; then pub=$(cat "${sshFile}.pub") for i in ${pub}; do email="${i}"; done name="Auto Deploy ${projectName}" git config --global user.email "${email}" git config --global user.name "${name}" echo "Git SSH key = ${sshFile}" echo "Git email = ${email}" echo "Git name = ${name}" eval "$(ssh-agent -s)" ssh-add "${sshFile}" &>/dev/null sshKeyAdded=true fi # Bump version and git commit (and git push if SSH key added) and deploy if [ -z "$(git status --porcelain)" ]; then echo "Working directory clean" echo "Bumping patch version" ver=$(npm version patch --no-git-tag-version) git add -A git commit -m "${projectName} version ${ver}" if [ -n "${sshKeyAdded}" ]; then echo ">>>>> Bumped patch version to ${ver} with git commit and git push" git push else echo ">>>>> Bumped patch version to ${ver} with git commit only, please git push manually" fi deployVer="${ver//"."/"-"}" gcloud app deploy --quiet --promote --stop-previous-version --version="${deployVer}" else echo "Working directory unclean, please commit changes" fi
对于node.js用户,如果你调用脚本deploy.sh,你应该添加:
deploy.sh
"deploy": "sh deploy.sh"
在您的package.json脚本中并使用npm run deploy进行部署
npm run deploy
5条答案
按热度按时间zu0ti5jz1#
我们不小心在不到30天的时间里花光了免费的Google App Engine信用,因为一个错误的灵活示例没有被后续的部署清除。当我们确定它是原因时,它已经扩展到四个同时发生的示例,这些示例基本上是空闲的。
tl;dr:部署时使用
--version
标志指定版本名。现有的同版本示例将在下次部署时被替换。这让我陷入了一个兔子洞,那就是
--stop-previous-version
。以下是我目前发现的:--stop-previous-version
似乎不再受支持。它在gcloud app deploy
reference page上的Flags下提到,但是如果你看一下列出所有标志的页面顶部,就找不到它了。我试着用那个标志设置部署,看看会发生什么,但似乎没有效果。一个新的版本仍然被创建,我仍然不得不进去手动删除旧的示例。
在gcloud-maven-plugin repo上有一个开放的Github问题,特别指出这是该插件的问题,但这个问题似乎被忽略了。
在这一点上,我们最好的选择是将
--version=staging
或其他任何东西添加到gcloud deploy app
。该标志的参考文档似乎表明它将替换共享该“版本”的现有示例:--version=VERSION,-v VERSION
此部署将创建或替换的应用程序版本。如果未指定版本,系统将为您生成一个版本。
(强调我的)
此外,Google自己的reference documentation on app.yaml(该链接用于Python文档,但它仍然相关)特别调用
--version
标志作为部署时指定版本的“首选”方式:推荐的方法是从app.yaml文件中删除version元素,使用命令行标志指定版本ID
yh2wf1be2#
据我所知,至少对于自动伸缩的标准环境,旧版本保持“服务”是正常的,尽管它们应该希望有零示例(即使您的伸缩配置指定了非零的最小值)。至少我是这么看的我认为(我希望)那些旧的“服务”示例不会导致任何费用,因为计费是每个示例。
我知道上面的大多数答案都是针对灵活环境的,但我想我会在这里为那些想知道的人提供这个答案。
(And如果Google的人能确认就太好了。)
c86crjj03#
我有同样的问题。使用Flex环境(其中一些也适用于标准环境)和Docker(
app.yaml
中的runtime: custom
),我终于解决了这个问题!我尝试了很多方法,我不确定哪一个解决了它(或者它是否是一个组合),所以我将在这里列出我做的事情,最有可能的解决方案首先列出。解决方案1)确保云存储删除旧版本
云存储与任何事情都有什么关系?(我听到你问)
有一个小工具提示(
Google Cloud Platform Web UI (GCP) > App Engine > Versions > Size
),当你把鼠标悬停在上面时,它会说:(Google App Engine)灵活的环境代码从Google Cloud Storage存储并计费。
因此,基于此信息和this answer,我访问了
GCP > Cloud Storage > Browser
,并找到了我的存储桶和一堆我不知道存在的其他存储桶。事实证明,一些bucket存储缓存的云函数代码,一些存储缓存的docker图像,还有一些存储其他缓存的代码/东西(你可以通过浏览bucket来区分哪些是哪些)。所以我给所有的bucket(除了云函数bucket)添加了删除策略,如下所示:
转到
GCP > Cloud Storage > Browser
并单击Lifecycle Rules
列中的链接(针对相关存储桶)〉单击添加规则〉然后:对于SELECT ACTION,选择“Delete Object”(删除对象),然后单击“Continue
对于SELECT OBJECT,选择“新版本数”并在输入中输入1
单击创建
这将返回到表视图,您现在应该在生命周期规则列中看到该规则。
对所有相关存储桶重复此过程(相关存储桶已在前面描述)。
然后删除相关存储桶的内容。警告:某些存储桶警告您不要删除存储桶本身,只删除存储桶内容!
现在重新部署,你的最新版本现在应该得到部署,希望你永远不会有这个问题了!
解决方案2)使用部署标志
我加了这些旗子
这可能没有帮助,因为这些标志似乎是默认的,但值得添加以防万一。
请注意,仅对于标准环境(我从葡萄藤中听说),您还可以使用
--no-cache
标志,这可能会有所帮助,但对于flex,此标志导致部署失败(当我尝试时)。解决方案3)
这可能根本没有帮助,但我补充说:
到Dockerfile
提示1)
这可能是一个更有帮助/有用的调试方法,而不是修复。
访问
GCP > App Engine > Versions
这将显示您的应用程序的所有版本(每个部署1个),还将显示每个示例正在运行的版本(示例在app.yaml中配置)。
确保所有示例都运行最新版本。默认情况下应发生此操作。可能值得删除旧版本。
您可以从
gcloud app deploy
日志(在日志的开头)确定您的版本,但似乎版本是按部署顺序列出的(最新的在顶部)。提示2)
访问
GCP > App Engine > Instances
SSH进入示例。这只是一个点击几个按钮的问题(见下面的截图)。在运行SSH后:
这将使您进入运行代码的Docker容器。现在您可以浏览以确保它有您的最新代码。
wz3gfoph4#
Google可能已经更新了@IAmKale的回答中引用的documentation
请注意,如果该版本正在自动缩放服务的示例上运行,则使用
--stop-previous-version
将不起作用,并且以前的版本将继续运行,因为自动缩放服务示例始终在运行。似乎该标志只适用于手动缩放的服务。
3lxsmp7m5#
这是我另一项主要答复以外的补充答复,可选择作答。
我现在,除了我的其他答案,自动增量版本手动部署使用脚本。
我的剧本内容在下面。
基本上,脚本会在每次部署时自动递增版本。我使用的是node.js,所以脚本使用
npm version
来提升版本,但这一行可以很容易地调整到您使用的任何语言。脚本需要一个干净的git工作目录来部署。
该脚本假设当版本被碰撞时,这将导致文件更改(例如对
package.json
版本的更改)。该脚本基本上会尝试找到您的SSH密钥,如果找到,则会启动SSH代理,并使用您的SSH密钥来git提交和git推送文件更改。否则它只会执行git commit而不执行push。
然后使用--version标志进行部署…
--version="${deployVer}"
我想这可能会对某些人有所帮助,特别是因为最上面的答案谈到了很多关于在部署中使用
--version flag
的问题。对于node.js用户,如果你调用脚本
deploy.sh
,你应该添加:在您的
package.json
脚本中并使用npm run deploy
进行部署