Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Google Cloud build上加速java maven构建(100个依赖项)_Java_Maven_Google Cloud Build - Fatal编程技术网

如何在Google Cloud build上加速java maven构建(100个依赖项)

如何在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

我正在使用它构建一个java项目,它有100个依赖项。默认情况下,本地maven存储库缓存将为空,并且每次有构建时,它将下载所有依赖项

谷歌文档仅建议“使用谷歌云存储缓存目录”,但同步7000个文件需要很长时间(这意味着构建速度较慢)

只有一个依赖项是5个文件

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>
这将:

  • maven将工件发布到数据桶 gs://my build artifact bucket/release
  • 下载外部依赖项 来自gs://my build artifact bucket/external(如果它们存在于此目录中)
  • 我发现这个包非常好,但是缺少身份验证和同步时间

    我自己实现了它,如下所示。有关服务帐户的更多信息,请参阅以下答案:

    因此,假设您手头有服务帐户
    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