在 Cloud Build 步骤中执行 BigQuery 查询

Posted

技术标签:

【中文标题】在 Cloud Build 步骤中执行 BigQuery 查询【英文标题】:Execute a BigQuery query in Cloud Build step 【发布时间】:2019-03-26 03:04:29 【问题描述】:

我将 Cloud Build 与 gcloud 构建器一起使用。我将entrypoint 覆盖为bq,这样我就可以在构建步骤中运行一些BigQuery SQL。以前,我将 SQL 直接嵌入到 Cloud Build 的 YAML 配置中。这工作正常:

steps:
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bq'
  args: ['query', '--use_legacy_sql=false', 'SELECT 1']

现在我想将 SQL 从 YAML 中重构到一个文件中。根据here,您可以cat 文件或将其通过管道传送到bq。这在命令行上运行没有任何问题。

但是,我无法让它与 Cloud Build 一起使用。我尝试了很多不同的组合,以及转义字符等,但无论我尝试什么,shell 都不会评估/执行 cat my_query.sl 反引号,而是认为它是查询本身:

工作正常:

在 Cloud Build 中构建它不起作用:

steps:
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bq'
  args: ['query', '--use_legacy_sql=false', '`cat my_query.sql`']

我也尝试使用管道而不是使用cat,但我得到了同样的错误。

我必须在这里遗漏一些明显的东西,但我看不到它。我可以构建一个自定义 docker 映像,并将所有内容包装在一个 shell 脚本中,但如果可能的话,我宁愿不必这样做。

如何在构建步骤中使用 Cloud Build 和 shell 评估?

【问题讨论】:

【参考方案1】:

您可以创建自定义 Bash 脚本,例如:

#!/bin/bash
if [ $# -eq 0 ]; then
  echo "No arguments supplied"
fi
bq query --use_legacy_sql=false < $1

将此命名为run_query.sh,然后将您的步骤定义为:

steps:
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bash'
  args: ['run_query.sh', 'my_query.sql']

免责声明:这是基于阅读文档,但我并没有真正使用过 Cloud Build。

【讨论】:

感谢您的帮助艾略特! Yarp,就像我在问题中提到的那样,我希望我不必进入 shell 脚本来解决这个问题。但是,这似乎是目前唯一的方法,因为我无法让它直接在 Cloud Build 步骤本身中工作。【参考方案2】:

我已经这样做了:

- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  dir: 'my/directory'
  args: ['-c', 'bq --project_id=my-project-name query --use_legacy_sql=false < ./my_query.sql']

这适用于gcloud builds submit ...,如果您愿意,可以删除一个文件。

【讨论】:

以上是关于在 Cloud Build 步骤中执行 BigQuery 查询的主要内容,如果未能解决你的问题,请参考以下文章

如果 CloudBuild 失败,则在 Cloud Build 中使用 2 个 Dockerfile 来重用中间步骤映像

是否可以从 Cloud Build 步骤启动 PubSub 模拟器

如何通过 Cloud Build 访问 GSM 机密并传递给 Cloud Function

带有 python 入口点的 Google Cloud Build gsutil

Build 步骤的执行策略

Flutter build 给出 .pub-cache cloud firestore 错误