Как развернуть несколько функций из monorepo с помощью Cloud Build, но только по одной за раз - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь настроить монорепо с несколькими облачными функциями, написанными на Python. В настоящее время я использую Cloud Build и структуру, подобную этой:

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

, которая с помощью этого кода YAML Cloud Build разворачивается хорошо:

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 вызывается из папки root. Я читал о подходе указания хранилища в GCP - но это дополнительная операция загрузки данных, нет? Исходный код уже там - это триггер для изменений в хранилище.

Когда не определено --source, я получаю эту ошибку:

ОШИБКА: ( gcloud.functions.deploy) OperationError: code = 3, message = Сборка не удалась: подробности ошибки сборки недоступны

Я знаю, что Cloud Build - довольно молодая служба, которая меняется очень быстро, но есть способ упорядочить папки или настроить YAML для облачной сборки, чтобы функции были развернуты правильно? Я действительно не хочу создавать отдельный репозиторий для каждой функции из 100 строк.

1 Ответ

1 голос
/ 05 марта 2020

Мне не удалось воспроизвести вашу проблему с помощью только Cloud Functions + Cloud Build. Со следующей структурой:

.
├── 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'
    ]

Мне удалось развернуть обе функции.

Возможно ли source флаг установлен неправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...