如何使用Google Cloud Build将Spring Boot项目部署到Google App Engine?

3

我正在使用Maven和Google Cloud Build构建我的Spring Boot应用程序,但是无论我是在本地使用 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应用引擎上构建和部署Spring Boot应用程序?


经过进一步挖掘,问题似乎与某种错误返回有关:

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

当使用 mvn appengine:deploy 从本地机器部署时,我在堆栈跟踪中没有收到此消息。

我的问题仍然存在,我应该如何创建一个能够调用 mvn appengine:deploycloudbuild.yaml 文件?


appengine:deploy。请参见https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/appengine-standard-java8/springboot-appengine-standard。 - Anton N
@Anton,从我的本地机器上使用appengine:deploy非常好用,但是在cloud build中无法工作。gcr.io/cloud-builders/mvn映像不包含appengine:deploy依赖的gcloud工具,因此它无法正常工作,我被迫在构建中定义第二个“step”来进行部署。 - simon
1
你是在遵循某个特定的指南或教程吗?例如,有这个社区指南。你能否检查一下它是否也给出了错误提示? - A.Queue
1
我找到了一个支持的构建器列表,并且在那里使用了args:['install']与maven一起使用,在这个示例中在['package']之前。你已经尝试过了吗? - A.Queue
@A.Queue 我设法让事情正常运转了,尽管最终我不得不构建自己的构建器Docker镜像才能实现它。该镜像包含gcloud、openjdk8和maven。我将在下面发布它。 - simon
我遇到了同样的问题,并注意到在使用Cloud Build时,部署中缺少classes目录,而是被一个_ah_webinf_classes-0000.jar所替代,我无法检查其中是否包含所有我的应用程序类。 - Rodrigo Ribeiro
1个回答

4
为了构建一个Spring Boot项目并将其部署到Google Cloud Build的Google App Engine上,我最终需要使用以下镜像构建“构建器”镜像,并在执行实际应用程序构建时引用该镜像。 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

我的Spring Boot项目的cloudbuild.yaml文件现在引用了这个镜像:
steps:
- name: 'gcr.io/$PROJECT_ID/gcloud-maven'
  args: ['mvn', 'appengine:deploy']

我将尝试将此Docker镜像放置在Dockerhub和Github上供其他人查找。我也会感激那些更熟悉Docker和Linux的人帮助改进此镜像,以减少其大小(例如,使用Alpine而不是Debian或Debian Stretch Slim)。同时,我希望这可以帮助像我这样的其他人。


对于那些感兴趣的人,错误javax.servlet.ServletContext log: 2 Spring WebApplicationInitializers detected on classpath实际上并不是问题,据我所知。每次启动新的appengine实例并启动spring boot应用程序时,都会显示此消息,并且对应用程序的第一次调用将导致404错误。但是随后的调用将成功。 - simon
您可以在以下网址找到此Docker镜像的项目:https://github.com/strudeau/mvn-gcloud-builder - simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接