NodeJS gcloud app deploy不会删除以前的版本

pqwbnv8z  于 2023-05-06  发布在  Node.js
关注(0)|答案(5)|浏览(148)

我正在Google App Engine上运行Node.js应用,使用以下命令部署代码:

gcloud app deploy --stop-previous-version

我想要的行为是终止运行以前版本的所有示例,但它们似乎总是存在。我是不是漏掉了什么?
我意识到他们没有收到流量,但我仍然为他们支付,他们造成一些背景遥测噪音。是否有更好的方法来运行此命令?
gcloud app instances list的输出示例:

正如您所看到的,我运行了两个不同的版本。

zu0ti5jz

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

yh2wf1be

yh2wf1be2#

据我所知,至少对于自动伸缩的标准环境,旧版本保持“服务”是正常的,尽管它们应该希望有零示例(即使您的伸缩配置指定了非零的最小值)。至少我是这么看的我认为(我希望)那些旧的“服务”示例不会导致任何费用,因为计费是每个示例。
我知道上面的大多数答案都是针对灵活环境的,但我想我会在这里为那些想知道的人提供这个答案。
(And如果Google的人能确认就太好了。)

c86crjj0

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)使用部署标志

我加了这些旗子

gcloud app deploy --quiet --promote --stop-previous-version

这可能没有帮助,因为这些标志似乎是默认的,但值得添加以防万一。
请注意,仅对于标准环境(我从葡萄藤中听说),您还可以使用--no-cache标志,这可能会有所帮助,但对于flex,此标志导致部署失败(当我尝试时)。

解决方案3)

这可能根本没有帮助,但我补充说:

COPY app.yaml .

到Dockerfile

提示1)

这可能是一个更有帮助/有用的调试方法,而不是修复。
访问GCP > App Engine > Versions
这将显示您的应用程序的所有版本(每个部署1个),还将显示每个示例正在运行的版本(示例在app.yaml中配置)。
确保所有示例都运行最新版本。默认情况下应发生此操作。可能值得删除旧版本。
您可以从gcloud app deploy日志(在日志的开头)确定您的版本,但似乎版本是按部署顺序列出的(最新的在顶部)。

提示2)

访问GCP > App Engine > Instances
SSH进入示例。这只是一个点击几个按钮的问题(见下面的截图)。在运行SSH后:

docker exec -it gaeapp /bin/bash

这将使您进入运行代码的Docker容器。现在您可以浏览以确保它有您的最新代码。

wz3gfoph

wz3gfoph4#

Google可能已经更新了@IAmKale的回答中引用的documentation
请注意,如果该版本正在自动缩放服务的示例上运行,则使用--stop-previous-version将不起作用,并且以前的版本将继续运行,因为自动缩放服务示例始终在运行。
似乎该标志只适用于手动缩放的服务。

3lxsmp7m

3lxsmp7m5#

这是我另一项主要答复以外的补充答复,可选择作答。
我现在,除了我的其他答案,自动增量版本手动部署使用脚本。
我的剧本内容在下面。
基本上,脚本会在每次部署时自动递增版本。我使用的是node.js,所以脚本使用npm version来提升版本,但这一行可以很容易地调整到您使用的任何语言。
脚本需要一个干净的git工作目录来部署。
该脚本假设当版本被碰撞时,这将导致文件更改(例如对package.json版本的更改)。
该脚本基本上会尝试找到您的SSH密钥,如果找到,则会启动SSH代理,并使用您的SSH密钥来git提交和git推送文件更改。否则它只会执行git commit而不执行push。
然后使用--version标志进行部署…--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"

在您的package.json脚本中并使用npm run deploy进行部署

相关问题