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

Fta*_*agn 7 google-cloud-functions google-cloud-build

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

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

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

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["functions", "deploy", "myfunction", "--region=europe-west1"]
timeout: "1600s"
Run Code Online (Sandbox Code Playgroud)

我只有一个分部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: myproject@appspot.gserviceaccount.com
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
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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

在此输入图像描述

以下是云函数的参数:

在此输入图像描述

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

感谢您的帮助

dio*_*les 3

当省略 --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"
Run Code Online (Sandbox Code Playgroud)

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

解释

1. Cloud Function 之前已从源存储库部署

配置云函数时,可以选择从云源存储库获取源代码。通过控制台创建函数时,系统会提示您选择此选项,但也可以使用 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 ...]
Run Code Online (Sandbox Code Playgroud)

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

但是,正如您在控制台 ( resolved to 1b67729b) 中看到的那样,Cloud Functions 不会从那里更新其代码。

2. 在这些情况下省略 gcloud 的 --source 标志会导致潜在的令人困惑的行为

当您将标志留给--sourcegcloud 时,如果该函数之前是直接从存储库部署的,则应用特定行为。来自gcloud 函数部署的文档:

如果不指定 --source 标志:

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

您正在点击第三个选项。

结论:通过 Cloud Build 部署时,避免将 Cloud Functions 直接链接到源存储库

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

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