Ich versuche, maven alle Abhängigkeiten herunterzuladen (kompilieren, testen, plugins usw.), damit ich vermeiden kann, dass unsere dockerisierten Builds unnötigen Zeitaufwand beim wiederholten Herunterladen von ihnen verschwenden.
Wir haben unseren maven build dockerisiert, so dass wir ihn von unseren jenkins ausführen können, ohne viele Build-spezifische Abhängigkeiten auf der jenkins-Maschine installiert zu haben (Java, redis, maven dependencies, etc.). Unser Build basiert auf inkrementellen Docker-Builds, die nur Schritte ausführen, die tatsächlich erneut ausgeführt werden müssen.
Unser Haupt-Build ist eine Docker-Datei, die mehrere Schritte hat, um jdk, maven usw. zu installieren. Dann macht es ein
COPY ./pom.xml /opt/inbot-api/pom.xml
RUN mvn dependency:copy-dependencies clean
Dies wird Abhängigkeiten zu dem lokalen Maven-Repository herunterladen und dann das Zielverzeichnis bereinigen.
Dann kopieren wir den Quellbaum in das Bild und führen den vollständigen Build aus.
COPY ./src /opt/inbot-api/src
RUN mvn -e clean install
Die allgemeine Idee ist, dass docker auf einer sauberen Maschine alle RUN-Schritte ausführt, aber bei inkrementellen Builds nur Dinge erneut ausführt, die erneut ausgeführt werden müssen. Nach jedem Ausführungsschritt speichert es ein Zwischenbild. Wenn sich die Pom-Datei also nicht ändert, müssen Sie den Schritt zum Abrufen von Abhängigkeiten nicht erneut ausführen, da dies genau das gleiche Ergebnis liefert. Stattdessen lädt es das zwischengespeicherte Zwischenbild mit allen bereits heruntergeladenen Abhängigkeiten. Genau das wollen wir.
Es gibt viel mehr zu unserer DockerFile, das hier nicht so relevant ist, aber letztendlich erzeugt es eine Docker-Datei mit unseren kompilierten Artefakten, einer nginx-Konfiguration und all unseren Laufzeitabhängigkeiten, die wir in ECS bereitstellen können.
Das funktioniert fast, außer dass mvn clean install
immer noch zusätzliche Plugin-Abhängigkeiten auf jedem Build herunterlädt. Dies sind also Abhängigkeiten, die der Kopierabhängigkeitsschritt nicht abdeckt.
Meine Frage, wie bekomme ich RUN mvn dependency:copy-dependencies clean
, um alle Abhängigkeiten einschließlich der Pluginabhängigkeiten herunterzuladen. Ich habe gesehen, dass Leute tatsächlich ein mvn verify clean
anstelle von mvn dependency:copy-dependencies clean
machen, aber das ist in unserem Fall ziemlich langsam. Ich habe mich gefragt, ob es einen besseren Weg dafür gibt.
Ich würde mich über Feedback freuen, wie ich das verbessern kann.
Aktualisieren
Ich mache jetzt ein
RUN mvn -B -T 4 dependency:copy-dependencies dependency:resolve-plugins dependency:go-offline clean
Und es lädt immer noch mehr Sachen mit dem mvn clean install
herunter. A mvn -o clean install
schlägt immer noch fehl, trotz dependency:go-offline
. So, es scheint, dass dieses Plugin kaputt ist.
Für das Plugin würde ich vorschlagen, mvn dependency:resolve-plugins
Siehe die Dokumentation: Ссылка