如何使用Cloud Build从monorepo部署多个功能,但一次仅部署一个功能

时间:2020-03-04 21:36:52

标签: python google-cloud-platform google-cloud-functions gcloud google-cloud-build

我正在尝试建立一个具有Python编写的多个云函数的monorepo。我目前正在使用Cloud Build和这样的结构:

.
├── deployment
│   └── cloudbuild.yaml
├── main.py
└── requirements.txt

使用此Cloud Build YAML代码可以很好地部署:

steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    args: [
      'functions', 'deploy', '$_FUNCTION_NAME',
      '--trigger-resource', '$_TRIGGER_RESOURCE',
      '--trigger-event', '$_TRIGGER_EVENT',
      '--runtime', 'python37',
      '--memory', '1024MB',
      '--region', 'europe-west1'
    ]

现在我的意图是朝着这个结构前进:

.
├── first_function
│   ├── main.py
│   └── requirements.txt
├── second_function
│   ├── main.py
│   └── requirements.txt
└── cloudbuild.yaml

通过设置触发器来监视各个子文件夹中的更改,将函数名称作为env变量注入并部署正确的函数。这是设置的TF想法:

resource "google_cloudbuild_trigger" "first_function_trigger" {
  project = google_project.my_project.name
  name = "trigger-first-function"
  description = "Trigger for deploying first function"

  trigger_template {
    repo_name = google_sourcerepo_repository.functions.name
    branch_name = "master"
    dir = "first_function/**"
  }

  substitutions = {
    _TRIGGER_RESOURCE = google_storage_bucket.my_bucket.name
    _TRIGGER_EVENT = "google.storage.object.finalize"
    _FUNCTION_NAME = "first_function"
  }

  filename = "cloudbuild.yaml"
}

但是,这里有个陷阱:

--source命令中指定gcloud functions deploy的所有安排,都只会不​​断给我以下错误:

错误:(gcloud.functions.deploy)参数--source:提供的目录不存在

尝试这些值时会发生此错误:

1. --source=.
2. --source=./first_function
3. --source=./first_function/

从根文件夹调用gcloud functions deploy时,第三个在本地工作。我了解了在GCP中指定存储库的方法-但这是额外的数据加载操作,不是吗?源代码已经存在-这是存储库中更改的触发器。

当未定义--source时,这是我得到的错误:

错误:(gcloud.functions.deploy)OperationError:代码= 3,消息=构建失败:构建错误详细信息不可用

我知道Cloud Build是一项相当年轻的服务,并且变化非常快,但是现在有没有办法安排文件夹或设置Cloud build YAML,以便正确部署功能?我真的不想为每个单独的100行函数创建一个单独的存储库。

1 个答案:

答案 0 :(得分:2)

仅通过Cloud Functions + Cloud Build我无法重现您的问题。具有以下结构:

2020-03-05T04:30:00.000+0000 != 2020-03-05T04:30:00.000+00:00

以及以下. ├── cloudbuild.yaml ├── first_function │   ├── main.py │   └── requirements.txt └── second_function ├── main.py └── requirements.txt

cloudbuild.yaml

我能够部署这两个功能。

是否可能没有正确设置steps: - name: 'gcr.io/cloud-builders/gcloud' args: [ 'functions', 'deploy', 'first_function', '--trigger-http', '--runtime', 'python37', '--region', 'us-central1', '--source', 'first_function' ] - name: 'gcr.io/cloud-builders/gcloud' args: [ 'functions', 'deploy', 'second_function', '--trigger-http', '--runtime', 'python37', '--region', 'us-central1', '--source', 'second_function' ] 标志?