Maven Go-offline + 分離された Docker マルチステージ イメージ ビルド
私の答えは、ローカル ビルドまたは Docker 化された環境の両方であり、Docker イメージのビルド方法の性質から分離されています。これは Maven を使用し3.6.3-jdk-8
ます。
この回答により、CI がダウンロード、コンパイル、テスト、パッケージ化に費やした時間を正確に知ることができます...
最後に、オフラインにするための Jira に関する古い質問への回答https://issues.apache.org/jira/browse/MDEP-82?focusedCommentId=16997793&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment -tabpanel#comment-16997793
pom.xml
依存関係
を更新する
maven-dependency-plugin
surefire-junit-platform
go-offline
依存関係の解決を呼び出す
mvn
スイッチを使用して任意のコマンドを呼び出す--off-line
プラグインの最新バージョンを設定する
@@ -23,6 +23,9 @@
<junit-jupiter.version>5.5.2</junit-jupiter.version>
<common-io.version>2.6</common-io.version>
<jacoco-maven-plugin.version>0.8.4</jacoco-maven-plugin.version>
+ <!-- https://issues.apache.org/jira/browse/MDEP-82 -->
+ <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
+ <surefire-junit-platform.version>2.22.2</surefire-junit-platform.version>
<maven-release-plugin.version>2.5.3</maven-release-plugin.version>
<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
<maven-surefire-report-plugin.version>2.22.2</maven-surefire-report-plugin.version>
...
...
<build>
<plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>${maven-dependency-plugin.version}</version>
+ </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
@@ -135,6 +143,11 @@
<target>${java.version}</target>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.apache.maven.surefire</groupId>
+ <artifactId>surefire-junit-platform</artifactId>
+ <version>${surefire-junit-platform.version}</version>
+ </plugin>
オフライン キャッシュを作成する
- これにより、すべての依存関係がダウンロードされます
- すべての依存関係をダウンロードするには 3 分以上
FROM maven:3.6.3-jdk-8 AS dependencies-downloaded
...
...
COPY pom.xml /usr/src/app/pom.xml
COPY settings.xml /usr/src/app/settings.xml
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml dependency:resolve-plugins dependency:go-offline
--offline でコンパイルを呼び出す
- コンパイルに同じ画像を再利用できます
- 何もダウンロードされないため、7 秒しかかかりません
FROM dependencies-downloaded AS compile
COPY app /usr/src/app
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml compile --offline
--offline でテストを呼び出す
- テスト用に同じ画像を再利用できます
- ダウンロードなしでテストケースを実行するのに18秒かかります
FROM compile AS tests
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml test --offline
--offline でパッケージを呼び出す
- 最終的な jar に同じ画像を再利用できます
- 以前の Docker イメージで実行されたテストもスキップする
- 以前よりも少なくなった
FROM tests AS package
WORKDIR /usr/src/app
RUN mvn -f pom.xml -s settings.xml package -Dmaven.test.skip=true --offline
最終的なランタイム イメージは、パッケージの Docker イメージです。
FROM JRE
COPY --from package /usr/src/app/target /bin
...
...