仅给出build.gradle文件

时间:2017-09-05 14:28:56

标签: java docker gradle docker-compose

是否可以仅使用build.gradle文件下载gradle依赖项?

我想要完成的是以下内容:

我有一组单元测试,我想在docker容器中执行它们(作为CI过程的一部分)。最初,我使用docker hub中的openjdk:8-jdk图像作为测试的基本图像。因此,docker compose文件包含以下内容:

version: '3.2'

services:

  unit:
    image: openjdk:8-jdk
    volumes:
      - ..:/usr/test
    working_dir: /usr/test
    command: sh -c "exec ./gradlew junitPlatformTest -Punit -p moduleA/"

整个项目安装在容器内的/usr/test目录中。容器启动时,它会对junitPlatformTest执行moduleA任务。 openjdk:8-jdk图片的问题是每次运行unit服务时都会下载gradle及其依赖项。

为了解决这个问题,我决定创建一个新图像,它已经下载了gradle和我的项目依赖项。 Dockerfile如下:

FROM openjdk:8-jdk
COPY . /usr/test
WORKDIR /usr/test
RUN apt-get -y install wget unzip
RUN wget https://services.gradle.org/distributions/gradle-4.1-bin.zip
RUN mkdir /opt/gradle
RUN unzip -d /opt/gradle gradle-4.1-bin.zip
RUN /opt/gradle/gradle-4.1/bin/gradle dependencies

build.gradle文件与Dockerfile位于同一文件夹中,因此命令COPY . /usr/test将其复制到工作目录中。

但是,执行gradle dependencies命令不会下载库。构建映像后,运行一个容器并进入它(使用docker exec),似乎~/.gradle/caches/modules-2/files-2.1/目录只包含pom文件,而不是jar。

如果gradle dependencies是正确的命令,我就不会使用。有什么建议吗?

编辑 - Gradle文件

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    jcenter()
}

ext.versions = new Properties()
file("./versions.properties").withInputStream {
    stream -> ext.versions.load(stream)
}

dependencies {
    testCompile("org.junit.jupiter:junit-jupiter-api:$versions.junitJupiterVersion")
    testCompile("org.junit.jupiter:junit-jupiter-engine:$versions.junitJupiterVersion")
    testCompile("org.junit.jupiter:junit-jupiter-params:$versions.junitJupiterVersion")
    testCompile("org.mockito:mockito-core:'$versions.mockitoCore")
    testCompile("org.junit.platform:junit-platform-launcher:1.0.0-RC3")

    compile("com.google.inject:guice:$versions.guice")
    ....
}

2 个答案:

答案 0 :(得分:2)

将以下内容添加到您的gradle文件

 task download (type: Exec) {
     configurations.testCompile.files
     commandLine 'echo', 'Downloaded all dependencies'

  }

同时更改

RUN /opt/gradle/gradle-4.1/bin/gradle dependencies

RUN /opt/gradle/gradle-4.1/bin/gradle

运行gradle命令时,这会将所有依赖项缓存到~/.gradle。它也将下载罐子而不仅仅是poms。如果你想进一步缓存,你甚至可以使用命名卷作为gradle文件夹

version: '3.2'

services:

  unit:
    image: openjdk:8-jdk
    volumes:
      - ..:/usr/test
      - gradlecache:/root/.gradle/
    working_dir: /usr/test
    command: sh -c "exec ./gradlew junitPlatformTest -Punit -p moduleA/"
volumes:
  gradlecache: {}

答案 1 :(得分:0)

你的想法是正确的,但方法是错误的。首先,无需手动下载和安装Gradle,这正是Gradle Wrapper为您所做的。其次,没有必要破解Gradle强制下载依赖 - 它没有任何意义。只需从容器内检出/克隆测试项目,然后使用./gradlew clean test运行测试。不需要本地/usr/test目录,它在CI面前苍蝇,因为它使用相对位置,因此只有在您以精确方式布置文件时才有效。

修改: 如果您不想为每个构建下载Gradle或依赖项,则可以按容量启动容器将$HOME/.m2目录映射到主机,以便下载的依赖项一旦保留在Maven本地缓存中。为避免下载Gradle,您可以使用Gradle构建自己的Docker镜像。