首页 > 解决方案 > 如何更优雅地等待 Firestore 索引部署完成

问题描述

部署 Firestore 索引的问题在于它们是长时间运行的操作。这意味着在所有索引都更新之前,部署调用已经返回(请参阅此链接)。例如,使用 Google Cloud Build 时:

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

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

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

gcloud firestore operations list

并检查是否有运行类型type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata的操作

但是,这似乎很棘手且容易出错。有谁知道更好的方法?

标签: google-cloud-firestorecontinuous-integrationdatabase-indexes

解决方案


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

Command :   gcloud firestore operations describe operation-name

为了过滤掉已完成的特定操作,您可以按照文档中的说明相应地使用过滤器:

command : gcloud firestore operations list --filter="done:true"

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

或者,您也可以在成功完成第一个云步骤后,下一个连续的云构建步骤将运行,如下例所示:-

- 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']

推荐阅读