如何更优雅地等待Firestore索引部署完成

How to wait for completion of Firestore indexes deployment more elegantly

部署 Firestore 索引的问题在于它们 long running operations. That means that a deployment call already returns, before all indexes have been updated (see this link)。例如,当使用 Google Cloud Build 时:

- name: gcr.io/${PROJECT_ID}/firebase
  args: ['deploy', '--project=${PROJECT_ID}', '--only=firestore:indexes']

如何在 CI/CD 构建脚本中等待完成?我在迁移 Firestore 数据的构建脚本中有另一个后续步骤,但这取决于此索引更新步骤的成功补充。

一种方法是轮询完成,使用this命令

gcloud firestore operations list

检查是否有type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata运行

类型的操作

然而,这似乎很棘手且容易出错。有人知道更好的方法吗?

有一个 gcloud 命令可以检查 document 中提到的操作状态。

Command :   gcloud firestore operations describe operation-name

为了过滤掉已完成的特定操作,您可以按照 doc:

中所述相应地使用过滤器
command : gcloud firestore operations list --filter="done:true"

您可以编写一个 bash 脚本来迭代检查索引完成状态,直到完成才退出。当一个操作完成时,操作描述将包含“done”:true。请注意,workEstimated 值只是一个估计值,不能用于准确预测操作需要多长时间。此方法还必须考虑 Cloud Build timeout values,因为这些索引构建时间可能很长。

或者,您也可以在第一个云步骤成功完成后,在下一个连续的云构建步骤中使用“waitFor”条件 运行,如下例所示:-

- name: 'gcr.io/cloud-builders/go'
  args: ['install', 'mytarget']
  id: 'go-install'

- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/mytarget', '.']
  waitFor: ['go-install']