Google Cloud 构建始终使用之前的提交来部署我的云功能

问题描述 投票:0回答:2

我的自动化云功能部署有问题

我有一个云函数存储在 Google Cloud 存储库中

Git 代码包含一个包含以下内容的 cloudbuild.yaml 文件:

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["functions", "deploy", "myfunction", "--region=europe-west1"]
timeout: "1600s"

我只有一个分部Master。

当我推送我的提交时,cloudbuild 会触发并部署云功能

问题是它总是部署前一个提交,而不是最后一个

例如: 2:23:我将源代码推送到 Google 源存储库

这是结果:

2:23:33,cloudbuild触发并成功部署云功能

这是Cloudbuild的日志:

starting build "e3a0e735-50fc-4315-bafd-03128156d69f"

FETCHSOURCE
Initialized empty Git repository in /workspace/.git/
From https://source.developers.google.com/p/myproject/r/myrepo
 * branch            1b67729b8498c35fc19a45b14b8d674635300594 -> FETCH_HEAD
HEAD is now at 1b67729 PrayingforCommit
BUILD
Already have image (with digest): gcr.io/cloud-builders/gcloud
Deploying function (may take a while - up to 2 minutes)...
...............................................done.
availableMemoryMb: 256
entryPoint: process_gcs
eventTrigger:
  eventType: google.storage.object.finalize
  failurePolicy: {}
  resource: projects/_/buckets/mybucket
  service: storage.googleapis.com
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/myproject/locations/europe-west1/functions/myfunction
runtime: python37
serviceAccountEmail: [email protected]
sourceRepository:
  deployedUrl: https://source.developers.google.com/projects/myproject/repos/myrepo/revisions/2ed14c3225e7fcc089f2bc6a0ae29c7564ec12b9/paths/
  url: https://source.developers.google.com/projects/myproject/repos/myrepo/moveable-aliases/master/paths/
status: ACTIVE
timeout: 60s
updateTime: '2020-04-15T00:24:55.184Z'
versionId: '2'
PUSH
DONE

如您所见,触发的提交是 1b67729,但 DeployedUrl 行显示 2ed14c3,这是之前的提交

操作于2:24:55结束,我在我的云函数源选项卡中看到相同的时间

如果我只需单击编辑按钮,然后单击部署按钮,手动强制云功能重建,它就会部署正确的提交(1b67729)

以下是云函数的参数:

我的cloudbuild错误在哪里,以及如何始终部署最后一次提交???

感谢您的帮助

google-cloud-functions google-cloud-build
2个回答
3
投票

我也遇到了同样的问题(尽管我使用的是 GitHub 镜像而不是本机云源存储库)。

当省略 --source 标志时,Cloud Functions 不会检查源存储库的更新

您的函数之前是直接从源存储库部署的,并且您没有将

--source
标志传递给 gcloud。在这种情况下,gcloud 会忽略本地目录中的代码。

最简单的修复方法是在 cloudbuild.yaml 中显式指定源:

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["functions", "deploy", "myfunction", "--region=europe-west1", "--source=."]
timeout: "1600s"

如果该函数从未配置为直接从存储库获取其源代码,则您不会点击此按钮。

您的云功能之前已从源存储库部署

配置云函数时,可以选择从云源存储库获取源代码。通过控制台创建函数时,系统会提示您将此选项作为一个选项,但也可以使用 gcloud:

gcloud functions deploy NAME \
    --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/master/paths/SOURCE \
    [... other gcloud options ...]

这是您可以在构建输出中看到的“sourceRepository”设置。

但是,正如您在控制台中看到的 (

resolved to 1b67729b
) Cloud Functions 并未从那里更新其代码。

省略 gcloud 的 --source 标志会导致潜在的令人困惑的行为

当您向 gcloud 省略

--source
标志时,如果该函数之前是直接从存储库部署的,则适用特定行为。来自 gcloud 函数部署的文档:

如果您不指定 --source 标志:

  • 新功能部署将使用当前目录。
  • 如果该函数之前是使用本地文件系统路径部署的,则该函数的源代码将使用 当前目录。
  • 如果该函数之前是使用 Google Cloud Storage 位置或源存储库部署的,则该函数的源 代码不会更新。

您正在点击第三个选项。

通过 Cloud Build 部署时,最好不要将 Cloud Functions 直接链接到源存储库

Cloud Build 配置为在包含源代码副本的目录中运行 gcloud。因此,您可以直接从本地文件系统进行部署 - 这会将函数打包在 zip 文件中,将其上传到 Cloud Storage,并告诉 Cloud Functions 获取它。

如果您告诉 Cloud Functions 从存储库中获取其代码,则会对存储库进行第二次签出,并从那里创建一个 zip 文件,这会稍微慢一些(如果分支已更新,则可能容易出现竞争情况)背景)。


0
投票

在我的情况下,存储库没有同步 - 在构建日志中,它一直显示 HEAD 来自几周前的构建

转到:https://source.cloud.google.com/重新同步并更新我的分支

© www.soinside.com 2019 - 2024. All rights reserved.