如何在Google Cloud build上加速java maven构建(100个依赖项)
我正在使用它构建一个java项目,它有100个依赖项。默认情况下,本地maven存储库缓存将为空,并且每次有构建时,它将下载所有依赖项 谷歌文档仅建议“使用谷歌云存储缓存目录”,但同步7000个文件需要很长时间(这意味着构建速度较慢) 只有一个依赖项是5个文件如何在Google Cloud build上加速java maven构建(100个依赖项),java,maven,google-cloud-build,Java,Maven,Google Cloud Build,我正在使用它构建一个java项目,它有100个依赖项。默认情况下,本地maven存储库缓存将为空,并且每次有构建时,它将下载所有依赖项 谷歌文档仅建议“使用谷歌云存储缓存目录”,但同步7000个文件需要很长时间(这意味着构建速度较慢) 只有一个依赖项是5个文件 repository/org/mockito repository/org/mockito/mockito-core repository/org/mockito/mockito-core/2.15.0 repository/org/mo
repository/org/mockito
repository/org/mockito/mockito-core
repository/org/mockito/mockito-core/2.15.0
repository/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.jar
repository/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.jar.sha1
repository/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.pom
repository/org/mockito/mockito-core/2.15.0/mockito-core-2.15.0.pom.sha1
repository/org/mockito/mockito-core/2.15.0/_remote.repositories
cloudbuild.yaml文件示例
steps:
- name: gcr.io/cloud-builders/gsutil
args: ['rsync', '-r', 'gs://my-mavencache-bucket/repository', '.']
- name: 'gcr.io/$PROJECT_ID/mvn'
args: ['package']
...
我想将gs://my mavencache bucket作为一个卷装载在上,但我看不到这样做的选项经过大量实验后,这个解决方案似乎运行得很好。这个maven插件提供了一种从google浏览器读取和发布maven工件的机制 数据桶 Maven pom.xml包含
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<repositories>
<repository>
<id>my-repo-bucket-release</id>
<url>gs://bucket-ave-build-artifact/external</url>
<releases>
<enabled>true</enabled>
<!-- TODO figure out why checksums do not match when artifact pulled from GCP -->
<checksumPolicy>ignore</checksumPolicy>
</releases>
</repository>
</repositories>
<distributionManagement>
<snapshotRepository>
<id>my-repo-bucket-snapshot</id>
<url>gs://my-build-artifact-bucket/snapshot</url>
</snapshotRepository>
<repository>
<id>my-repo-bucket-release</id>
<url>gs://my-build-artifact-bucket/release</url>
</repository>
</distributionManagement>
...
<extensions>
<extension>
<groupId>com.gkatzioura.maven.cloud</groupId>
<artifactId>google-storage-wagon</artifactId>
<!-- version 1.8 seems to produce exception, ticket logged -->
<version>1.7</version>
</extension>
</extensions>
</build>
这将:
key.json
文件,并且您有service\u帐户的名称以及一个存储桶bucket\u路径
,这就是基本Dockerfile:
FROM maven:3.6.1-jdk-12
ENV MAVEN_PATH="/root/.m2" \
BUCKET_PATH="gs://mugen-cache/maven"
COPY key.json /key.json
# install gcloud sdk
RUN mkdir -p $MAVEN_PATH && \
yum install -y curl which && \
curl https://sdk.cloud.google.com | bash > /dev/null
ENV PATH="${PATH}:/root/google-cloud-sdk/bin" \
SERVICE_ACCOUNT="mugen-build@mugen.iam.gserviceaccount.com"
# authenticate service account and install crcmod - https://cloud.google.com/storage/docs/gsutil/addlhelp/CRC32CandInstallingcrcmod
RUN gcloud auth activate-service-account $SERVICE_ACCOUNT --key-file=/key.json && \
yum install -y gcc python-devel python-setuptools redhat-rpm-config
RUN curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" && \
python get-pip.py && \
pip uninstall crcmod && \
pip install --no-cache-dir -U crcmod
RUN echo "Syncing m2 in..." && \
gsutil -q -m rsync -r $BUCKET_PATH $MAVEN_PATH && \
echo "Downloaded $(find $MAVEN_BUCKET -type f -name "*.pom" | wc -l) packages"
# ... build and stuff
RUN echo "Syncing m2 out..." && \
gsutil -q -m rsync -r $MAVEN_PATH $BUCKET_PATH
这里的一些说明是针对基本映像(基于REHL的Oracle Linux服务器)的,但是您应该能够提取重要的细节,以便在您的案例中使用它。您有该项目的示例吗?此外,您是否正在使用最新版本的Maven和所有插件?等等。你能用一个慢度指标更新你的问题吗?您能否提供构建所需时间的度量?如果你在PC上本地编译,没有任何东西下载到缓存中,需要多长时间?我已经使用maven很多年了,问题不是maven的版本或某些配置,这与谷歌云构建的工作方式有关——构建是一组步骤,其中每个步骤相当于docker运行命令,/workspace是这些步骤共享的公共目录。考虑到Google Cloud Build是一个推荐的构建标准,并且我正在使用一个java monolith应用程序(相当主流的用例),我本希望现在就找到一个例子,但幸运的是,疯狂的Google cloudbuild没有满足这一最基本的需求。在我们的例子中,使构建需要15分钟而不是2分钟。Jenkins、Bitbucket等负责缓存maven存储库。另一种机制是构建一个自定义docker映像,其中包含.m2缓存中的大多数maven工件。这会导致定制构建步骤的启动时间稍慢,因为需要从中提取较大的映像。
FROM maven:3.6.1-jdk-12
ENV MAVEN_PATH="/root/.m2" \
BUCKET_PATH="gs://mugen-cache/maven"
COPY key.json /key.json
# install gcloud sdk
RUN mkdir -p $MAVEN_PATH && \
yum install -y curl which && \
curl https://sdk.cloud.google.com | bash > /dev/null
ENV PATH="${PATH}:/root/google-cloud-sdk/bin" \
SERVICE_ACCOUNT="mugen-build@mugen.iam.gserviceaccount.com"
# authenticate service account and install crcmod - https://cloud.google.com/storage/docs/gsutil/addlhelp/CRC32CandInstallingcrcmod
RUN gcloud auth activate-service-account $SERVICE_ACCOUNT --key-file=/key.json && \
yum install -y gcc python-devel python-setuptools redhat-rpm-config
RUN curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" && \
python get-pip.py && \
pip uninstall crcmod && \
pip install --no-cache-dir -U crcmod
RUN echo "Syncing m2 in..." && \
gsutil -q -m rsync -r $BUCKET_PATH $MAVEN_PATH && \
echo "Downloaded $(find $MAVEN_BUCKET -type f -name "*.pom" | wc -l) packages"
# ... build and stuff
RUN echo "Syncing m2 out..." && \
gsutil -q -m rsync -r $MAVEN_PATH $BUCKET_PATH