如何更优雅地等待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']
部署 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']