2017-09-05 50 views
2

是否有可能只使用build.gradle文件下載gradle依賴關係?下載依賴只有build.gradle文件

我試圖做到的是以下幾點:

我有一組的單元測試,我想執行它們(作爲CI過程的一部分)碼頭工人,容器內。最初,我使用Docker Hub的openjdk:8-jdk圖像作爲我的測試的基礎映像。因此,搬運工撰寫文件包含以下內容:

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目錄。當容器啓動時,它將對moduleA執行junitPlatformTest任務。 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是正確的命令,我不會使用它。有什麼建議麼?

編輯 - 搖籃文件

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") 
    .... 
} 
+0

你能提供你的gradle文件嗎? – yamenk

+0

請在你的問題中分享gradle文件 –

+0

@yamenk,Tarun Lalwani添加了gradle文件 – Schaliasos

回答

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: {} 
+0

您的解決方案奏效。謝謝 :)。 – Schaliasos

0

你的想法是正確的,但這種方法是錯誤的。首先,不需要手動下載和安裝Gradle,這正是Gradle Wrapper爲您所做的。其次,不需要破解Gradle來強制下載依賴關係 - 它沒有任何意義。只需從容器中檢出/克隆測試項目,然後使用./gradlew clean test運行測試。沒有必要使用當地的/usr/test目錄,因爲它使用相對位置,因此它只在您以精確的方式佈置文件時才起作用。

編輯: 如果你不想下載搖籃或依賴於每個生成,可以通過卷映射$HOME/.m2目錄到主機啓動容器,以便下載一次依賴留在本地Maven緩存。爲避免下載Gradle,您可以使用Gradle構建自己的Docker鏡像。

+0

如果我理解他的話,他不想爲每個新的容器安裝下載所有東西(包裝和依賴)。 –

+0

你不想複製到'$ HOME/.m2'中,因爲這會掩蓋壞版本庫或本地緩存jar的問題。其他用戶可能無法以這種方式重複構建。它也會相對較慢(它需要重新校驗每個構建,並且會被使用maven緩存的其他項目更新)。 – jkinkead

+0

@jkinkead沒有人對複製'$ HOME/.m2'表示任何事情,請再次閱讀我的回覆 –