Развертывание Golang AppEngine в Google Cloud Build порождает бесконечные сборки
Я пытаюсь настроить конвейер Cloud Build для развертывания golang
приложение в App Engine, но, похоже, порождает бесконечные версии себя, а затем время ожидания.
Для начала вот моя конфигурация.
steps:
- name: "gcr.io/cloud-builders/go"
args:
- get
- "-u"
- "-d"
- "github.com/didip/tollbooth"
- "github.com/lib/pq"
- "github.com/stretchr/testify"
- "github.com/go-redis/redis"
- "cloud.google.com/go/pubsub"
dir: "/workspace"
volumes:
- name: 'go'
path: '/gopath'
env:
- "GOPATH=/gopath"
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy", "--stop-previous-version"]
dir: "/workspace"
volumes:
- name: 'go'
path: '/gopath'
env:
- "GOPATH=/gopath"
Вот соответствующий раздел app.yaml
:
service: "myservice"
runtime: custom
env: flex
При развертывании в ветке, которую я настроил для просмотра, он просто начинает сборку и завершает шаг 0. Затем начинается шаг 1, который gcloud app deploy
, который, кажется, рекурсивно порождает еще один экземпляр конвейера (см. журналы ниже). Это продолжается, пока все не закончится.
Вот начало журнала (ближе к концу вы увидите, что он рекурсивно запустил шаг 0 внутри шага 1 снова).
starting build "e5ad47ed-5332-4bc7-b4ac-618e243f05a5"
FETCHSOURCE
Fetching storage object: gs://staging.myproject-event.appspot.com/asia.gcr.io/myproject-event/appengine/myservice.20190130t095428:latest#1548842070817530
Copying gs://staging.myproject-event.appspot.com/asia.gcr.io/myproject-event/appengine/myservice.20190130t095428:latest#1548842070817530...
/ [0 files][ 0.0 B/ 10.9 KiB]
-
- [1 files][ 10.9 KiB/ 10.9 KiB]
Operation completed over 1 objects/10.9 KiB.
BUILD
Starting Step #0
Step #0: Already have image (with digest): gcr.io/cloud-builders/go
Step #0: Documentation at https://github.com/GoogleCloudPlatform/cloud-builders/blob/master/go/README.md
Step #0: Running: go get -u -d github.com/didip/tollbooth github.com/lib/pq github.com/stretchr/testify github.com/go-redis/redis cloud.google.com/go/pubsub
Finished Step #0
Starting Step #1
Step #1: Already have image (with digest): gcr.io/cloud-builders/gcloud
Step #1: Services to deploy:
Step #1:
Step #1: descriptor: [/workspace/app.yaml]
Step #1: source: [/workspace]
Step #1: target project: [myproject-event]
Step #1: target service: [myservice]
Step #1: target version: [20190130t095546]
Step #1: target url: [https://myservice-dot-myproject-event.appspot.com]
Step #1:
Step #1:
Step #1: Do you want to continue (Y/n)?
Step #1: WARNING: Unable to verify that the Appengine Flexible API is enabled for project [myproject-event]. You may not have permission to list enabled services on this project. If it is not enabled, this may cause problems in running your deployment. Please ask the project owner to ensure that the Appengine Flexible API has been enabled and that this account has permission to list enabled APIs.
Step #1: Beginning deployment of service [myservice]...
Step #1: Building and pushing image for service [myservice]
Step #1: Started cloud build [b41069a6-2ef7-4eaf-8b49-de36bc620be2].
Step #1: To see logs in the Cloud Console: https://console.cloud.google.com/gcr/builds/b41069a6-2ef7-4eaf-8b49-de36bc620be2?project=954549095871
Step #1: ----------------------------- REMOTE BUILD OUTPUT ------------------------------
Step #1: starting build "b41069a6-2ef7-4eaf-8b49-de36bc620be2"
Step #1:
Step #1: FETCHSOURCE
Step #1: Fetching storage object: gs://staging.myproject-event.appspot.com/asia.gcr.io/myproject-event/appengine/myservice.20190130t095546:latest#1548842148386512
Step #1: Copying gs://staging.myproject-event.appspot.com/asia.gcr.io/myproject-event/appengine/myservice.20190130t095546:latest#1548842148386512...
Step #1: / [0 files][ 0.0 B/ 10.9 KiB]
/ [0 files][ 10.9 KiB/ 10.9 KiB]
-
- [1 files][ 10.9 KiB/ 10.9 KiB]
Step #1: Operation completed over 1 objects/10.9 KiB.
Step #1: BUILD
Step #1: Starting Step #0
Step #1: Step #0: Already have image (with digest): gcr.io/cloud-builders/go
Step #1: Step #0: Documentation at https://github.com/GoogleCloudPlatform/cloud-builders/blob/master/go/README.md
Step #1: Step #0: Running: go get -u -d github.com/didip/tollbooth github.com/lib/pq github.com/stretchr/testify github.com/go-redis/redis cloud.google.com/go/pubsub
Step #1: Finished Step #0
Step #1: Starting Step #1
Step #1: Step #1: Already have image (with digest): gcr.io/cloud-builders/gcloud
Step #1: Step #1: Services to deploy:
Это продолжается до тех пор, пока я вручную не убью последнюю сборку:
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: Copying gs://staging.solution360-event.appspot.com/asia.gcr.io/solution360-event/appengine/authproxy.20190130t100329:latest#1548842611410114...
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: / [0 files][ 0.0 B/ 10.9 KiB]
-
- [1 files][ 10.9 KiB/ 10.9 KiB]
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: Operation completed over 1 objects/10.9 KiB.
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: BUILD
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: Starting Step #0
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: Step #0: Already have image (with digest): gcr.io/cloud-builders/go
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: Step #0: Documentation at https://github.com/GoogleCloudPlatform/cloud-builders/blob/master/go/README.md
Step #1: Step #1: Step #1: Step #1: Step #1: Step #1: Step #0: Running: go get -u -d github.com/didip/tollbooth github.com/lib/pq github.com/stretchr/testify github.com/go-redis/redis cloud.google.com/go/pubsub
Что я пробовал:
- Удаление флага "--stop-previous-version" из команды.
- монтаж
gopath
в другом томе, в случае, если это заставило gcloud рекурсивно спуститься в него. - Выполнение только шага 1, тот же результат.
1 ответ
Так что это оказалось проблемой с тем, как Google Cloud Build
обрабатывает столкновение с файлом конфигурации cloudbuild.yaml
, Он должен порождать новую сборку каждый раз, когда видит ее, независимо от того, была ли она уже видна.
В моем случае, так как проект был крошечным, cloudbuild.yaml
и мой исходный код был в основе проекта. Это приводит к следующей ситуации:
- Начальный
git push
запускает сборку, которая читаетcloudbuild.yaml
, - Сборка видит, что есть
cloudbuild.yaml
в текущем рабочем каталоге и создает новую сборку для этого.
Я полагаю, что это полезно, так как вы можете иметь несколько конфигураций сборки для разных вещей в ваших проектах, которые будут собраны как и когда встретятся.
Перемещение источника на src/
(от облачного билда) исправил проблему.
tl;dr
НЕ СДЕЛАТЬ СВОЮ cloudbuild.yaml
В РАБОЧЕМ СПРАВОЧНИКЕ.
У вас нет прав для развертывания приложения и включения Appenginge Flexible API.
В журнале есть предупреждение:
WARNING: Unable to verify that the Appengine Flexible API
is enabled for project [project-name].
You may not have permission to list enabled services on this project.
If it is not enabled, this may cause problems in running your deployment.
Please ask the project owner to ensure that the Appengine Flexible API
has been enabled and that this account has permission to list enabled APIs.
Действия по оптимизации развертывания гибких приложений AppEngine:
- Как владелец проекта: включите Appengine Flexible API + для первого развертывания приложения и:
- Предоставьте разрешения на развертывание приложения AppEngine для пользователя, которого вы используете для выполнения этих задач.
Я не смог воссоздать бесконечные сборки, но пара вещей
Для пользовательских сред выполнения требуется Dockerfile. Вы пытались запустить свой сервис во время выполнения Go?
Есть ли конкретная причина, по которой вы используете тома вместо простой установки корня проекта в env?