Как развернуть проект весенней загрузки в Google App Engine с помощью Google Cloud Build?

Я создаю свое приложение для весенней загрузки, используя maven и облачную сборку Google, но каким-то образом я получаю разные результаты развертывания, независимо от того, запускаю ли я локально с помощью mvn appengine:run или развертываю с помощью Cloud Build.

Если я запускаю локально с помощью mvn appengine:run, я могу получить доступ к своему контроллеру, как и ожидалось. Используя Cloud Build, я получаю 404 ошибку.

Мой cloudbuild.yaml выглядит следующим образом:

steps:
- name: 'gcr.io/cloud-builders/mvn'
  args: ['package']
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy', 'target/myapp/WEB-INF/appengine-web.xml']

Как бы вы порекомендовали настроить облачную сборку для создания и развертывания приложения с весенней загрузкой на движке приложений Google?


После дополнительных копаний проблема, похоже, связана с какой-то возвращенной ошибкой:

javax.servlet.ServletContext log: 2 Spring WebApplicationInitializers detected on classpath

Я не получаю это сообщение в трассировке стека при развертывании с локального компьютера с использованием mvn appengine:deploy

У меня все еще остается вопрос: как мне создать cloudbuild.yaml, который может вызывать mvn appengine:deploy?


person simon    schedule 03.08.2018    source источник
comment
appengine: развернуть. См. github.com/GoogleCloudPlatform / начало работы-java / дерево / мастер /   -  person Anton Novopashin    schedule 04.08.2018
comment
@Anton appengine: развертывание отлично работает с моей локальной машины, но не работает с облачной сборкой. Образ gcr.io/cloud-builders/mvn не содержит инструментов gcloud, от которых зависит appengine: deploy, поэтому он не работает, и я вынужден определить второй шаг в сборке для развертывания.   -  person simon    schedule 04.08.2018
comment
Вы следуете какому-либо конкретному руководству или руководству? Например, есть это руководство сообщества. Не могли бы вы проверить, выдает ли он также ошибку?   -  person A.Queue    schedule 07.08.2018
comment
Я нашел список поддерживаемых построителей, и args: ['install'] используется там с maven и в этом примере до ['package']. Вы уже пробовали?   -  person A.Queue    schedule 07.08.2018
comment
@ A.Queue Мне удалось заставить все работать, хотя в конечном итоге мне пришлось создать свой собственный образ докера для построителя, чтобы добиться этого. Образ содержит gcloud openjdk8 и maven. Я выложу это ниже.   -  person simon    schedule 07.08.2018
comment
Я столкнулся с той же проблемой и заметил, что при использовании Cloud Build каталог классов отсутствует в развертывании и заменен файлом _ah_webinf_classes-0000.jar, содержимое которого я не могу проверить, все ли мои классы приложения включены.   -  person Rodrigo Ribeiro    schedule 10.03.2019


Ответы (1)


Чтобы создать проект весенней загрузки и развернуть его в Google Appengine с помощью Google Cloud Build. В итоге мне пришлось сначала создать образ «построителя», используя изображение ниже, и ссылаться на него при выполнении реальных сборок приложения.

Dockerfile

FROM debian:stretch
#
# Google Cloud SDK installation
# https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu
RUN apt-get update -y && \
  apt-get install \
    apt-utils \
    dialog \
    gnupg \
    lsb-release \
    curl -y && \ 
  export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
  echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
  curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
  apt-get update -y && \
  apt-get install google-cloud-sdk -y
# Install all available components
RUN apt-get install google-cloud-sdk \
  google-cloud-sdk \
  google-cloud-sdk-app-engine-go \
  google-cloud-sdk-app-engine-java \
  google-cloud-sdk-app-engine-python \
  google-cloud-sdk-app-engine-python-extras \
  google-cloud-sdk-bigtable-emulator \
  google-cloud-sdk-cbt \
  google-cloud-sdk-datastore-emulator \
  google-cloud-sdk-cloud-build-local \
  google-cloud-sdk-datalab \
  kubectl \
  google-cloud-sdk-pubsub-emulator -y
#
# OpenJDK installation
# https://linuxhint.com/install-openjdk-8-on-debian-9-stretch/
RUN apt-get install openjdk-8-jdk -y

#
# MAVEN installation
# https://github.com/carlossg/docker-maven/blob/f581ea002e5d067deb6213c00a4d217297cad469/jdk-8/Dockerfile
ARG MAVEN_VERSION=3.5.4
ARG USER_HOME_DIR="/root"
ARG SHA=ce50b1c91364cb77efe3776f756a6d92b76d9038b0a0782f7d53acf1e997a14d
ARG BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries

RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
  && curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
  && echo "${SHA}  /tmp/apache-maven.tar.gz" | sha256sum -c - \
  && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \
  && rm -f /tmp/apache-maven.tar.gz \
  && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"

WORKDIR /workspace

cloudbuild.yaml

# In this directory, run the following command to build this builder.
# $ gcloud builds submit . --config=cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '--tag=gcr.io/$PROJECT_ID/gcloud-maven', '.']
# Simple sanity check: invoke java to confirm that it was installed correctly.
- name: 'gcr.io/$PROJECT_ID/gcloud-maven'
  args: ['java', '-version']
# Simple sanity check: invoke gcloud to confirm that it was installed correctly.
- name: 'gcr.io/$PROJECT_ID/gcloud-maven'
  args: ['gcloud', 'projects', 'list']
# Simple sanity check: invoke maven to confirm that it was installed correctly.
- name: 'gcr.io/$PROJECT_ID/gcloud-maven'
  args: ['mvn', '--version']

images: ['gcr.io/$PROJECT_ID/gcloud-maven']

timeout: 1200s

cloudbuild.yaml моего проекта весенней загрузки теперь ссылается на этот образ:

steps:
- name: 'gcr.io/$PROJECT_ID/gcloud-maven'
  args: ['mvn', 'appengine:deploy']

Я постараюсь разместить этот образ докера на dockerhub и github, чтобы другие могли его найти. Я также буду признателен людям, более знакомым с docker и linux, за помощь в улучшении этого образа и уменьшении его размера. (Например, используйте Alpine вместо Debian или Debian Stretch Slim). А пока я надеюсь, что это поможет другим, как я.

person simon    schedule 07.08.2018
comment
Для заинтересованных, насколько я могу судить, ошибка javax.servlet.ServletContext log: 2 Spring WebApplicationInitializers detected on classpath на самом деле не является проблемой. Это сообщение отображается каждый раз, когда запускается новый экземпляр appengine и запускается приложение весенней загрузки, и первый вызов приложения приведет к ошибке 404. Однако последующие вызовы будут успешными. - person simon; 07.08.2018
comment
Вы можете найти проект для этого образа Docker по адресу: github.com/strudeau/mvn-gcloud-builder - person simon; 11.08.2018