Дело в том, что вы определяете 2 службы App Engine, frontend
и backend
, которые будут упакованы независимо и установлены в разных экземплярах, они никогда не будут сосуществовать в одном экземпляре. Таким образом, оба должны будут включать общий пакет.
Когда вы запускаете gcloud app deploy
, папка, содержащая файл app.yaml
для этой службы, считается папкой root, а файлы и папки в дереве выигрываются. не будет развернуто, как вы упомянули.
Я понимаю, что с точки зрения разработки имеет смысл иметь общий пакет, общий для обеих служб, поскольку он позволяет избежать дублирования кода. Одним из способов управления этим является использование Cloud Build для создания конвейера сборки, который будет обрабатывать включение этого общего кода в обе службы и развертывать их по отдельности. Например, что-то вроде этого:
steps:
- name: ubuntu
id: 'copy-file'
args:
- '-c'
- |
cp ./common/package.json frontend/ && cp ./common/package.json backend/
- name: 'gcr.io/cloud-builders/gcloud'
args: ['app', 'deploy']
dir: 'frontend/'
timeout: '1600s'
waitFor: ['copy-file']
- name: 'gcr.io/cloud-builders/gcloud'
args: ['app', 'deploy']
dir: 'backend/'
timeout: '1600s'
waitFor: ['copy-file']
На первом шаге будет скопирован общий пакет в оба каталога (вам нужно обновить общий путь зависимости в вашем package.json
, так как он теперь будет в тот же каталог). Следующие 2 шага будут выполняться параллельно (оба ждут первого шага до конца sh) и развернут каждый сервис отдельно (обратите внимание на параметр dir ).
Затем вы можете развернуть свои службы, выполнив следующую команду в каталоге root:
gcloud builds submit
Обратите внимание, что при этом всегда будут развернуты обе службы.
Если вы предпочитаете иметь возможность развертывать один сервис, а не другой, вы можете определить 2 файла облачных сборок, например:
cloudbuild-frontend.yaml :
steps:
- name: ubuntu
args:
- '-c'
- |
cp ./common/package.json frontend/
- name: 'gcr.io/cloud-builders/gcloud'
args: ['app', 'deploy']
dir: 'frontend/'
timeout: '1600s'
cloudbuild-backend.yaml :
steps:
- name: ubuntu
args:
- '-c'
- |
cp ./common/package.json backend/
- name: 'gcr.io/cloud-builders/gcloud'
args: ['app', 'deploy']
dir: 'backend/'
timeout: '1600s'
В результате вы получите дерево, подобное этому:
-frontend
app.yaml
package.json
-backend
app.yaml
package.json
-common
package.json
cloudbuild-frontend.yaml
cloudbuild-backend.yaml
dispatch.yaml
После этого вы сможете развернуть одну службу или другой, запустив либо gcloud builds submit --config=cloudbuild-frontend.yaml
или gcloud builds submit --config=cloudbuild-backend.yaml